diff --git a/.algokit.toml b/.algokit.toml index f592ea60..9d765eb1 100644 --- a/.algokit.toml +++ b/.algokit.toml @@ -30,7 +30,7 @@ build = { commands = [ 'poetry run python -m smart_contracts build', ], description = 'Build all smart contracts in the project' } test = { commands = [ - 'poetry run pytest', + 'poetry run pytest -m "not showcase"', ], description = 'Run smart contract tests' } audit = { commands = [ 'poetry run pip-audit', @@ -48,5 +48,6 @@ audit-teal = { commands = [ # Commands intented for CI only, prefixed with `ci-` by convention ci-teal-diff = { commands = [ 'git add -N ./smart_contracts/artifacts', - 'git diff --exit-code --minimal ./smart_contracts/artifacts', -], description = 'Check TEAL files for differences' } + 'git add -N ./src/d_asa/artifacts', + 'git diff --exit-code --minimal ./smart_contracts/artifacts ./src/d_asa/artifacts', +], description = 'Check generated artifacts for differences' } diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..3706c5e7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +.git +.github +.idea +.mypy_cache +.pytest_cache +.ruff_cache +.vscode +__pycache__ +book +docs +tests +.env.localnet +.env.testnet diff --git a/.github/actions/docs-ci/action.yaml b/.github/actions/docs-ci/action.yaml index 40d48544..6711ee0c 100644 --- a/.github/actions/docs-ci/action.yaml +++ b/.github/actions/docs-ci/action.yaml @@ -8,6 +8,12 @@ runs: with: mdbook-version: '0.5.2' + - name: Install mdbook-mermaid + shell: bash + run: | + cargo install mdbook-mermaid --version 0.17.0 --locked + mdbook-mermaid install . + - name: Test docs shell: bash run: mdbook test diff --git a/.github/workflows/d-asa-ci.yaml b/.github/workflows/d-asa-ci.yaml index 3e150150..aeb3e34b 100644 --- a/.github/workflows/d-asa-ci.yaml +++ b/.github/workflows/d-asa-ci.yaml @@ -39,20 +39,10 @@ jobs: - name: Run deployer against LocalNet run: algokit project deploy localnet - test: - name: Test ${{ matrix.module }} + test-mock-module-rbac: + name: Test RBAC Module if: '! github.event.pull_request.draft' runs-on: "ubuntu-latest" - strategy: - matrix: - module: - # Mocked modules - - mock_module_rbac - - mock_module_accounting - # Contracts - - zero_coupon_bond - - fixed_coupon_bond - - perpetual_bond steps: - name: Checkout source code uses: actions/checkout@v6 @@ -65,22 +55,28 @@ jobs: id: filter with: filters: | - module: - - 'smart_contracts/artifacts/${{ matrix.module }}/**' + mock_module_rbac: + - 'smart_contracts/artifacts/mock_module_rbac/**' - 'tests/conftest.py' - - 'tests/${{ matrix.module }}/**' + - 'tests/mock_module_rbac/**' - name: Run tests - if: steps.filter.outputs.module == 'true' + if: steps.filter.outputs.mock_module_rbac == 'true' shell: bash run: | set -o pipefail - algokit project run test tests/${{ matrix.module }} + algokit project run test tests/mock_module_rbac - test-shared: - name: Test shared contracts + test-pam: + name: Test PAM ${{ matrix.subfolder }} if: '! github.event.pull_request.draft' runs-on: "ubuntu-latest" + strategy: + fail-fast: false + matrix: + subfolder: + - fcb + - zcb steps: - name: Checkout source code uses: actions/checkout@v6 @@ -93,30 +89,23 @@ jobs: id: filter with: filters: | - shared: - - 'modules/**' - - 'smart_contracts/artifacts/zero_coupon_bond/**' - - 'smart_contracts/artifacts/fixed_coupon_bond/**' - - 'smart_contracts/artifacts/perpetual_bond/**' + pam: + - 'smart_contracts/artifacts/d_asa/**' + - 'src/artifacts/**' - 'tests/conftest.py' - 'tests/conftest_helpers.py' - - 'tests/shared/**' - - - name: Run shared tests - if: steps.filter.outputs.shared == 'true' - shell: bash - run: | - set -o pipefail - algokit project run test tests/shared + - 'tests/pam/pam_test_support.py' + - 'tests/pam/${{ matrix.subfolder }}/**' - - name: Run helper tests + - name: Run tests + if: steps.filter.outputs.pam == 'true' shell: bash run: | set -o pipefail - algokit project run test tests/test_utils.py tests/test_mixin_composition_guards.py + algokit project run test tests/pam/${{ matrix.subfolder }} - test-events: - name: Test ACTUS events + test-sdk: + name: Test SDK and helpers if: '! github.event.pull_request.draft' runs-on: "ubuntu-latest" steps: @@ -126,8 +115,20 @@ jobs: - name: Set up AlgoKit uses: ./.github/actions/algokit-setup - - name: Run Fixed Coupon Bond ACTUS events test + - name: Detect changes + uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + sdk: + - 'src/**' + - 'smart_contracts/**' + - 'tests/sdk/**' + - 'tests/test_utils.py' + + - name: Run tests + if: steps.filter.outputs.sdk == 'true' shell: bash run: | set -o pipefail - poetry run pytest -s -v tests/fixed_coupon_bond/test_actus_events.py + algokit project run test tests/sdk tests/test_utils.py diff --git a/.gitignore b/.gitignore index 5734bcbd..553fb6d6 100644 --- a/.gitignore +++ b/.gitignore @@ -95,3 +95,8 @@ debug_traces/ # mdBook book +mermaid-init.js +mermaid.min.js + +# Jupyter +.ipynb_checkpoints/ diff --git a/.markdownlintignore b/.markdownlintignore index 632a713c..f53e32a4 100644 --- a/.markdownlintignore +++ b/.markdownlintignore @@ -1,2 +1,3 @@ +CONTRIBUTIONS.md SUMMARY.md styles.md diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 10a97b0a..41d1f97a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -79,7 +79,7 @@ repos: minimum_pre_commit_version: 0.15.0 types: [ markdown ] additional_dependencies: [ ] - files: '^(docs)/' + files: '^(docs/|[^/]+\.md$)' - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 @@ -92,4 +92,4 @@ repos: minimum_pre_commit_version: 3.2.0 types: [ markdown ] additional_dependencies: [ ] - files: '^(docs)/' + files: '^(docs/|[^/]+\.md$)' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..669f5d77 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,266 @@ +# Contributing to D-ASA + +Thank you for contributing to D-ASA. + +## Prerequisites + +The standard contributor workflow assumes: + +- [AlgoKit](https://dev.algorand.co/algokit/) for project bootstrap, LocalNet, + build, and deployment workflows +- [Poetry](https://python-poetry.org/) for the Python environment +- [Docker](https://www.docker.com/) for Algorand LocalNet +- [pre-commit](https://pre-commit.com/) for local checks + +Docs contributors also need: + +- [Rust and Cargo](https://www.rust-lang.org/tools/install) +- [`mdbook`](https://rust-lang.github.io/mdBook/) +- `mdbook-mermaid` + +## Getting Started + +### Clone the Repository + +```shell +git clone git@github.com:cusma/d-asa.git +cd d-asa +``` + +### Bootstrap the Development Environment + +The standard setup path is: + +```shell +algokit project bootstrap all +make pre-commit +make doctor +``` + +If you are only setting up Python dependencies: + +```shell +make install +``` + +If you are contributing to docs, install the mdBook toolchain as well: + +```shell +cargo install mdbook --version 0.5.2 --locked +cargo install mdbook-mermaid --version 0.17.0 --locked +mdbook-mermaid install . +``` + +### Verify the Environment + +Run: + +```shell +make doctor +``` + +`make doctor` runs `algokit doctor`, checks core contributor dependencies, checks +Docker daemon reachability for LocalNet workflows, and warns if docs-only tools +are missing. + +## Development Workflow + +### Core Commands + +The main contributor commands are: + +```shell +make help +make build +make test +make test-cov +make lint +make format +make typecheck +make all +``` + +`make all` runs the standard code quality loop for contributors: + +- build smart contracts +- run lint and type checks +- run the default non-showcase test suite + +It intentionally does not require mdBook tooling. + +### LocalNet Workflow + +Start LocalNet when you need end-to-end execution tests or LocalNet deployment: + +```shell +make localnet +make deploy-localnet +make showcase +make localnet-stop +``` + +These targets map to the existing AlgoKit workflow already used by CI and the +project scripts. + +### Docs Workflow + +For docs editing with live reload: + +```shell +make docs-serve +``` + +For docs validation: + +```shell +make docs +``` + +`make docs` runs both: + +- the docs pre-commit hooks: + - `mdbook-build` + - `mdbook-test` + - `markdownlint` + - `trailing-whitespace` +- the mdBook build artifacts remain available in `book/` until `make clean` + +## Pull Requests + +When preparing a pull request: + +1. Keep changes focused and atomic. +1. Add or update tests when behavior changes. +1. Update docs when user-facing behavior, workflows, or interfaces change. +1. Run the relevant local checks before opening the PR. + +Suggested pre-PR checklist: + +```shell +make doctor +make all +``` + +If you changed docs: + +```shell +make docs +``` + +If you changed LocalNet behavior or showcase flows: + +```shell +make localnet +make showcase +make localnet-stop +``` + +## Repository Layout + +The main top-level layout is: + +```text +.algokit/ -> AlgoKit configuration and generators +.github/ -> CI/CD workflows and shared GitHub actions +docs/ -> mdBook source files +modules/ -> D-ASA module implementations +smart_contracts/ -> AVM smart contracts and generated contract artifacts +src/ -> D-ASA SDK, Python-side normalization, helpers, and shared runtime code +tests/ -> SDK, contract, LocalNet, and showcase tests +``` + +## Style and Quality + +### Python + +The project uses: + +- `black` for formatting +- `ruff` for linting and import organization +- `mypy` for type checking +- `pytest` for tests + +Run the standard checks with: + +```shell +make format +make lint +make typecheck +make test +``` + +### Markdown and mdBook + +The docs are written in [CommonMark](https://commonmark.org/) and validated in +CI with `markdownlint`, trailing whitespace checks, and `mdbook test`. + +#### Numbered Lists + +Numbered lists **MUST** use `1.`-only style. + +> ```text +> 1. First item +> 1. Second item +> 1. Third item +> ``` + +#### Tables + +Table rows **MUST** keep aligned column widths. + +> ✅ Correct table format +> ```text +> | Month | Savings | +> |----------|---------| +> | January | EUR 250 | +> | February | EUR 80 | +> | March | EUR 420 | +> ``` +> +> ❌ Wrong table format +> ```text +> | Month | Savings | +> |----------|---------| +> | January | EUR 250 | +> | February | EUR 80 | +> | March | EUR 420 | +> ``` + +Column alignment may be controlled with `:` markers in the separator row. + +#### Admonitions + +An admonition is a special type of callout or notice block used to highlight important +information. It is written as a blockquote with a special tag on the first line. + +```text +> [!NOTE] +> General information or additional context. + +> [!TIP] +> A helpful suggestion or best practice. + +> [!IMPORTANT] +> Key information that shouldn't be missed. + +> [!WARNING] +> Critical information that highlights a potential risk. + +> [!CAUTION] +> Information about potential issues that require caution. +``` + +#### MathJax + +Mathematical formulas are rendered with [MathJax](https://www.mathjax.org/). + +Reference: + +- [mdBook MathJax documentation](https://rust-lang.github.io/mdBook/format/mathjax.html) + +## Additional Notes + +- Do not remove or hand-edit generated artifacts under `smart_contracts/artifacts` + or `src/artifacts` unless the change explicitly requires regenerated output. +- Prefer the checked-in `algokit` commands and `make` targets over ad-hoc local + command variations so contributor workflows stay aligned with CI. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..e76ee405 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM python:3.13-slim + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 +ENV PIP_NO_CACHE_DIR=1 +ENV POETRY_NO_INTERACTION=1 +ENV POETRY_VIRTUALENVS_CREATE=false + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +RUN python -m pip install --upgrade pip \ + && python -m pip install \ + poetry==2.1.4 + +WORKDIR /workspace + +COPY pyproject.toml poetry.lock ./ + +RUN poetry install --without dev --with notebooks --no-root --no-ansi + +EXPOSE 8888 diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..036f4e99 --- /dev/null +++ b/Makefile @@ -0,0 +1,135 @@ +SHELL := /bin/sh + +.PHONY: help install install-dev doctor build test test-cov lint format typecheck docs docs-serve pre-commit clean all localnet localnet-stop deploy-localnet showcase jupyter-docker + +help: + @echo "Available targets:" + @echo " install - Install Python dependencies via AlgoKit bootstrap" + @echo " install-dev - Bootstrap the full development environment and install pre-commit hooks" + @echo " doctor - Check contributor dependencies and environment health" + @echo " build - Build smart contracts" + @echo " test - Run the default non-showcase test suite" + @echo " test-cov - Run tests with coverage" + @echo " lint - Run the standard lint and type checks" + @echo " format - Format Python code and auto-fix Ruff issues" + @echo " typecheck - Run mypy" + @echo " docs - Run docs pre-commit checks and mdBook validation" + @echo " docs-serve - Serve mdBook docs locally with live reload" + @echo " pre-commit - Install pre-commit hooks" + @echo " clean - Remove local caches, notebook checkpoints, and ignored build outputs" + @echo " all - Run build, lint, and test" + @echo " localnet - Start AlgoKit LocalNet" + @echo " localnet-stop - Stop AlgoKit LocalNet" + @echo " deploy-localnet - Deploy contracts to LocalNet" + @echo " showcase - Run the LocalNet showcase walkthrough" + @echo " jupyter-docker - Start Jupyter Lab in Docker with LocalNet (no local dependencies needed)" + +install: + algokit project bootstrap poetry + +install-dev: + algokit project bootstrap all + pre-commit install + +doctor: + @set -u; \ + status=0; \ + echo "== AlgoKit doctor =="; \ + algokit doctor || true; \ + echo ""; \ + echo "== D-ASA environment checks =="; \ + check_required() { \ + name="$$1"; \ + cmd="$$2"; \ + if command -v "$$cmd" >/dev/null 2>&1; then \ + echo "[required] $$name: OK ($$(command -v "$$cmd"))"; \ + else \ + echo "[required] $$name: MISSING"; \ + status=1; \ + fi; \ + }; \ + check_optional() { \ + group="$$1"; \ + name="$$2"; \ + cmd="$$3"; \ + hint="$$4"; \ + if command -v "$$cmd" >/dev/null 2>&1; then \ + echo "[$$group] $$name: OK ($$(command -v "$$cmd"))"; \ + else \ + echo "[$$group] $$name: WARN - $$hint"; \ + fi; \ + }; \ + check_required "AlgoKit" algokit; \ + check_required "Poetry" poetry; \ + check_required "pre-commit" pre-commit; \ + if command -v docker >/dev/null 2>&1; then \ + echo "[localnet] Docker CLI: OK ($$(command -v docker))"; \ + if docker info >/dev/null 2>&1; then \ + echo "[localnet] Docker daemon: OK"; \ + else \ + echo "[localnet] Docker daemon: ERROR - Docker is installed but not reachable"; \ + status=1; \ + fi; \ + else \ + echo "[localnet] Docker CLI: ERROR - Docker is required for LocalNet workflows"; \ + status=1; \ + fi; \ + check_optional "docs" "Cargo" cargo "install Rust/Cargo to work on docs"; \ + check_optional "docs" "mdBook" mdbook "install with: cargo install mdbook --version 0.5.2 --locked"; \ + check_optional "docs" "mdBook Mermaid" mdbook-mermaid "install with: cargo install mdbook-mermaid --version 0.17.0 --locked"; \ + exit $$status + +build: + algokit project run build + +test: + algokit project run test + +test-cov: + poetry run pytest --cov=d_asa --cov=smart_contracts --cov=modules --cov-report=term-missing -m "not showcase" + +lint: + algokit project run lint + +format: + poetry run black . + poetry run ruff check --fix . + +typecheck: + poetry run mypy + +docs: + mdbook-mermaid install . + pre-commit run --all-files mdbook-build + pre-commit run --all-files mdbook-test + pre-commit run --all-files markdownlint + pre-commit run --all-files trailing-whitespace + +docs-serve: + mdbook-mermaid install . + mdbook serve --open + +pre-commit: + pre-commit install + +clean: + rm -rf .mypy_cache .pytest_cache .ruff_cache .coverage htmlcov book mermaid-init.js mermaid.min.js + find . -type d \( -name __pycache__ -o -name '.ipynb_checkpoints' \) -prune -exec rm -rf {} + + find . -type f -name '*.pyc' -delete + +all: build lint test + +localnet: + algokit localnet start + +localnet-stop: + algokit localnet stop + +deploy-localnet: + algokit project deploy localnet + +showcase: + poetry run pytest -s -v -m showcase tests/pam/test_pam_lifecycle_showcase.py + +jupyter-docker: + ./d-asa jupyter diff --git a/README.md b/README.md index 147b049e..0a414177 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,165 @@ +# Debt Algorand Standard Application (D-ASA) + +D-ASA is a full tokenization framework for [ACTUS](https://www.actusfrf.org/)-compliant +debt instruments, issued and executed on the Algorand Virtual Machine. + +```mermaid +flowchart LR + ACTUS["ACTUS Contract"] --> NORMALIZE["AVM Normalization"] + NORMALIZE --> ABI["ABI Upload"] + ABI --> EXEC["AVM Execution"] +``` + +The canonical generated artifacts are: + +- `src/d_asa/artifacts/DASA.arc56.json`: D-ASA AppSpec, generates clients and can +be used on [Lora App Lab](https://lora.algokit.io/localnet/app-lab/create); + +- `src/d_asa/artifacts/dasa_client.py`: D-ASA client, expanded by the SDK; + +- `src/d_asa/artifacts/dasa_avm_client.py`: D-ASA AVM client, for on-chain App-2-App +calls. + +Documentation: + +High-level client docs: `docs/sdk/overview.md` + +Interactive notebook examples: [`examples/README.md`](./examples/README.md) + [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/cusma/d-asa) -# Debt Algorand Standard Application (D-ASA) +## Demo in One Command + +The fastest way to showcase D-ASA is with host AlgoKit for Algorand LocalNet and +Docker for the showcase runtime. + +- Install [AlgoKit](https://dev.algorand.co/algokit/algokit-intro/#cross-platform-installation) +- Install [Docker](https://docs.docker.com/get-docker/) + +```shell +git clone git@github.com:cusma/d-asa.git +cd d-asa +./d-asa run +``` + +What `./d-asa run` does: + +- builds the local demo image +- starts host AlgoKit LocalNet if it is not already running +- waits for the LocalNet services required by the showcase +- runs the PAM fixed coupon and zero coupon showcase walkthroughs +- leaves LocalNet running so the Lora transaction links remain explorable + +When you are finished inspecting the links: + +```shell +algokit localnet stop +``` + +Open the published docs with: + +```shell +./d-asa docs +``` + +Notes: + +- targets macOS and Linux +- requires both Docker and AlgoKit on the host +- the demo joins the LocalNet Docker network when available, which keeps the showcase +on direct container-to-container networking + +## Development -Documentation: https://cusma.github.io/d-asa/ +The D-ASA project is developed with [AlgoKit](https://algorand.co/algokit) and [Poetry](https://python-poetry.org/). -## Deployments +Bootstrap the development environment: -D-ASA examples deployed on TestNet: +```shell +make install-dev +``` + +Verify your environment: + +```shell +make doctor +``` + +See the available contributor commands: + +```shell +make help +``` -| Type | App ID | App Spec | -|-------------------|--------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------| -| Zero Coupon Bond | [756574705](https://lora.algokit.io/testnet/application/756574705) | [ARC-56](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json) | -| Fixed Coupon Bond | [756574716](https://lora.algokit.io/testnet/application/756574716) | [ARC-56](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json) | -| Perpetual Bond | [756574702](https://lora.algokit.io/testnet/application/756574702) | [ARC-56](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json) | +Start your Algorand LocalNet: -1. Download the App Spec JSON file; -1. Navigate to the [Lora App Lab](https://lora.algokit.io/testnet/app-lab); -1. Create the App Interface using the existing App ID and App Spec JSON; -1. Explore the D-ASA interface. +```shell +make localnet +``` -## Local Setup and Tests +Run the default test suite: -The D-ASA project is developed with [AlgoKit](https://algorand.co/algokit). +```shell +make test +``` -- Install AlgoKit -- Set up your virtual environment (managed with [Poetry](https://python-poetry.org/)) +Build smart contracts: ```shell -algokit bootstrap all +make build ``` -- Start your Algorand LocalNet (requires [Docker](https://www.docker.com/get-started/)) +Run the showcase tests directly: ```shell -algokit localnet start +make showcase ``` -- Run tests (managed with PyTest) +Serve docs locally with live reload: + +```shell +make docs-serve +``` + +## Interactive Notebooks + +The easiest way to explore the notebooks is using Docker (no local Python dependencies +needed): + +```shell +./d-asa jupyter +``` + +Or via make: + +```shell +make jupyter-docker +``` + +This will: +- Build the Docker image with Jupyter Lab included +- Start AlgoKit LocalNet if needed +- Launch Jupyter Lab at +- Automatically configure LocalNet connectivity + +The notebooks will have full access to the D-ASA framework and LocalNet. + +Press `Ctrl+C` to stop. + +### Alternative: Local Jupyter (requires local dependencies) + +If you prefer running Jupyter locally, first install the optional notebook dependencies: ```shell -algokit project run test +poetry install --with notebooks ``` -or, for verbose results: +Then start Jupyter Lab: ```shell -poetry run pytest -s -v tests//.py +poetry run jupyter lab examples/ ``` -## How to contribute +## Contributing -Refer to D-ASA documentation! +Contributor setup and workflow guidance live in [CONTRIBUTING.md](./CONTRIBUTING.md). diff --git a/book.toml b/book.toml index 4757e8e5..ab4cd1d0 100644 --- a/book.toml +++ b/book.toml @@ -13,7 +13,13 @@ mathjax-support = true git-repository-url = "https://github.com/cusma/d-asa" edit-url-template = "https://github.com/cusma/d-asa/edit/main/{path}" site-url = "https://cusma.github.io/d-asa/" +additional-js = ["mermaid.min.js", "mermaid-init.js"] [output.html.fold] enable = true level = 3 + +[preprocessor] + +[preprocessor.mermaid] +command = "mdbook-mermaid" diff --git a/d-asa b/d-asa new file mode 100755 index 00000000..7bb88bd2 --- /dev/null +++ b/d-asa @@ -0,0 +1,279 @@ +#!/bin/sh + +set -eu + +IMAGE_TAG="d-asa-demo:local" +DOCS_URL="https://cusma.github.io/d-asa/" +DEFAULT_LOCALNET_HOST="${D_ASA_LOCALNET_HOST:-host.docker.internal}" +DEFAULT_LOCALNET_TOKEN="${D_ASA_LOCALNET_TOKEN:-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}" +DEFAULT_ALGOD_PORT="${D_ASA_ALGOD_PORT:-4001}" +DEFAULT_KMD_PORT="${D_ASA_KMD_PORT:-4002}" +DEFAULT_INDEXER_PORT="${D_ASA_INDEXER_PORT:-8980}" +LOCALNET_NETWORK="algokit_sandbox_default" +NETWORK_LOCALNET_HOST="algod" +NETWORK_INDEXER_HOST="indexer" +NETWORK_ALGOD_PORT="8080" +NETWORK_KMD_PORT="7833" +NETWORK_INDEXER_PORT="8980" +STARTED_LOCALNET=0 +REPO_ROOT=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +STALE_LOCALNET_CONFIG_IMAGE="/home/dasa/.config/algokit/sandbox/docker-compose.yml" +STALE_LOCALNET_CONFIG_REPO="$REPO_ROOT/.d-asa/algokit-home/.config/algokit/sandbox/docker-compose.yml" + +print_help() { + cat < + +Commands: + run Build the demo image, start LocalNet if needed, print the showcase, and leave LocalNet running. + jupyter Start Jupyter Lab in Docker with LocalNet integration (opens browser automatically). + docs Open the published D-ASA docs, or print the URL when browser opening is disabled. + help Show this help text. + +Prerequisites: + - Docker Desktop or Docker Engine + - AlgoKit + - macOS or Linux + +Examples: + ./d-asa run + ./d-asa jupyter + ./d-asa docs + D_ASA_NO_OPEN=1 ./d-asa docs +EOF +} + +die() { + printf '%s\n' "$*" >&2 + exit 1 +} + +ensure_docker() { + command -v docker >/dev/null 2>&1 || die "Docker is required but was not found in PATH." + docker info >/dev/null 2>&1 || die "Docker is installed but the daemon is not reachable." +} + +ensure_algokit() { + command -v algokit >/dev/null 2>&1 || die "AlgoKit is required but was not found in PATH." +} + +cleanup_stale_localnet() { + stale_ids=$( + { + docker ps -aq \ + --filter "label=com.docker.compose.project=algokit_sandbox" \ + --filter "label=com.docker.compose.project.config_files=$STALE_LOCALNET_CONFIG_IMAGE" + docker ps -aq \ + --filter "label=com.docker.compose.project=algokit_sandbox" \ + --filter "label=com.docker.compose.project.config_files=$STALE_LOCALNET_CONFIG_REPO" + } | sort -u + ) + if [ -z "$stale_ids" ]; then + return + fi + + printf '%s\n' "Removing stale LocalNet containers from an older d-asa launcher..." + # shellcheck disable=SC2086 + docker rm -f $stale_ids >/dev/null + docker network rm algokit_sandbox_default >/dev/null 2>&1 || true +} + +build_image() { + printf '%s\n' "Building ${IMAGE_TAG}..." + docker build --tag "$IMAGE_TAG" "$REPO_ROOT" +} + +localnet_network_exists() { + docker network inspect "$LOCALNET_NETWORK" >/dev/null 2>&1 +} + +run_in_image() { + if localnet_network_exists; then + docker run --rm \ + --network "$LOCALNET_NETWORK" \ + -e D_ASA_LOCALNET_HOST="$NETWORK_LOCALNET_HOST" \ + -e D_ASA_ALGOD_HOST="$NETWORK_LOCALNET_HOST" \ + -e D_ASA_KMD_HOST="$NETWORK_LOCALNET_HOST" \ + -e D_ASA_INDEXER_HOST="$NETWORK_INDEXER_HOST" \ + -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ + -e D_ASA_ALGOD_PORT="$NETWORK_ALGOD_PORT" \ + -e D_ASA_KMD_PORT="$NETWORK_KMD_PORT" \ + -e D_ASA_INDEXER_PORT="$NETWORK_INDEXER_PORT" \ + -v "$REPO_ROOT:$REPO_ROOT" \ + -w "$REPO_ROOT" \ + "$IMAGE_TAG" "$@" + return + fi + + case "$(uname -s)" in + Linux*) + docker run --rm \ + --add-host=host.docker.internal:host-gateway \ + -e D_ASA_LOCALNET_HOST="$DEFAULT_LOCALNET_HOST" \ + -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ + -e D_ASA_ALGOD_PORT="$DEFAULT_ALGOD_PORT" \ + -e D_ASA_KMD_PORT="$DEFAULT_KMD_PORT" \ + -e D_ASA_INDEXER_PORT="$DEFAULT_INDEXER_PORT" \ + -v "$REPO_ROOT:$REPO_ROOT" \ + -w "$REPO_ROOT" \ + "$IMAGE_TAG" "$@" + ;; + *) + docker run --rm \ + -e D_ASA_LOCALNET_HOST="$DEFAULT_LOCALNET_HOST" \ + -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ + -e D_ASA_ALGOD_PORT="$DEFAULT_ALGOD_PORT" \ + -e D_ASA_KMD_PORT="$DEFAULT_KMD_PORT" \ + -e D_ASA_INDEXER_PORT="$DEFAULT_INDEXER_PORT" \ + -v "$REPO_ROOT:$REPO_ROOT" \ + -w "$REPO_ROOT" \ + "$IMAGE_TAG" "$@" + ;; + esac +} + +cleanup() { + status=$? + trap - EXIT INT TERM + if [ "$STARTED_LOCALNET" -eq 1 ] && [ "$status" -ne 0 ]; then + printf '%s\n' "Stopping AlgoKit LocalNet after failed run..." + algokit localnet stop >/dev/null 2>&1 || true + elif [ "$STARTED_LOCALNET" -eq 1 ]; then + printf '%s\n' "LocalNet is still running so the Lora links stay available." + printf '%s\n' "Stop it when finished with: algokit localnet stop" + fi + exit "$status" +} + +localnet_ready() { + run_in_image python -m src.d_asa.localnet wait --timeout 2 --poll-interval 1 >/dev/null 2>&1 +} + +cmd_run() { + ensure_docker + ensure_algokit + cleanup_stale_localnet + build_image + trap cleanup EXIT INT TERM + + if localnet_ready; then + printf '%s\n' "Reusing existing LocalNet." + else + printf '%s\n' "Starting AlgoKit LocalNet..." + algokit localnet start --force + STARTED_LOCALNET=1 + printf '%s\n' "Waiting for algod..." + run_in_image python -m src.d_asa.localnet wait --timeout 90 --poll-interval 2 + fi + + printf '%s\n' "Running D-ASA showcase..." + run_in_image python -m src.d_asa.showcase +} + +cmd_jupyter() { + ensure_docker + ensure_algokit + cleanup_stale_localnet + build_image + trap cleanup EXIT INT TERM + + if localnet_ready; then + printf '%s\n' "Reusing existing LocalNet." + else + printf '%s\n' "Starting AlgoKit LocalNet..." + algokit localnet start --force + STARTED_LOCALNET=1 + printf '%s\n' "Waiting for algod..." + run_in_image python -m src.d_asa.localnet wait --timeout 90 --poll-interval 2 + fi + + printf '%s\n' "Starting Jupyter Lab on http://localhost:8888..." + printf '%s\n' "Press Ctrl+C to stop Jupyter Lab." + printf '%s\n' "" + + if localnet_network_exists; then + docker run --rm -it \ + --network "$LOCALNET_NETWORK" \ + -p 127.0.0.1:8888:8888 \ + -e D_ASA_LOCALNET_HOST="$NETWORK_LOCALNET_HOST" \ + -e D_ASA_ALGOD_HOST="$NETWORK_LOCALNET_HOST" \ + -e D_ASA_KMD_HOST="$NETWORK_LOCALNET_HOST" \ + -e D_ASA_INDEXER_HOST="$NETWORK_INDEXER_HOST" \ + -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ + -e D_ASA_ALGOD_PORT="$NETWORK_ALGOD_PORT" \ + -e D_ASA_KMD_PORT="$NETWORK_KMD_PORT" \ + -e D_ASA_INDEXER_PORT="$NETWORK_INDEXER_PORT" \ + -v "$REPO_ROOT:$REPO_ROOT" \ + -w "$REPO_ROOT" \ + "$IMAGE_TAG" \ + jupyter lab examples/ --ip=0.0.0.0 --port=8888 --no-browser --allow-root + else + case "$(uname -s)" in + Linux*) + docker run --rm -it \ + --add-host=host.docker.internal:host-gateway \ + -p 127.0.0.1:8888:8888 \ + -e D_ASA_LOCALNET_HOST="$DEFAULT_LOCALNET_HOST" \ + -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ + -e D_ASA_ALGOD_PORT="$DEFAULT_ALGOD_PORT" \ + -e D_ASA_KMD_PORT="$DEFAULT_KMD_PORT" \ + -e D_ASA_INDEXER_PORT="$DEFAULT_INDEXER_PORT" \ + -v "$REPO_ROOT:$REPO_ROOT" \ + -w "$REPO_ROOT" \ + "$IMAGE_TAG" \ + jupyter lab examples/ --ip=0.0.0.0 --port=8888 --no-browser --allow-root + ;; + *) + docker run --rm -it \ + -p 8888:8888 \ + -e D_ASA_LOCALNET_HOST="$DEFAULT_LOCALNET_HOST" \ + -e D_ASA_LOCALNET_TOKEN="$DEFAULT_LOCALNET_TOKEN" \ + -e D_ASA_ALGOD_PORT="$DEFAULT_ALGOD_PORT" \ + -e D_ASA_KMD_PORT="$DEFAULT_KMD_PORT" \ + -e D_ASA_INDEXER_PORT="$DEFAULT_INDEXER_PORT" \ + -v "$REPO_ROOT:$REPO_ROOT" \ + -w "$REPO_ROOT" \ + "$IMAGE_TAG" \ + jupyter lab examples/ --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password='' + ;; + esac + fi +} + +cmd_docs() { + if [ "${D_ASA_NO_OPEN:-0}" = "1" ]; then + printf '%s\n' "$DOCS_URL" + return + fi + + if command -v open >/dev/null 2>&1; then + open "$DOCS_URL" >/dev/null 2>&1 || printf '%s\n' "$DOCS_URL" + return + fi + + if command -v xdg-open >/dev/null 2>&1; then + xdg-open "$DOCS_URL" >/dev/null 2>&1 || printf '%s\n' "$DOCS_URL" + return + fi + + printf '%s\n' "$DOCS_URL" +} + +case "${1:-help}" in + run) + cmd_run + ;; + jupyter) + cmd_jupyter + ;; + docs) + cmd_docs + ;; + help|-h|--help) + print_help + ;; + *) + print_help + exit 1 + ;; +esac diff --git a/docs/CONTRIBUTIONS.md b/docs/CONTRIBUTIONS.md index 3c5b6ea4..81ddb505 100644 --- a/docs/CONTRIBUTIONS.md +++ b/docs/CONTRIBUTIONS.md @@ -1,176 +1 @@ -# Contribution {#contribution} - -The D-ASA is free and open source. - -The source code is released on the official -GitHub repository. - -External contributions are welcome, the project relies on the community to improve -and expand. Issues and features requests can be submitted on the GitHub -issues page. - -If you would like to contribute, please read the [guidelines](CONTRIBUTIONS.md#guidelines-guidelines) -and consider submitting a pull request. - -## Contributors {#contributors} - -- Cosimo Bassi ([@cusma](https://github.com/cusma/)) -- Altynbek Orumbayev ([@aorumbayev](https://github.com/aorumbayev)) - -## Guidelines {#guidelines} - -By clicking on the _“Suggest an edit”_ icon in the top-right corner, while reading -this book, you will be redirected to the relevant source code file to be referenced -in an issue or edited in a pull request. - -### Source Code - -The D-ASA Specifications book is built with [mdBook](https://rust-lang.github.io/mdBook/index.html). - -The source code is structured as follows: - -```text -.algokit/ -> AlgoKit configurations -.github/ -> GitHub actions and CI/CD workflows -docs/ -> mdBook source code -└── _include/ -> Templates, etc. -└── images/ -> Image files -└── images/ -> D-ASA implementation documents -└── interfaces/ -> D-ASA interfaces -| └── rbac/ -> Role-Based Access Control (RBAC) interfaces -| └── account/ -> Accounting interfaces -| └── contract/ -> Contract interfaces -| └── payment-agent/ -> Payment Agent interfaces -| └── transfer-agent/ -> Transfer Agent interfaces -└── specs/ -> D-ASA specifications -| └── rbac/ -> Role-Based Access Control (RBAC) specifications -| └── account/ -> Accounting specifications -| └── contract/ -> Contract (ACTUS) specifications -| └── execution/ -> Contract execution specifications -└── SUMMARY.md, ... -> mdBook SUMMARY.md, COVER.md, etc. -modules/ -> D-ASA Modules -smart_contracts/ -> D-ASA Smart Contracts -└── artifacts/ -> AlgoKit auto-generated artifacts -└── mock_module_.../ -> Mocked modules for tests -└── contract_a/ -> Contract Type A -└── contract_b/ -> Contract Type B -└── contract_.../ -> Contract Type ... - └── config.py -> Contract configuration - └── contract.py -> Contract implementation - └── deploy_config.py -> Contract deployment configuration -tests/ -> Tests of D-ASA Smart Contracts -└── shared/ -> Shared test fixtures and mixins tests -└── mock_module_.../ -> Mocked module tests -└── contract_a/ -> Tests of Contract Type A -| └── conftest.py -> Contract Type A test fixtures -| └── test_method_1.py -> Tests of Contract Type A Method 1 -| └── test_method_2.py -> Tests of Contract Type A Method 2 -| └── test_method_... -> Tests of Contract Type A Method ... -└── contract_b/ -> Tests of Contract Type B -└── contract_.../ -> Tests of Contract Type ... -└── conftest.py -> Common test fixtures -└── utils.py -> Testing utilities -└── ... -``` - -### Tests - -D-ASA uses the PyTest framework for unit tests and end-to-end tests. - -PyTest fixtures are organized hierarchically in the `tests` folder: fixtures defined -in the `conftest.py` file at higher levels are available to all the nested-level -tests. - -### Docs - -The book is written in [CommonMark](https://commonmark.org/). - -The CI pipeline enforces Markdown linting, formatting, and style checking with -[`markdownlint`](https://github.com/DavidAnson/markdownlint). - -#### Numbered Lists - -Numbered lists **MUST** be defined with `1`-only style. - -{{#include ./_include/styles.md:example}} -> ```text -> 1. First item -> 1. Second item -> 1. Third item -> ``` -> -> Result: -> 1. First item -> 1. Second item -> 1. Third item - -#### Tables - -Table rows **MUST** use the same column widths. - -{{#include ./_include/styles.md:example}} -> ✅ Correct table format -> ```text -> | Month | Savings | -> |----------|---------| -> | January | €250 | -> | February | €80 | -> | March | €420 | -> ``` -> -> ❌ Wrong table format -> ```text -> | Month | Savings | -> |----------|---------| -> | January | €250 | -> | February | €80 | -> | March | €420 | -> ``` -> -> Result: -> | Month | Savings | -> |----------|---------| -> | January | €250 | -> | February | €80 | -> | March | €420 | - -Consider aligning text in the columns to the left, right, or center by adding a -colon `:` to the left, right, or on both sides of the dashes `---` within the header -row. - -{{#include ./_include/styles.md:example}} -> ```text -> | Name | Quantity | Size | -> |:-------|:--------:|-----:| -> | Item A | 1 | S | -> | Item B | 5 | M | -> | Item C | 10 | XL | -> ``` -> -> Result: -> | Name | Quantity | Size | -> |:-------|:--------:|-----:| -> | Item A | 1 | S | -> | Item B | 5 | M | -> | Item C | 10 | XL | - -#### MathJax - -Mathematical formulas are defined with [MathJax](https://www.mathjax.org/). - -> mdBook MathJax [documentation](https://rust-lang.github.io/mdBook/format/mathjax.html). - -#### Block Styles - -Block styles are defined in the `./docs/_include/styles.md` file using the mdBook -[include feature](https://rust-lang.github.io/mdBook/format/mdbook.html#including-files). - -Block styles (e.g., examples, implementation notes, etc.) are “styled quote” blocks -included in the book. - -{{#include ./_include/styles.md:example}} -> This example block has been included with the following syntax: -> ```text -> \{{#include ./_include/styles.md:example}} -> > This example block has been included with the following syntax: -> ``` +{{#include ../CONTRIBUTING.md}} diff --git a/docs/COVER.md b/docs/COVER.md index e78f25da..8c548e53 100644 --- a/docs/COVER.md +++ b/docs/COVER.md @@ -7,30 +7,35 @@ The *Debt Algorand Standard Application* (D-ASA) is a standard for tokenizing *debt instruments* on the Algorand Virtual Machine. -It provides the interfaces for arranging the asset, configuring its role-based access +It provides a framework for arranging the asset, configuring its role-based access control, issuing and distributing it on the primary market, executing cash flows, exchanging it on the secondary market, and querying information about the debt instrument. -The specification provides recommendations to conform, to the best effort[^1], to -the *Algorithmic Contract Types Unified Standards* (ACTUS). +The specification complies with the *Algorithmic Contract Types Unified Standards* +(ACTUS) for the definition of the contracts. + +**D-ASA is, in essence, a full tokenization framework for ACTUS-compliant debt instruments, +issued and executed on the Algorand Virtual Machine.** The specification allows the tokenization of various debt instruments, such as bonds, -loans, commercial papers, mortgages, etc. A [reference implementation](./implementation/reference-implementation.md) -of some fixed income contract examples are provided. +loans, commercial papers, mortgages, etc. + +The [reference implementation](./implementation/reference-implementation.md) of +some fixed income contracts is provided. -This document is a *technical specification*, it is not intended to be as a legal -or a financial document. +This document is a *technical specification*, it is not intended to be a legal or +a financial document. ## Contents -Contents are organized in four hierarchical levels (see the navigation sidebar on -the left): +Contents are organized in three hierarchical levels (see the navigation sidebar +on the left): ```text Part └── 1. Chapter └── 1.1. Section - └── 1.1.1. Sub Section + └── 1.1.1. Sub-section ``` The navigation sidebar can be folded up to the *Chapter* level by clicking the folding @@ -40,20 +45,16 @@ icon (**>**), next to the level name. The D-ASA is free and open source. -The source code is released on the official -GitHub repository. +The source code is released on the official [GitHub repository](https://github.com/cusma/d-asa). External contributions are welcome, the project relies on the community to improve -and expand. Issues and features requests can be submitted on the GitHub -issues page. +and expand. -If you would like to contribute, please read the [guidelines](CONTRIBUTIONS.md#guidelines-guidelines) -and consider submitting a pull request. +Issues and feature requests can be submitted on the [GitHub issues page](https://github.com/cusma/d-asa/issues). -## License {#license} +If you would like to contribute, please read the [guidelines](./CONTRIBUTIONS.md#guidelines-guidelines) +and consider submitting a [pull request](https://github.com/cusma/d-asa/pulls). -The D-ASA source and documentation are released under the [AGPL-3.0 license](LICENSE.md). - ---- +## License {#license} -[^1]: ACTUS compliance is recommended but not mandatory. +The D-ASA source and documentation are released under the [AGPL-3.0 license](./LICENSE.md). diff --git a/docs/motivation.md b/docs/INTRO.md similarity index 92% rename from docs/motivation.md rename to docs/INTRO.md index e2fb453a..5ea72974 100644 --- a/docs/motivation.md +++ b/docs/INTRO.md @@ -11,7 +11,9 @@ benefits several players of the traditional value chain, such as issuers, arrang asset managers, risk managers, lenders, payment agents, transfer agents, etc. The *Debt Algorand Standard Application* turns a traditional debt instrument into -a deterministic financial contract, executed on the Algorand Virtual Machine (AVM). +a deterministic ACTUS financial contract, executed on the Algorand Virtual Machine +(AVM). + The machine-readable and executable contract removes existing frictions over the debt instruments lifecycle and reconciliation, enabling use cases such as truly atomic delivery-vs-payment (with instant finality and no counterparty risk), deterministic diff --git a/docs/READING-GUIDELINES.md b/docs/READING-GUIDELINES.md index be7c295e..920414a1 100644 --- a/docs/READING-GUIDELINES.md +++ b/docs/READING-GUIDELINES.md @@ -2,21 +2,20 @@ The keywords "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**MAY**", and "**OPTIONAL**" -in this document are to be interpreted as described in RFC -2119. +in this document are to be interpreted as described in [RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119). The data types (like `uint64`, `byte[]`, etc.) in this document are to be interpreted as specified in ARC-4. -Acronyms in square brackets like \\([THIS]\\) are to be interpreted as defined in -the ACTUS dictionary. +Acronyms in square brackets like \\( [THIS] \\) are to be interpreted as defined +in the [ACTUS dictionary](https://github.com/actusfrf/actus-dictionary). > Notes like this are non-normative Non-normative sections mainly contextualize the specification for technical readers unfamiliar with the financial concepts described. -{{#include ./_include/styles.md:example}} +> [!TIP] > Sections like this are examples aiming to clarify the specifications. ```text diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index a6255bba..c50e3f2c 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -6,114 +6,67 @@ # Introduction -- [Motivation](./motivation.md) +- [Motivation](./INTRO.md) - [Reading Guidelines](./READING-GUIDELINES.md) # Specification - [Overview](./specs/overview.md) -- [Trust Model]() +- [RBAC Model](./specs/rbac/overview.md) - [Roles](./specs/rbac/roles.md) - - [Role-Based Access Control (RBAC)](./specs/rbac/rbac.md) -- [Contract](specs/contract/intro.md) - - [Type](./specs/contract/type.md) + - [Role-Based Access Control](./specs/rbac/rbac.md) +- [Contract](./specs/contract/overview.md) + - [Introduction](./specs/contract/intro.md) + - [ACTUS Compliance Profile](./specs/contract/actus-compliance-profile.md) - [Denomination](./specs/contract/denomination.md) - - [Principal](./specs/contract/principal.md) - - [Interests](./specs/contract/interests.md) - - [Variable Interests](./specs/contract/variable-interests.md) - - [Time Schedule](./specs/contract/time-schedule.md) - - [Time Events](./specs/contract/time-events.md) - - [Time Periods](./specs/contract/time-periods.md) - - [Variable Time Schedule](./specs/contract/variable-time-schedule.md) - [Day-Count Convention](./specs/contract/day-count-convention.md) - - [Early Repayment Options](./specs/contract/early-repayment-options.md) - - [Performance](./specs/contract/performance.md) + - [Main Attributes](./specs/contract/attributes.md) + - [Kernel State and Schedule](./specs/contract/kernel-state-and-schedule.md) + - [Normalization and Configuration](./specs/contract/normalization-and-configuration.md) + - [Numeric Precision and Conversions](./specs/contract/numeric-precision.md) - [Metadata](./specs/contract/metadata.md) -- [Accounting]() - - [D-ASA Units](./specs/accounting/units.md) -- [Execution]() - - [Primary Market](./specs/execution/primary-market.md) +- [Accounting](./specs/accounting/overview.md) + - [Account](./specs/accounting/account.md) + - [Units and Positions](./specs/accounting/units.md) +- [Execution](./specs/execution/overview.md) + - [Time](./specs/execution/time.md) - [Payment Agent](./specs/execution/payment-agent/payment-agent.md) - [Settlement](./specs/execution/payment-agent/settlement.md) - - [Principal Repayment](./specs/execution/payment-agent/principal-repayment.md) - - [Early Repayment](./specs/execution/payment-agent/early-repayment.md) - - [Coupons Payment](./specs/execution/payment-agent/coupons-payment.md) - - [Transfer Agent](./specs/execution/transfer-agent.md) - - [Secondary Market](./specs/execution/secondary-market.md) + - [Transfer Agent](./specs/execution/transfer-agent/transfer-agent.md) + - [Primary Distribution](./specs/execution/transfer-agent/primary-market.md) + - [Secondary Market](./specs/execution/transfer-agent/secondary-market.md) + - [Delivery-vs-Payment](./specs/execution/transfer-agent/dvp.md) # Events - [Events](./events/events.md) +# SDK + +- [Overview](./sdk/overview.md) +- [Deploy and Attach](./sdk/deploy-and-attach.md) +- [Role Wrappers](./sdk/roles.md) +- [Actualized Positions and Valuation](./sdk/valuation.md) +- [OTC DvP Builder](./sdk/dvp.md) + # Interfaces -- [RBAC]() - - [Rotate Arranger](./interfaces/rbac/rotate-arranger.md) - - [Assign Role](./interfaces/rbac/assign-role.md) - - [Revoke Role](./interfaces/rbac/revoke-role.md) - - [Governance Asset Suspension](interfaces/rbac/gov-asset-suspension.md) - - [Get Arranger](./interfaces/rbac/get-arranger.md) - - [Get Roles](./interfaces/rbac/get-roles.md) - - [Get Role Config](./interfaces/rbac/get-role-config.md) - -- [Account]() - - [Open](interfaces/account/open.md) - - [Close](interfaces/account/close.md) - - [Update Payment Address](./interfaces/account/update-payment-address.md) - - [Governance Suspension](interfaces/account/gov-suspension.md) - - [Get Info](interfaces/account/get-info.md) - -- [Contract]() - - [Asset Config](./interfaces/contract/config.md) - - [Set Metadata](./interfaces/contract/set-metadata.md) - - [Set Amortizing Rates](./interfaces/contract/set-amortizing-rates.md) - - [Set Secondary Time Events](./interfaces/contract/set-secondary-time-events.md) - - [Set Early Repayment Option](./interfaces/contract/set-early-repayment-option.md) - - [Set Variable Interest Rate](./interfaces/contract/set-variable-interest-rate.md) - - [Set Default Status](./interfaces/contract/set-default-status.md) - - [Primary Distribution](./interfaces/contract/primary-distribution.md) - - [Update Total Units](./interfaces/contract/update-total-units.md) - - [Update Global Unit Value](./interfaces/contract/update-global-unit-value.md) - - [Update Interest Rate](./interfaces/contract/update-interest-rate.md) - - [Update Coupon Rates](./interfaces/contract/update-coupon-rates.md) - - [Update Time Events](./interfaces/contract/update-time-events.md) - - [Update Time Periods](./interfaces/contract/update-time-periods.md) - - [Get Asset Info](./interfaces/contract/get-asset-info.md) - - [Get Asset Metadata](./interfaces/contract/get-asset-metadata.md) - - [Get Account Units Value](./interfaces/contract/get-account-units-value.md) - - [Get Account Units Current Value](./interfaces/contract/get-account-units-current-value.md) - - [Get Time Events](./interfaces/contract/get-time-events.md) - - [Get Time Periods](./interfaces/contract/get-time-periods.md) - - [Get Payment Amount](./interfaces/contract/get-payment-amount.md) - - [Get Coupon Rates](./interfaces/contract/get-coupon-rates.md) - - [Get Coupon Status](./interfaces/contract/get-coupon-status.md) - - [Get Amortizing Rates](./interfaces/contract/get-amortizing-rates.md) - - [Get Secondary Market Schedule](./interfaces/contract/get-secondary-market-schedule.md) - - [Get Early Repayment Schedule](./interfaces/contract/get-early-repayment-schedule.md) - -- [Payment Agent]() - - [Pay Coupon](./interfaces/payment-agent/pay-coupon.md) - - [Pay Principal](./interfaces/payment-agent/pay-principal.md) - - [Early Repayment](interfaces/payment-agent/early-repayment.md) - -- [Transfer Agent]() - - [Asset Transfer](./interfaces/transfer-agent/asset-transfer.md) - -# Rationale - -- [Rationale](./rationale.md) +- [Interfaces](./interfaces/overview.md) + - [ABI Types](./interfaces/types.md) + - [RBAC Interface](./interfaces/rbac/overview.md) + - [Accounting Interface](./interfaces/account/overview.md) + - [ACTUS Kernel Interface](./interfaces/contract/overview.md) + - [Payment Agent Interface](./interfaces/payment-agent/overview.md) + - [Transfer Agent Interface](./interfaces/transfer-agent/overview.md) # Reference Implementation - [Reference Implementation](./implementation/reference-implementation.md) - [Architecture](./implementation/architecture.md) - - [Zero Coupon Bond](./implementation/ref-zero-coupon-bond.md) - - [Fixed Coupon Bond](./implementation/ref-fixed-coupon-bond.md) - - [Perpetual Bond](./implementation/ref-perpetual-bond.md) -- [Tests](./implementation/reference-implementation-tests.md) +- [Tests](./implementation/tests.md) - [DeepWiki (Experimental)](./implementation/deepwiki.md) --- [Contribution Guidelines](./CONTRIBUTIONS.md) -[License](LICENSE.md) +[License](./LICENSE.md) diff --git a/docs/_include/styles.md b/docs/_include/styles.md deleted file mode 100644 index 3ee93eb3..00000000 --- a/docs/_include/styles.md +++ /dev/null @@ -1,4 +0,0 @@ -// ANCHOR: example -> [!TIP] -> -// ANCHOR_END: example diff --git a/docs/events/events.md b/docs/events/events.md index e02b0a27..2d3b40af 100644 --- a/docs/events/events.md +++ b/docs/events/events.md @@ -1,69 +1,89 @@ # Events -The D-ASA implements ACTUS events as [ARC-28 events](https://dev.algorand.co/arc-standards/arc-0028/). +The D-ASA uses two distinct event concepts: -The following is the ACTUS event schema: +1. *ACTUS schedule events*: contractual events stored in the normalized execution +schedule. + +1. *ARC-28 execution events*: proofs that a scheduled event was actually applied +on chain. + +Those concepts are related, but they are not interchangeable. + +## ACTUS schedule events + +ACTUS schedule events live inside `ExecutionScheduleEntry` records in the boxed +schedule. They describe what the contract is expected to execute next. + +An ACTUS schedule event contains: + +- `event_id` +- `event_type` +- `scheduled_time` +- accrual factors +- next-state values +- flags + +Schedule events exist before execution and remain part of contract state even if +no ARC-28 proof has been emitted yet. + +See [Kernel State and Schedule](../specs/contract/kernel-state-and-schedule.md) +for the normative schedule definition. + +## ARC-28 execution events + +When the kernel applies a schedule entry, it emits an ARC-28 `ExecutionEvent` as +an execution proof. + +This proof is non-normative receipt data. It does not replace the kernel state, +and it does not define future schedule entries. Its purpose is to attest that a +given event was applied at a specific block time with a specific payoff and settlement +outcome. + +The current execution-proof schema is: ```json { - "name": "Event", - "desc": "ACTUS Event", + "name": "ExecutionEvent", + "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event", "args": [ - { - "type": "uint64", - "name": "contract_id", - "desc": "The Contract ID emitting the event" - }, - { - "type": "uint8", - "name": "type", - "desc": "The ACTUS Event type" - }, - { - "type": "string", - "name": "type_name", - "desc": "The ACTUS Event acronym" - }, - { - "type": "uint64", - "name": "time", - "desc": "The timestamp of the event (UNIX time)" - }, - { - "type": "uint64", - "name": "payoff", - "desc": "The payoff associated with the event (if any)" - }, - { - "type": "uint64", - "name": "currency_id", - "desc": "The currency ID (Asset ID on chain or ISO 4217 numeric code)" - }, - { - "type": "byte[]", - "name": "currency_unit", - "desc": "The unit name of the currency ID" - }, - { - "type": "uint64", - "name": "nominal_value", - "desc": "The nominal value at the time of the event" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } + { "name": "contract_id", "type": "uint64", "desc": "Application ID emitting the proof" }, + { "name": "event_id", "type": "uint64", "desc": "Executed schedule event identifier" }, + { "name": "event_type", "type": "uint8", "desc": "Executed ACTUS event type" }, + { "name": "scheduled_time", "type": "uint64", "desc": "Contractual due timestamp from the schedule" }, + { "name": "applied_at", "type": "uint64", "desc": "Block timestamp at which execution occurred" }, + { "name": "payoff", "type": "uint64", "desc": "Contractual payoff computed for the event" }, + { "name": "payoff_sign", "type": "uint8", "desc": "Payoff sign identifier" }, + { "name": "settled_amount", "type": "uint64", "desc": "Amount actually reserved or transferred on chain" }, + { "name": "currency_id", "type": "uint64", "desc": "Settlement asset identifier" }, + { "name": "sequence", "type": "uint64", "desc": "Monotonic proof sequence, currently event_id + 1" } ] } ``` -The D-ASA supports the following ACTUS event types: +## Proof semantics + +The following field distinctions are normative for interpreting the receipt: + +- `scheduled_time` is the contractual timestamp from the normalized ACTUS schedule. +- `applied_at` is the actual block timestamp at which the kernel applied the event. +- `payoff` is the contractual amount implied by the event. +- `settled_amount` is the amount actually reserved or transferred on chain. +- non-cash executions emit a proof with `settled_amount = 0`. + +## Supported ACTUS event identifiers + +The current kernel can emit proofs for the following ACTUS event types, subject +to contract-family compatibility: -| Type | Acronym | Description | -|------|------------|----------------------| -| `3` | \\( PR \\) | Principal Redemption | -| `8` | \\( IP \\) | Interest Payment | +| Type | Acronym | Description | +|:-----|:--------|:--------------------------------| +| `1` | `IED` | Initial Exchange Date | +| `3` | `PR` | Principal Redemption | +| `4` | `PI` | Principal Increase | +| `5` | `PRF` | Principal Redemption Fixing | +| `8` | `IP` | Interest Payment | +| `11` | `RRF` | Rate Reset Fixing | +| `12` | `RR` | Rate Reset | +| `18` | `IPCB` | Interest Calculation Base Reset | +| `19` | `MD` | Maturity | diff --git a/docs/implementation/architecture.md b/docs/implementation/architecture.md index 982d1fc1..571627c4 100644 --- a/docs/implementation/architecture.md +++ b/docs/implementation/architecture.md @@ -1,198 +1,101 @@ # Architecture -The D-ASA architecture is designed to support a wide range of financial products -and instrument types, fostering modularization and code reuse. +The current D-ASA architecture is layered, not product-specific. The on-chain contract +is a single `DASA` application assembled from five modules: -The financial contract specialization is executed compile-time composition. Each -concrete financial contract is built from _mixins_ that implement only the required -behavior. - -As a result, unused flows (e.g., coupon payment for zero coupon bonds, principal -repayment for perpetual bonds) are not part of the deployed program. - -## Architectural Axes - -The architecture is organized along four orthogonal axes: +```mermaid +flowchart LR + RBAC["RBAC"] --> KERNEL["ACTUS Kernel"] + KERNEL --> ACCOUNTING["Accounting"] + ACCOUNTING --> PAYMENT["Payment Agent"] + ACCOUNTING --> TRANSFER["Transfer Agent"] +``` -- Axis A: `RbacModule` and `AccountingModule` -- Axis B: Maturity-based core (`PAM`) vs Non-maturity-based core (`PBN`) -- Axis C: Coupon vs No-coupon cashflow -- Axis D: `CoreFinancial` (compute), `PaymentAgent` (execute payments), - `TransferAgent` (transfer ownership) +## Processing chain -## High-level architecture +The canonical processing chain is: ```mermaid -flowchart TD - RBAC["RbacModule"] --> ACC["AccountingModule"] - ACC --> CFC["CoreFinancialCommonMixin"] - CFC --> PAM["PAMCoreMixin (Maturity)"] - CFC --> PBN["PBNCoreMixin (Non-Maturity)"] - - PAM --> NC["NoCouponCashflowMixin"] - PAM --> FC["FixedCouponCashflowMixin"] - PBN --> PC["PerpetualCouponCashflowMixin"] - - CFC --> PAC["PaymentAgentCommonMixin"] - CFC --> TAC["TransferAgentCommonMixin"] - - PAC --> CPP["CouponPaymentAgentMixin"] - PAC --> PRP["PrincipalPaymentAgentMixin"] - PAC --> NPP["NoPrincipalPaymentMixin"] - - TAC --> CTA["CouponTransferAgentMixin"] - TAC --> NTA["NoCouponTransferAgentMixin"] - - NC --> ZCB["ZeroCouponBond"] - FC --> FCB["FixedCouponBond"] - PC --> PB["PerpetualBond"] - PRP --> ZCB - NTA --> ZCB - CPP --> FCB - PRP --> FCB - CTA --> FCB - CPP --> PB - NPP --> PB - CTA --> PB +flowchart LR + ACTUS["ACTUS Contract"] --> NORMALIZE["AVM Normalization"] + NORMALIZE --> ABI["ABI Upload"] + ABI --> EXEC["AVM Execution"] ``` -## Module responsibilities - -- `CoreFinancialCommonMixin`: shared asset configuration, schedule validation, and - state/getter primitives. - Must not do: payment settlement execution. - -- `PAMCoreMixin`: maturity-driven lifecycle and principal redemption authorization. - Must not do: perpetual-only logic. +This separation is intentional: -- `PBNCoreMixin`: non-maturity lifecycle and perpetual-oriented schedule base. - Must not do: maturity principal flow. +- ACTUS contract definition and schedule generation happen off chain. +- Normalization converts that contract into fixed-size AVM-compatible structs. +- The AVM kernel validates and executes the normalized lifecycle. -- `CouponCashflowMixin`: coupon due counting, coupon ordering constraints, and coupon-related - cashflow preconditions. - Must not do: settlement transfer execution. +## Module responsibilities -- `NoCouponCashflowMixin`: discount/accrual logic for no-coupon instruments. - Must not do: coupon sequencing logic. +- `RbacModule`: role assignment, suspension, contract default control, and +application-control methods. -- `PaymentAgentCommonMixin`: payment executability checks, liquidity checks, and - settlement transaction execution. - Must not do: interest/day-count formulas. +- `ActusKernelModule`: normalized-term validation, schedule storage, event cursor, +state transitions, and generic ACTUS getters. -- `CouponPaymentAgentMixin`: executes `pay_coupon` using core-computed amount and - core state transition hooks. - Must not do: coupon formula computation. +- `AccountingModule`: holder positions, unit activation, checkpoints, and claim +ledgers. -- `PrincipalPaymentAgentMixin`: executes `pay_principal` using core-computed amount - and core state transition hooks. - Must not do: maturity or coupon-ordering math. +- `PaymentAgent`: funding of due cash events and holder withdrawals. -- `NoPrincipalPaymentMixin`: explicit no-principal specialization (no `pay_principal`). - Must not do: expose principal payment flow. +- `TransferAgent`: primary distribution, transfer schedule, and settled unit transfers. -- `TransferAgentCommonMixin`: shared transfer-agent composition point. - Must not do: cashflow formulas. +## Public API by layer -- `CouponTransferAgentMixin`: ownership transfer with coupon-payment ordering guards - delegated to core hooks. - Must not do: coupon rate/day-count calculations. +| Layer | Public methods | +|:---------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| RBAC | `contract_update`, `rbac_rotate_arranger`, `rbac_set_op_daemon`, `rbac_assign_role`, `rbac_revoke_role`, `rbac_contract_suspension`, `rbac_contract_default`, `rbac_get_arranger`, `rbac_get_address_roles`, `rbac_get_role_validity` | +| Accounting | `account_suspension`, `account_open`, `account_update_payment_address`, `account_get_position` | +| ACTUS Kernel | `contract_create`, `contract_config`, `contract_schedule`, `contract_execute_ied`, `apply_non_cash_event`, `append_observed_cash_event`, `contract_get_state`, `contract_get_next_due_event` | +| Payment Agent | `fund_due_cashflows`, `claim_due_cashflows` | +| Transfer Agent | `transfer_set_schedule`, `primary_distribution`, `transfer` | -- `NoCouponTransferAgentMixin`: ownership transfer for no-coupon instruments with - accrual delegated to core hooks. - Must not do: coupon sequencing checks. +## Execution flows -## Composition Matrix +### Configuration ```mermaid -flowchart TD - PAM["PAM (Maturity Core)"] --> Z["ZeroCouponBond"] - PAM --> F["FixedCouponBond"] - PBN["PBN (Non-Maturity Core)"] --> P["PerpetualBond"] - - NOC["No-Coupon Cashflow"] --> Z - CUP["Coupon Cashflow"] --> F - CUP --> P - - PRIN["Principal Payment Agent"] --> Z - PRIN --> F - NOPR["No Principal Payment Agent"] --> P - - TRN["No-Coupon Transfer Agent"] --> Z - TRC["Coupon Transfer Agent"] --> F - TRC --> P +sequenceDiagram + participant SDK as "Normalization SDK" + participant ABI as "ABI Caller" + participant K as "ACTUS Kernel" + + SDK->>ABI: "NormalizedActusTerms + InitialKernelState + Schedule Pages" + ABI->>K: "contract_config(...)" + ABI->>K: "contract_schedule(page 0)" + ABI->>K: "contract_schedule(page n, is_last_page=true)" + ABI->>K: "primary_distribution(...)" + ABI->>K: "contract_execute_ied()" ``` -Current supported combinations: - -- `PAM + no-coupon` -> `ZeroCouponBond` -- `PAM + coupon` -> `FixedCouponBond` -- `PBN + coupon` -> `PerpetualBond` - -## Execution flow by agent +### Cash events ```mermaid sequenceDiagram - participant API as "External Caller / ABI" - participant PA as "PaymentAgent" - participant TA as "TransferAgent" - participant CF as "CoreFinancial" - participant SET as "Settlement (ASA Transfer)" - participant ACC as "Accounting State" - - API->>PA: "pay_coupon(holding_address, payment_info)" - PA->>CF: "core_prepare_coupon_payment(...)" - CF-->>PA: "computed amount + preconditions satisfied" - PA->>SET: "execute settlement transfer" - PA->>CF: "core_apply_coupon_payment(...)" - CF->>ACC: "update paid coupons / coupon units" - - API->>TA: "asset_transfer(sender, receiver, units)" - TA->>CF: "core_prepare_transfer_* (...)" - CF-->>TA: "accrued amount + transfer guards" - TA->>ACC: "transfer ownership units" - - Note over PA,TA: "Agents orchestrate execution, formulas in CoreFinancial" + participant ABI as "ABI Caller" + participant PA as "Payment Agent" + participant ACC as "Accounting" + + ABI->>PA: "fund_due_cashflows(max_event_count)" + PA->>ACC: "advance global indices and reserve funds" + ABI->>PA: "claim_due_cashflows(holding_address, payment_info)" + PA->>ACC: "settle holder checkpoints" + PA-->>ABI: "CashClaimResult" ``` -## Contract API surface +### Transfers -| Method / Surface | Zero | Fixed | Perpetual | -|--------------------------------------------------------------------------------|------|-------|-----------| -| `asset_config` | Yes | Yes | Yes | -| `asset_transfer` | Yes | Yes | Yes | -| `pay_coupon` | No | Yes | Yes | -| `pay_principal` | Yes | Yes | No | -| `update_interest_rate` | No | No | Yes | -| Core getters (`get_asset_info`, `get_time_events`, `get_asset_metadata`, etc.) | Yes | Yes | Yes | -| Coupon getters (`get_coupon_rates`, `get_coupons_status`) | No | Yes | Yes | -| `get_time_periods` | No | No | Yes | - -## Composition Safety - -Contract composition is validated at build time before contract compilation. - -- Agent mixins (`CouponTransferAgentMixin`, `NoCouponTransferAgentMixin`, - `CouponPaymentAgentMixin`, `PrincipalPaymentAgentMixin`) must resolve their core - hook methods to safe implementations. -- If a hook resolves to an unsafe default in agent-common mixins, build validation - fails before compilation. -- Core financial hook defaults also fail-closed with `INVALID_MIXIN_COMPOSITION` - and must be resolved by the expected cashflow/core mixins in the effective MRO. -- Unsafe default hooks are fail-closed and abort with `INVALID_MIXIN_COMPOSITION` - if reached. -- Build and deploy flows verify generated `.teal` and `.arc56.json` artifacts do - not contain `INVALID_MIXIN_COMPOSITION` markers. - -This prevents missing mixins or incorrect MRO ordering from silently producing -fail-open settlement behavior. - -## On-chain optimization outcome - -Contracts are assembled from only the mixins required for each product. This removes -unreachable logic from deployment artifacts and keeps method selectors, state usage, -and control flow minimal for each contract. - -Examples: - -- `ZeroCouponBond` excludes `pay_coupon`. -- `PerpetualBond` excludes `pay_principal`. +```mermaid +sequenceDiagram + participant ABI as "Holder" + participant TA as "Transfer Agent" + participant ACC as "Accounting" + + ABI->>TA: "transfer(sender, receiver, units)" + TA->>ACC: "settle sender" + TA->>ACC: "settle receiver" + TA->>ACC: "move active units" +``` diff --git a/docs/implementation/ref-fixed-coupon-bond.md b/docs/implementation/ref-fixed-coupon-bond.md deleted file mode 100644 index 027f3433..00000000 --- a/docs/implementation/ref-fixed-coupon-bond.md +++ /dev/null @@ -1,63 +0,0 @@ -# Fixed Coupon Bond - -## Contract Data Model - -| Property | ACTUS | Option | -|-------------------------|---------------|--------------------------| -| Type | \\([CT]\\) | \\([PAM]\\) | -| ID | \\([CID]\\) | D-ASA App ID | -| Denomination | \\([CUR]\\) | ASA | -| Settlement | \\([CURS]\\) | ASA | -| Interest | \\([IPNR]\\) | Fixed | -| Principal Discount | \\([PDIED]\\) | - | -| Time Schedule | \\([EVT]\\) | Events (Fixed) | -| Early Repayment Options | \\([PPEF]\\) | \\([N]\\) | -| Early Repayment Penalty | \\([PYTP]\\) | - | -| Day-Count Convention | \\([IPCD]\\) | \\([AA]\\) or Continuous | -| Calendar | \\([CLDR]\\) | \\([NC]\\) | -| Business Day Convention | \\([BDC]\\) | - | -| End of Month Convention | \\([EOMC]\\) | - | -| Performance | \\([PRF]\\) | Manual Default (Trustee) | -| Grace Period | \\([GRP]\\) | No | -| Delinquency Period | \\([DQP]\\) | No | - -## Contract Events - -| Event | ACTUS | Option | -|----------------------|-------------|-------------| -| Coupon Payments | \\([IP]\\) | Yes (Fixed) | -| Known Rate Updates | \\([RR]\\) | - | -| Unknown Rate Updates | \\([RRF]\\) | - | -| Maturity Date | \\([MD]\\) | Yes (Fixed) | -| Principal Repayment | \\([PR]\\) | At Maturity | -| Early Repayment | \\([PP]\\) | - | - -## Contract Execution - -| Execution | Option | -|----------------------|-------------------------| -| Primary Distribution | Direct placement | -| Primary Market | Placed at nominal value | -| Transfer Agent | Trustless | -| Payment Agent | Trustless, On-chain | -| Secondary Market | Yes | - -## Payment Agent - -Payments are trustless (i.e., can be triggered by anyone), as long as payments' -conditions are met (e.g., the payment is due). - -AVM fees (ALGO) for the execution of the cash flows are paid by who triggers the -cash flow. - -A coupon payment **cannot** be executed until all the previous due coupons (if -any) have been paid to all the investors. - -## Transfer Agent - -D-ASA units **cannot** be transferred until all the pending due coupon payments -for the sender and receiver (if any) have been executed. - -## Performance - -No grace period. No delinquency period. Default called manually by the trustee. diff --git a/docs/implementation/ref-perpetual-bond.md b/docs/implementation/ref-perpetual-bond.md deleted file mode 100644 index ef979f30..00000000 --- a/docs/implementation/ref-perpetual-bond.md +++ /dev/null @@ -1,70 +0,0 @@ -# Perpetual Bond - -## Contract Data Model - -| Property | ACTUS | Option | -|-------------------------|---------------|----------------------------| -| Type | \\([CT]\\) | \\([PBN]\\) | -| ID | \\([CID]\\) | D-ASA App ID | -| Denomination | \\([CUR]\\) | ASA | -| Settlement | \\([CURS]\\) | ASA | -| Interest | \\([IPNR]\\) | Variable (Interest Oracle) | -| Principal Discount | \\([PDIED]\\) | - | -| Time Schedule | \\([EVT]\\) | Events, Periods (Fixed) | -| Early Repayment Options | \\([PPEF]\\) | \\([N]\\) | -| Early Repayment Penalty | \\([PYTP]\\) | - | -| Day-Count Convention | \\([IPCD]\\) | \\([AA]\\) or Continuous | -| Calendar | \\([CLDR]\\) | \\([NC]\\) | -| Business Day Convention | \\([BDC]\\) | - | -| End of Month Convention | \\([EOMC]\\) | - | -| Performance | \\([PRF]\\) | Manual Default (Trustee) | -| Grace Period | \\([GRP]\\) | No | -| Delinquency Period | \\([DQP]\\) | No | - -## Contract Events - -| Event | ACTUS | Option | -|----------------------|-------------|-----------------| -| Coupon Payments | \\([IP]\\) | Yes (Perpetual) | -| Known Rate Updates | \\([RR]\\) | - | -| Unknown Rate Updates | \\([RRF]\\) | - | -| Maturity Date | \\([MD]\\) | No | -| Principal Repayment | \\([PR]\\) | No | -| Early Repayment | \\([PP]\\) | - | - -## Contract Execution - -| Execution | Option | -|----------------------|-------------------------| -| Primary Distribution | Direct placement | -| Primary Market | Placed at nominal value | -| Transfer Agent | Trustless | -| Payment Agent | Trustless, On-chain | -| Secondary Market | Yes | - -## Payment Agent - -Payments are trustless (i.e., can be triggered by anyone), as long as payments' -conditions are met (e.g., the payment is due). - -AVM fees (ALGO) for the execution of the cash flows are paid by who triggers the -cash flow. - -A coupon payment **cannot** be executed until all the previous due coupons (if -any) have been paid to all the investors. - -## Transfer Agent - -D-ASA units **cannot** be transferred until all the pending due coupon payments -for the sender and receiver (if any) have been executed. - -## Interest Rate - -Updated by the interest oracle. - -Interest rate **cannot** be updated until all the previous due coupons (if any) -have been paid to all the investors. - -## Performance - -No grace period. No delinquency period. Default called manually by the trustee. diff --git a/docs/implementation/ref-zero-coupon-bond.md b/docs/implementation/ref-zero-coupon-bond.md deleted file mode 100644 index eba8801a..00000000 --- a/docs/implementation/ref-zero-coupon-bond.md +++ /dev/null @@ -1,55 +0,0 @@ -# Zero Coupon Bond - -## Contract Data Model - -| Property | ACTUS | Option | -|-------------------------|---------------|--------------------------| -| Type | \\([CT]\\) | \\([PAM]\\) | -| ID | \\([CID]\\) | D-ASA App ID | -| Denomination | \\([CUR]\\) | ASA | -| Settlement | \\([CURS]\\) | ASA | -| Interest | \\([IPNR]\\) | - | -| Principal Discount | \\([PDIED]\\) | Yes | -| Time Schedule | \\([EVT]\\) | Events (Fixed) | -| Early Repayment Options | \\([PPEF]\\) | \\([N]\\) | -| Early Repayment Penalty | \\([PYTP]\\) | - | -| Day-Count Convention | \\([IPCD]\\) | \\([AA]\\) or Continuous | -| Calendar | \\([CLDR]\\) | \\([NC]\\) | -| Business Day Convention | \\([BDC]\\) | - | -| End of Month Convention | \\([EOMC]\\) | - | -| Performance | \\([PRF]\\) | Manual Default (Trustee) | -| Grace Period | \\([GRP]\\) | No | -| Delinquency Period | \\([DQP]\\) | No | - -## Contract Events - -| Event | ACTUS | Option | -|----------------------|-------------|-------------| -| Coupon Payments | \\([IP]\\) | No | -| Known Rate Updates | \\([RR]\\) | - | -| Unknown Rate Updates | \\([RRF]\\) | - | -| Maturity Date | \\([MD]\\) | Yes (Fixed) | -| Principal Repayment | \\([PR]\\) | At Maturity | -| Early Repayment | \\([PP]\\) | - | - -## Contract Execution - -| Execution | Option | -|----------------------|---------------------| -| Primary Distribution | Direct placement | -| Primary Market | Placed at discount | -| Transfer Agent | Trustless | -| Payment Agent | Trustless, On-chain | -| Secondary Market | Yes | - -## Payment Agent - -Payments are trustless (i.e., can be triggered by anyone), as long as payments' -conditions are met (e.g., the payment is due). - -AVM fees (ALGO) for the execution of the cash flows are paid by who triggers the -cash flow. - -## Performance - -No grace period. No delinquency period. Default called manually by the trustee. diff --git a/docs/implementation/reference-implementation-tests.md b/docs/implementation/reference-implementation-tests.md deleted file mode 100644 index 5ee73b67..00000000 --- a/docs/implementation/reference-implementation-tests.md +++ /dev/null @@ -1,40 +0,0 @@ -# Tests {#tests} - -The D-ASA project is developed with AlgoKit. - -- Install AlgoKit -- Setup your virtual environment (managed with Poetry) - -```shell -algokit bootstrap all -``` - -- Start your Algorand LocalNet (requires Docker) - -```shell -algokit localnet start -``` - -- Run tests (managed with PyTest) - -```shell -algokit project run test -``` - -or, for verbose results: - -```shell -poetry run pytest -s -v tests//.py -``` - -## Coverage Principles - -- Module-level RBAC and Accounting behavior in `tests/module_*` (both with stand-alone -mocked modules and concrete contracts). - -- Shared CoreFinancial behavior is validated through `tests/shared/*` and runs on: - - `zero_coupon_bond` - - `fixed_coupon_bond` - - `perpetual_bond` - -- Product-specific financial behavior is validated in contract-specific suites. diff --git a/docs/implementation/reference-implementation.md b/docs/implementation/reference-implementation.md index 220113c7..f4dfeddd 100644 --- a/docs/implementation/reference-implementation.md +++ b/docs/implementation/reference-implementation.md @@ -1,76 +1,33 @@ # Reference Implementation {#reference-implementation} -> ⚠️The reference implementations have not been audited. Do not use this code for +> ⚠️The reference implementation has not been audited. Do not use this code for > real products. The author declines all responsibility. -> ⚠️The reference implementation does not guarantee compliance with ACTUS reference -> implementation. +The reference implementation exposes one canonical on-chain contract, `DASA`, and +composes it from five modules: -The reference implementation provides the following features: +- `RbacModule` +- `ActusKernelModule` +- `AccountingModule` +- `PaymentAgent` +- `TransferAgent` -- RBAC and Accounting: - - Arranger: creates, configures and updates the D-ASA - - Account Manager: opens and closes accounts (proxy a KYC process) - - Primary Dealer: performs the primary distribution on the primary market - - Trustee: can call a default - - Authority: can suspend accounts or the whole asset - - Interest Oracle: can update the interest rate in case of variable rates +The implementation executes normalized ACTUS schedules on the AVM and currently +supports the kernel contract families `PAM`, `ANN`, `NAM`, `LAM`, `LAX`, and `CLM`. -- Types: - - Zero Coupon Bond - - Fixed Coupon Bond - - Perpetual Bond +## Delivered artifacts -- Denomination: - - On-chain (ASA) - - Off-chain +The canonical artifacts are: -- Payment Agent (Settlement): - - On-chain (ASA) +- `src/d_asa/artifacts/DASA.arc56.json` +- `src/d_asa/artifacts/dasa_client.py` +- `src/d_asa/artifacts/dasa_avm_client.py` -- Day-count conventions: - - Actual/Actual (time periods must be in days, i.e., multiples of `86400` seconds) - - Continuous +The deployment helpers in `smart_contracts/d_asa/deploy_config.py` provide code-accurate +demo normalization flows for: -- Transfer Agent: - - On-chain - - Direct (i.e., from investor to investor) +- a PAM fixed coupon bond profile; +- a PAM zero coupon bond profile. -- Secondary market - -- Notarize metadata (e.g., prospectus, etc.) - -- Updatable program (restricted to the Arranger) - -## Architecture - -The reference implementation architecture is structured in composable modules with -a clear separation of concerns: - -- RBAC Module -- Accounting Module -- Core Financial Module - - Common Cashflow Utilities - - Coupon Cashflow - - No-coupon Cashflow -- Payment Agent -- Transfer Agent - -The concrete financial contract inherits mixins to achieve compile-time specialization -across the ACTUS Contract Types (e.g., `PAM`, `PBN`), so each deployed contract -includes only the logic it actually needs. - -## Deployments {#deployments} - -D-ASA examples deployed on TestNet: - -| Type | App ID | App Spec | -|-------------------------------------------------|-------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------| -| [Zero Coupon Bond](./ref-zero-coupon-bond.md) | 756574705 | ARC-56 | -| [Fixed Coupon Bond](./ref-fixed-coupon-bond.md) | 756574716 | ARC-56 | -| [Perpetual Bond](./ref-perpetual-bond.md) | 756574702 | ARC-56 | - -1. Download the App Spec JSON file; -1. Navigate to the Lora App Lab; -1. Create the App Interface using the existing App ID and App Spec JSON; -1. Explore the D-ASA interface. +Those demos are examples of normalized inputs to the shared kernel, not separate +contract classes with different public ABIs. diff --git a/docs/implementation/tests.md b/docs/implementation/tests.md new file mode 100644 index 00000000..484d866c --- /dev/null +++ b/docs/implementation/tests.md @@ -0,0 +1,58 @@ +# Tests {#tests} + +The D-ASA project is developed with AlgoKit. + +- Install AlgoKit +- Setup your virtual environment (managed with Poetry) + +```shell +algokit bootstrap all +``` + +- Start your Algorand LocalNet (requires Docker) + +```shell +algokit localnet start +``` + +- Run tests (managed with PyTest) + +```shell +algokit project run test +``` + +or, for verbose results: + +```shell +poetry run pytest -s -v tests//.py +``` + +The repository also includes a D-ASA showcase walkthrough that prints the +normalized ACTUS schedule beside the real ARC-28 execution proofs and realized +cashflows for PAM fixed coupon and zero coupon bonds: + +```shell +poetry run pytest -s -v -m showcase tests/pam/test_pam_lifecycle_showcase.py +``` + +## Coverage Areas + +- `tests/sdk/*` covers the Python-side SDK and normalization layer: contract + builders, schedules, day-count conventions, registry mappings, models, and + deploy configuration helpers. + +- `tests/mock_module_rbac/*` exercises RBAC behavior in isolation through the + dedicated mock module artifact. + +- `tests/pam/fcb/*` and `tests/pam/zcb/*` run end-to-end PAM lifecycle tests on + LocalNet for fixed coupon and zero coupon bonds, including schedule upload, + `IED`, cashflow funding, holder claims, and final contract state. + +- `tests/pam/test_pam_lifecycle_showcase.py` is the narrative walkthrough suite + for new users. It prints the normalized ACTUS schedule beside the emitted + ARC-28 execution receipts and realized cashflows. It is marked `showcase` and + excluded from the default `algokit project run test` command. + +- Shared fixtures live in `tests/conftest.py`, `tests/pam/conftest.py`, and + `tests/conftest_helpers.py`; helper decoding and time-warp utilities live in + `tests/utils.py`. diff --git a/docs/interfaces/account/close.md b/docs/interfaces/account/close.md deleted file mode 100644 index 92febec6..00000000 --- a/docs/interfaces/account/close.md +++ /dev/null @@ -1,43 +0,0 @@ -# Account Close - -```json -{ - "name": "account_close", - "desc": "Close D-ASA account", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "desc": "Closed units, Timestamp of the account closing" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - } - ] -} - -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller or if the operation is not authorized. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -does not exist. diff --git a/docs/interfaces/account/get-info.md b/docs/interfaces/account/get-info.md deleted file mode 100644 index 5c18bfd8..00000000 --- a/docs/interfaces/account/get-info.md +++ /dev/null @@ -1,29 +0,0 @@ -# Account Get Info - -```json -{ - "name": "account_get_info", - "desc": "Get account account info", - "readonly": true, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(address,uint64,uint64,uint64,bool)", - "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" - }, - "errors": [ - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid Holding Address" - } - ] -} -``` - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Sender -or Receiver Holding Address is invalid. diff --git a/docs/interfaces/account/gov-suspension.md b/docs/interfaces/account/gov-suspension.md deleted file mode 100644 index 1e500712..00000000 --- a/docs/interfaces/account/gov-suspension.md +++ /dev/null @@ -1,41 +0,0 @@ -# Account Governance Suspension - -```json -{ - "name": "account_gov_suspension", - "desc": "Set account suspension status", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set account suspension status" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -does not exist. diff --git a/docs/interfaces/account/open.md b/docs/interfaces/account/open.md deleted file mode 100644 index 5f5f3a7d..00000000 --- a/docs/interfaces/account/open.md +++ /dev/null @@ -1,54 +0,0 @@ -# Account Open - -```json -{ - "name": "account_open", - "desc": "Open D-ASA account", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account opening" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller or if the operation is not authorized. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -already exists. diff --git a/docs/interfaces/account/overview.md b/docs/interfaces/account/overview.md new file mode 100644 index 00000000..7f4629cc --- /dev/null +++ b/docs/interfaces/account/overview.md @@ -0,0 +1,70 @@ +# Accounting Interface + +The Accounting interface manages holder positions and account-level suspension. + +## `account_suspension` + +```json +{ + "name": "account_suspension", + "readonly": false, + "args": [ + { "name": "holding_address", "type": "address" }, + { "name": "suspended", "type": "bool" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the suspension update" }, + "errors": ["UNAUTHORIZED", "INVALID_HOLDING_ADDRESS"] +} +``` + +Only an active Authority may call this method. + +## `account_open` + +```json +{ + "name": "account_open", + "readonly": false, + "args": [ + { "name": "holding_address", "type": "address" }, + { "name": "payment_address", "type": "address" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the account opening" }, + "errors": ["UNAUTHORIZED", "DEFAULTED", "SUSPENDED", "INVALID_HOLDING_ADDRESS"] +} +``` + +Only an active Account Manager may call this method. + +The current implementation treats an already existing holding address as `INVALID_HOLDING_ADDRESS`. + +## `account_update_payment_address` + +```json +{ + "name": "account_update_payment_address", + "readonly": false, + "args": [ + { "name": "holding_address", "type": "address" }, + { "name": "payment_address", "type": "address" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the account update" }, + "errors": ["UNAUTHORIZED", "DEFAULTED", "SUSPENDED", "INVALID_HOLDING_ADDRESS"] +} +``` + +Only the Account Holding Address itself may call this method. + +## `account_get_position` + +```json +{ + "name": "account_get_position", + "readonly": true, + "args": [ + { "name": "holding_address", "type": "address" } + ], + "returns": { "type": "AccountPosition", "desc": "Full holder accounting position" }, + "errors": ["INVALID_HOLDING_ADDRESS"] +} +``` diff --git a/docs/interfaces/account/update-payment-address.md b/docs/interfaces/account/update-payment-address.md deleted file mode 100644 index 4176b224..00000000 --- a/docs/interfaces/account/update-payment-address.md +++ /dev/null @@ -1,54 +0,0 @@ -# Update Payment Address - -```json -{ - "name": "account_update_payment_address", - "desc": "Update Payment Address of an account", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by the Holding -Address. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -does not exist. diff --git a/docs/interfaces/contract/config.md b/docs/interfaces/contract/config.md deleted file mode 100644 index 373ceb81..00000000 --- a/docs/interfaces/contract/config.md +++ /dev/null @@ -1,168 +0,0 @@ -# Asset Config - -```json -{ - "name": "asset_config", - "desc": "Configure the Debt Algorand Standard Application", - "readonly": false, - "args": [ - { - "type": "uint64", - "name": "denomination_asset_id", - "desc": "Denomination asset identifier" - }, - { - "type": "uint64", - "name": "settlement_asset_id", - "desc": "Settlement asset identifier" - }, - { - "type": "uint64", - "name": "principal", - "desc": "Principal, expressed in denomination asset" - }, - { - "type": "uint16", - "name": "principal_discount", - "desc": "Discount on principal in bps" - }, - { - "type": "uint64", - "name": "minimum_denomination", - "desc": "Minimum denomination, expressed in denomination asset" - }, - { - "type": "uint8", - "name": "day_count_convention_id", - "desc": "Day-count convention for interests calculation" - }, - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rates in bps" - }, - { - "type": "uint16[]", - "name": "coupon_rates", - "desc": "Coupon interest rates in bps" - }, - { - "type": "uint64[]", - "name": "time_events", - "desc": "Time events (strictly ascending order)" - }, - { - "type": "(uint64,uint64)[]", - "name": "time_periods", - "desc": "Time periods of recurring time events" - } - ], - "returns": { - "type": "void" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "ALREADY_CONFIGURED", - "message": "D-ASA already configured" - }, - { - "code": "INVALID_DENOMINATION", - "message": "Denomination asset is not properly set" - }, - { - "code": "INVALID_MINIMUM_DENOMINATION", - "message": "Minimum denomination is not a divisor of principal" - }, - { - "code": "INVALID_DAY_COUNT_CONVENTION", - "message": "Invalid day-count convention ID" - }, - { - "code": "INVALID_INTEREST_RATE", - "message": "Interest rate is not properly defined" - }, - { - "code": "INVALID_TIME_EVENTS_LENGTH", - "message": "Time events length is invalid" - }, - { - "code": "INVALID_TIME", - "message": "Time events must be set in the future" - }, - { - "code": "INVALID_SORTING", - "message": "Time events are not sorted correctly" - }, - { - "code": "INVALID_TIME_PERIOD_DURATION", - "message": "Time period durations must be greater than zero" - }, - { - "code": "INVALID_SETTLEMENT_ASSET", - "message": "Different settlement asset not supported, must be equal to denomination asset" - }, - { - "code": "INVALID_TIME_PERIODS", - "message": "Time periods not properly set" - }, - { - "code": "INVALID_TIME_PERIOD_REPETITIONS", - "message": "Time period repetitions not properly set" - }, - { - "code": "INVALID_COUPON_RATES", - "message": "Coupon rates not properly set" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `ALREADY_CONFIGURED` error code if the D-ASA has -been already configured. - -The call **MUST** fail with the `INVALID_DENOMINATION` error code if the *denomination -asset* is not properly set for the specific implementation. - -The call **MUST** fail with the `INVALID_MINIMUM_DENOMINATION` error code if the -*minimum denomination* is not a divisor of the *principal*. - -The call **MUST** fail with the `INVALID_DAY_COUNT_CONVENTION` error code if the -*day-count convention* ID is invalid. - -The call **MUST** fail with the `INVALID_INTEREST_RATE` error code if the *interest -rate* is not properly set for the specific implementation. - -The call **MUST** fail with the `INVALID_TIME_EVENTS_LENGTH` error code if the length -of the *time events* is not greater than or equal to: - -- *total coupons* + `3`, if the D-ASA **has not** a defined *maturity date*; -- *total coupons* + `4`, if the D-ASA **has** a defined *maturity date*. - -The call **MUST** fail with the `INVALID_TIME` error code if the first *time event* -is earlier than the latest timestamp (or block height). - -The call **MUST** fail with the `INVALID_SORTING` error code if the *time events* -are not sorted in strictly ascending order. - -The call **MUST** fail with the `INVALID_TIME_PERIOD_DURATION` error code if the -*time period durations* are not strictly greater than zero. - -The call **MAY** fail with the `INVALID_SETTLEMENT_ASSET` error code if a *settlement -asset* different from the *denomination asset* is not supported by the specific -implementation. - -The call **MAY** fail with the `INVALID_TIME_PERIODS` error code if the *time periods* -are not properly set for the specific implementation. - -The call **MAY** fail with the `INVALID_TIME_PERIOD_REPETITIONS` error code if the -*time period repetitions* are not properly set for the specific implementation. - -The call **MAY** fail with the `INVALID_COUPON_RATES` error code if the *coupon -rates* are not properly set for the specific implementation. diff --git a/docs/interfaces/contract/get-account-units-current-value.md b/docs/interfaces/contract/get-account-units-current-value.md deleted file mode 100644 index 382104e1..00000000 --- a/docs/interfaces/contract/get-account-units-current-value.md +++ /dev/null @@ -1,64 +0,0 @@ -# Get Account Units Current Value - -```json -{ - "name": "get_account_units_current_value", - "desc": "Get account's current units value and accrued interest", - "readonly": true, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Account's units for the current value calculation" - } - ], - "returns": { - "type": "(uint64,uint64,(uint64,uint64))", - "desc": "Units current value in denomination asset, Accrued interest in denomination asset, (Day count factor numerator, Day count factor denominator)" - }, - "errors": [ - { - "code": "NO_PRIMARY_DISTRIBUTION", - "message": "Primary distribution not yet executed" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid Holding Address" - }, - { - "code": "INVALID_UNITS", - "message": "Invalid amount of units for the account" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment for the account" - } - ] -} -``` - -The call **MUST** fail with the `NO_PRIMARY_DISTRIBUTION` error code if the method -is called before the *primary distribution opening date*. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Sender -or Receiver Holding Address is invalid. - -The call **MUST** fail with the `INVALID_UNITS` error code if the *unit* value is -greater than Account D-ASA units. - -If the D-ASA has coupons, the call **MUST** fail with the `PENDING_COUPON_PAYMENT` -error code if there is an old due coupon still to be paid to any account. - -The *accrued interest* **MUST** `0` if the method is called before the *issuance -date*. - -If the D-ASA has fixed coupons, the *accrued interest* **MUST** be `0` after all -coupons are due. - -If the D-ASA has zero coupons, the *accrued interest* **MUST** be `0` after the -*maturity date*. diff --git a/docs/interfaces/contract/get-account-units-value.md b/docs/interfaces/contract/get-account-units-value.md deleted file mode 100644 index d0764bdc..00000000 --- a/docs/interfaces/contract/get-account-units-value.md +++ /dev/null @@ -1,48 +0,0 @@ -# Get Account Units Value - -```json -{ - "name": "get_account_units_value", - "desc": "Get account's units nominal value", - "readonly": true, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Account's units for the nominal value calculation" - } - ], - "returns": { - "type": "uint64", - "desc": "Units nominal value in denomination asset" - }, - "errors": [ - { - "code": "NO_PRIMARY_DISTRIBUTION", - "message": "Primary distribution not yet executed" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid Holding Address" - }, - { - "code": "INVALID_UNITS", - "message": "Invalid amount of units for the account" - } - ] -} -``` - -The call **MUST** fail with the `NO_PRIMARY_DISTRIBUTION` error code if the method -is called before the *primary distribution opening date*. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Sender -or Receiver Holding Address is invalid. - -The call **MUST** fail with the `INVALID_UNITS` error code if the *unit* value is -greater than Account D-ASA units. diff --git a/docs/interfaces/contract/get-amortizing-rates.md b/docs/interfaces/contract/get-amortizing-rates.md deleted file mode 100644 index fd3cf539..00000000 --- a/docs/interfaces/contract/get-amortizing-rates.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Amortizing Rates - -```json -{ - "name": "get_amortizing_rates", - "desc": "Get D-ASA principal amortizing rates", - "readonly": true, - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Principal amortizing rates" - } -} -``` diff --git a/docs/interfaces/contract/get-asset-info.md b/docs/interfaces/contract/get-asset-info.md deleted file mode 100644 index 9ec3b977..00000000 --- a/docs/interfaces/contract/get-asset-info.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Asset Info - -```json -{ - "name": "get_asset_info", - "desc": "Get D-ASA info", - "readonly": true, - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64, uint64,uint64,uint64,bool,uint8)", - "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Principal discount, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" - } -} -``` diff --git a/docs/interfaces/contract/get-asset-metadata.md b/docs/interfaces/contract/get-asset-metadata.md deleted file mode 100644 index 6c19a144..00000000 --- a/docs/interfaces/contract/get-asset-metadata.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Asset Metadata - -```json -{ - "name": "get_asset_metadata", - "desc": "Get D-ASA metadata", - "readonly": true, - "args": [], - "returns": { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" - } -} -``` diff --git a/docs/interfaces/contract/get-coupon-rates.md b/docs/interfaces/contract/get-coupon-rates.md deleted file mode 100644 index 4a11ccbb..00000000 --- a/docs/interfaces/contract/get-coupon-rates.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Coupon Rates - -```json -{ - "name": "get_coupons_rates", - "desc": "Get D-ASA coupon rates", - "readonly": true, - "args": [], - "returns": { - "type": "uint16[]", - "desc": "Coupon rates" - } -} -``` diff --git a/docs/interfaces/contract/get-coupon-status.md b/docs/interfaces/contract/get-coupon-status.md deleted file mode 100644 index 674b31bc..00000000 --- a/docs/interfaces/contract/get-coupon-status.md +++ /dev/null @@ -1,19 +0,0 @@ -# Get Coupons Status - -```json -{ - "name": "get_coupons_status", - "desc": "Get D-ASA coupons status", - "readonly": true, - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,(uint64,uint64),bool)", - "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator) , All coupons due paid" - } -} -``` - -The *next coupon due date* value **MUST** be `0` if all coupons are due. - -The *day count factor* values **MUST** `0` if the method is called before the *issuance -date* or if all coupons are due. diff --git a/docs/interfaces/contract/get-early-repayment-schedule.md b/docs/interfaces/contract/get-early-repayment-schedule.md deleted file mode 100644 index c3be4aa1..00000000 --- a/docs/interfaces/contract/get-early-repayment-schedule.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Early Repayment Schedule - -```json -{ - "name": "get_early_repayment_schedule", - "desc": "Get early repayment schedule", - "readonly": true, - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Early repayment schedule" - } -} -``` diff --git a/docs/interfaces/contract/get-payment-amount.md b/docs/interfaces/contract/get-payment-amount.md deleted file mode 100644 index ee697263..00000000 --- a/docs/interfaces/contract/get-payment-amount.md +++ /dev/null @@ -1,53 +0,0 @@ -# Get Payment Amount - -```json -{ - "name": "get_payment_amount", - "desc": "Get the next payment amount", - "readonly": true, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "desc": "Interest amount in denomination asset, Principal amount in denomination asset" - }, - "errors": [ - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid Holding Address" - } - ] -} -``` - -The getter **MUST** return the next payment amount for the account or `0` if there -is no payment to execute for the account. - -The getter **MUST** return the interest and the principal components separately. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with `4` coupons. The account already received `2` coupon payments. -> The getter returns the interest amount of the 3rd coupon. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with `4` coupons and a principal amortizing schedule. The account -> already received `2` coupon payments. The getter returns the interest amount of -> the 3rd coupon and the amortized principal. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with `4` coupons and principal at maturity. The account already -> received `4` coupon payments. The getter returns the amount of the principal repayment. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with zero coupons and principal at maturity. The principal -> is not yet mature. The getter returns the amount of the principal repayment. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with perpetual coupons and no callable principal. The account -> already received `N` coupon payments. The getter returns the interest amount of -> the `N+1` coupon. diff --git a/docs/interfaces/contract/get-secondary-market-schedule.md b/docs/interfaces/contract/get-secondary-market-schedule.md deleted file mode 100644 index d65901d3..00000000 --- a/docs/interfaces/contract/get-secondary-market-schedule.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Secondary Market Schedule - -```json -{ - "name": "get_secondary_market_schedule", - "desc": "Get secondary market schedule", - "readonly": true, - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Secondary market schedule" - } -} -``` diff --git a/docs/interfaces/contract/get-time-events.md b/docs/interfaces/contract/get-time-events.md deleted file mode 100644 index 3bd0c204..00000000 --- a/docs/interfaces/contract/get-time-events.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Time Events - -```json -{ - "name": "get_time_events", - "desc": "Get D-ASA time events", - "readonly": true, - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Time events" - } -} -``` diff --git a/docs/interfaces/contract/get-time-periods.md b/docs/interfaces/contract/get-time-periods.md deleted file mode 100644 index fc327414..00000000 --- a/docs/interfaces/contract/get-time-periods.md +++ /dev/null @@ -1,14 +0,0 @@ -# Get Time Periods - -```json -{ - "name": "get_time_periods", - "desc": "Get D-ASA time periods", - "readonly": true, - "args": [], - "returns": { - "type": "(uint64,uint64)[]", - "desc": "Time periods" - } -} -``` diff --git a/docs/interfaces/contract/overview.md b/docs/interfaces/contract/overview.md new file mode 100644 index 00000000..0793e404 --- /dev/null +++ b/docs/interfaces/contract/overview.md @@ -0,0 +1,182 @@ +# ACTUS Kernel Interface + +The ACTUS Kernel interface configures the normalized contract, stores the execution +schedule, and advances non-cash lifecycle events. + +## `contract_create` + +```json +{ + "name": "contract_create", + "create": "require", + "readonly": false, + "args": [ + { "name": "arranger", "type": "address" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of contract creation" }, + "errors": [] +} +``` + +## `contract_config` + +```json +{ + "name": "contract_config", + "readonly": false, + "args": [ + { "name": "terms", "type": "NormalizedActusTerms" }, + { "name": "initial_state", "type": "InitialKernelState" }, + { "name": "prospectus", "type": "Prospectus" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of contract configuration" }, + "errors": [ + "UNAUTHORIZED", + "ALREADY_CONFIGURED", + "INVALID_ACTUS_CONFIG", + "INVALID_DAY_COUNT_CONVENTION", + "INVALID_DENOMINATION", + "INVALID_SETTLEMENT_ASSET", + "INVALID_IED" + ] +} +``` + +Only the Arranger may call this method. + +## `contract_schedule` + +```json +{ + "name": "contract_schedule", + "readonly": false, + "args": [ + { "name": "schedule_page_index", "type": "uint64" }, + { "name": "is_last_page", "type": "bool" }, + { "name": "schedule_page", "type": "ExecutionSchedulePage" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the schedule upload" }, + "errors": [ + "UNAUTHORIZED", + "ALREADY_CONFIGURED", + "TERMS_NOT_CONFIGURED", + "INVALID_SCHEDULE_PAGE", + "INVALID_EVENT_ID", + "INVALID_ACTUS_CONFIG", + "INVALID_SORTING" + ] +} +``` + +Only the Arranger may call this method. + +## `contract_execute_ied` + +```json +{ + "name": "contract_execute_ied", + "readonly": false, + "args": [], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the IED execution" }, + "errors": [ + "NOT_CONFIGURED", + "UNAUTHORIZED", + "DEFAULTED", + "SUSPENDED", + "INVALID_EVENT_CURSOR", + "INVALID_EVENT_TYPE", + "NO_DUE_CASHFLOW", + "INVALID_ACTUS_CONFIG", + "PRIMARY_DISTRIBUTION_INCOMPLETE" + ] +} +``` + +Only the Arranger may call this method. + +## `apply_non_cash_event` + +```json +{ + "name": "apply_non_cash_event", + "readonly": false, + "args": [ + { "name": "event_id", "type": "uint64" }, + { "name": "payload", "type": "ObservedEventRequest" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the event application" }, + "errors": [ + "NOT_CONFIGURED", + "DEFAULTED", + "SUSPENDED", + "OBSERVED_EVENT_REQUIRED", + "UNAUTHORIZED", + "INVALID_EVENT_ID", + "INVALID_EVENT_CURSOR", + "INVALID_EVENT_TYPE", + "INVALID_SCHEDULE_PAGE", + "INVALID_ACTUS_CONFIG", + "INVALID_SORTING", + "NO_DUE_CASHFLOW", + "PENDING_IED" + ] +} +``` + +`RR` and `RRF` execution is Observer-controlled. Other non-cash events are Arranger-controlled. + +## `append_observed_cash_event` + +```json +{ + "name": "append_observed_cash_event", + "readonly": false, + "args": [ + { "name": "payload", "type": "ObservedCashEventRequest" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the append operation" }, + "errors": [ + "NOT_CONFIGURED", + "UNAUTHORIZED", + "DEFAULTED", + "SUSPENDED", + "PENDING_IED", + "OBSERVED_EVENT_REQUIRED", + "INVALID_EVENT_ID", + "INVALID_EVENT_TYPE", + "INVALID_SCHEDULE_PAGE", + "INVALID_ACTUS_CONFIG", + "INVALID_SORTING" + ] +} +``` + +## `contract_get_state` + +```json +{ + "name": "contract_get_state", + "readonly": true, + "args": [], + "returns": { "type": "KernelState", "desc": "Current kernel state snapshot" }, + "errors": ["NOT_CONFIGURED"] +} +``` + +`KernelState` does not include the separate RBAC-managed `defaulted` performance +flag. Clients that need that value must read the dedicated global-state key. + +## `contract_get_next_due_event` + +```json +{ + "name": "contract_get_next_due_event", + "readonly": true, + "args": [], + "returns": { + "type": "ExecutionScheduleEntry", + "desc": "Next due schedule entry, or a zero sentinel if the contract ended" + }, + "errors": ["NOT_CONFIGURED"] +} +``` diff --git a/docs/interfaces/contract/primary-distribution.md b/docs/interfaces/contract/primary-distribution.md deleted file mode 100644 index c4181a60..00000000 --- a/docs/interfaces/contract/primary-distribution.md +++ /dev/null @@ -1,75 +0,0 @@ -# Primary Distribution - -```json -{ - "name": "primary_distribution", - "desc": "Distribute D-ASA units to accounts according the primary market", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to distribute" - } - ], - "returns": { - "type": "uint64", - "desc": "Remaining D-ASA units to be distributed" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - }, - { - "code": "ZERO_UNITS", - "message": "Cannot distribute zero units" - }, - { - "code": "OVER_DISTRIBUTION", - "message": "Insufficient remaining D-ASA units" - }, - { - "code": "PRIMARY_DISTRIBUTION_CLOSED", - "message": "Primary distribution is closed" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by the authorized -primary market entity. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -associated with the holding address does not exist. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `ZERO_UNITS` error code if the distributing units -are null. - -The call **MUST** fail with the `OVER_DISTRIBUTION` error code if there are no sufficient -remaining D-ASA units for the primary distribution. - -The call **MUST** fail with the `PRIMARY_DISTRIBUTION_CLOSED` error code if the -*primary distribution* is closed. diff --git a/docs/interfaces/contract/set-amortizing-rates.md b/docs/interfaces/contract/set-amortizing-rates.md deleted file mode 100644 index 82b1fda3..00000000 --- a/docs/interfaces/contract/set-amortizing-rates.md +++ /dev/null @@ -1,63 +0,0 @@ -# Set Amortizing Rates - -```json -{ - "name": "set_amortizing_rates", - "desc": "Set principal amortizing rates", - "readonly": false, - "args": [ - { - "type": "uint16[]", - "name": "amortizing_rates", - "desc": "Principal amortizing rates in bps" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set rates" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_AMORTIZING_RATES_LENGTH", - "message": "Amortizing rates length is invalid" - }, - { - "code": "INVALID_RATES", - "message": "Sum of amortizing rates must be equal to 10000 bps" - }, - { - "code": "INVALID_PAST_RATE", - "message": "Past amortizing rates can not be modified" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_AMORTIZING_RATES_LENGTH` error code if -the length of the *amortizing rates* is not equal to *total\_coupons* plus `1`. - -The call **MUST** fail with the `INVALID_RATES` error code if the sum of *amortizing -rates* is not equal to 10,000 bps. - -The call **MUST** fail with the `INVALID_PAST_RATE` error code if a past amortizing -rate is modified. diff --git a/docs/interfaces/contract/set-default-status.md b/docs/interfaces/contract/set-default-status.md deleted file mode 100644 index 9ac908f0..00000000 --- a/docs/interfaces/contract/set-default-status.md +++ /dev/null @@ -1,29 +0,0 @@ -# Set Default Status - -```json -{ - "name": "set_default_status", - "desc": "Set D-ASA default status", - "readonly": false, - "args": [ - { - "type": "bool", - "name": "defaulted", - "desc": "Default status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set status" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. diff --git a/docs/interfaces/contract/set-early-repayment-option.md b/docs/interfaces/contract/set-early-repayment-option.md deleted file mode 100644 index f7b852b2..00000000 --- a/docs/interfaces/contract/set-early-repayment-option.md +++ /dev/null @@ -1,82 +0,0 @@ -# Set Early Repayment Option - -```json -{ - "name": "set_early_repayment_option", - "desc": "Set early repayment schedule and eventual penalty rate", - "readonly": false, - "args": [ - { - "type": "uint64[]", - "name": "time_events", - "desc": "Early repayment time events (strictly ascending order)" - }, - { - "type": "uint64", - "name": "penalty_rate", - "desc": "Early repayment penalty rate (absolute or relative), if any" - } - ], - "returns": { - "type": "(uint64, uint64)", - "desc": "Early repayments start date, Early repayments end date" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_TIME_EVENTS_LENGTH", - "message": "Time events length is invalid" - }, - { - "code": "INVALID_SORTING", - "message": "Time events are not sorted correctly" - }, - { - "code": "INVALID_EARLY_REPAYMENT_START_DATE", - "message": "Invalid early repayment start date" - }, - { - "code": "INVALID_EARLY_REPAYMENT_END_DATE", - "message": "Invalid early repayment end date" - }, - { - "code": "INVALID_PAST_EVENT", - "message": "Past time events can not be modified" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_TIME_EVENTS_LENGTH` error code if the length -of the *time events* is not greater than or equal to `2`. - -The call **MUST** fail with the `INVALID_SORTING` error code if the *time events* -are not sorted in strictly ascending order. - -The call **MUST** fail with the `INVALID_EARLY_REPAYMENT_START_DATE` error code -if the *early repayment start date* is earlier than the *issuance date*. - -The call **MUST** fail with the `INVALID_EARLY_REPAYMENT_END_DATE` error code if -the *early repayment end date* is later than the *maturity date*. - -The call **MUST** fail with the `INVALID_PAST_EVENT` error code if a past event -is modified. diff --git a/docs/interfaces/contract/set-metadata.md b/docs/interfaces/contract/set-metadata.md deleted file mode 100644 index 0bc74f8e..00000000 --- a/docs/interfaces/contract/set-metadata.md +++ /dev/null @@ -1,76 +0,0 @@ -# Set Asset Metadata - -```json -{ - "name": "set_metadata", - "desc": "Set D-ASA metadata", - "readonly": false, - "args": [ - { - "type": "uint8", - "name": "contract_type", - "desc": "Contract type" - }, - { - "type": "uint8", - "name": "calendar", - "desc": "Calendar [default 0]" - }, - { - "type": "uint8", - "name": "business_day_convention", - "desc": "Business day convention [default 0]" - }, - { - "type": "uint8", - "name": "end_of_month_convention", - "desc": "End of month convention [default 0]" - }, - { - "type": "uint8", - "name": "prepayment_effect", - "desc": "Early repayment effect [default 0]" - }, - { - "type": "uint8", - "name": "penalty_type", - "desc": "Early repayment penalty type [default 0]" - }, - { - "type": "byte[32]", - "name": "prospectus_hash", - "desc": "Prospectus hash" - }, - { - "type": "string", - "name": "prospectus_url", - "desc": "Prospectus URL" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set metadata" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Asset operations are suspended" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. diff --git a/docs/interfaces/contract/set-secondary-time-events.md b/docs/interfaces/contract/set-secondary-time-events.md deleted file mode 100644 index 9a702827..00000000 --- a/docs/interfaces/contract/set-secondary-time-events.md +++ /dev/null @@ -1,78 +0,0 @@ -# Set Secondary Time Events - -```json -{ - "name": "set_secondary_time_events", - "desc": "Set secondary market time schedule", - "readonly": false, - "args": [ - { - "type": "uint64[]", - "name": "secondary_market_time_events", - "desc": "Secondary market time events (strictly ascending order)" - } - ], - "returns": { - "type": "(uint64, uint64)", - "desc": "Secondary market opening date, Secondary market closure date" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_TIME_EVENTS_LENGTH", - "message": "Time events length is invalid" - }, - { - "code": "INVALID_SORTING", - "message": "Time events are not sorted correctly" - }, - { - "code": "INVALID_SECONDARY_OPENING_DATE", - "message": "Invalid secondary market opening date" - }, - { - "code": "INVALID_SECONDARY_CLOSURE_DATE", - "message": "Invalid secondary market closure date" - }, - { - "code": "INVALID_PAST_EVENT", - "message": "Past time events can not be modified" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_TIME_EVENTS_LENGTH` error code if the length -of the *time events* is not greater than or equal to `1`. - -The call **MUST** fail with the `INVALID_SORTING` error code if the *time events* -are not sorted in strictly ascending order. - -The call **MUST** fail with the `INVALID_SECONDARY_OPENING_DATE` error code if the -*secondary market opening date* is earlier than the *issuance date*. - -The call **MUST** fail with the `INVALID_SECONDARY_CLOSURE_DATE` error code if the -*secondary market closure date* is earlier than the *secondary market opening date* -or later than the *maturity date*. - -The call **MUST** fail with the `INVALID_PAST_EVENT` error code if a past event -is modified. diff --git a/docs/interfaces/contract/set-variable-interest-rate.md b/docs/interfaces/contract/set-variable-interest-rate.md deleted file mode 100644 index 6fea582d..00000000 --- a/docs/interfaces/contract/set-variable-interest-rate.md +++ /dev/null @@ -1,60 +0,0 @@ -# Set Variable Rate - -```json -{ - "name": "set_variable_interest_rate", - "desc": "Set D-ASA variable interest rate", - "readonly": false, - "args": [ - { - "type": "uint16", - "name": "spread", - "desc": "Spread in bps" - }, - { - "type": "uint16", - "name": "life_cap", - "desc": "Rate life cap in bps" - }, - { - "type": "uint16", - "name": "life_floor", - "desc": "Rate life floor in bps" - }, - { - "type": "uint16", - "name": "period_cap", - "desc": "Rate period cap in bps" - }, - { - "type": "uint16", - "name": "period_floor", - "desc": "Rate period floor in bps" - }, - { - "type": "uint64", - "name": "fixing_period", - "desc": "Rate fixing period (UNIX time)" - } - ], - "returns": { - "type": "void" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Asset operations are suspended" - } - ] -} -``` - -TODO: Add specs diff --git a/docs/interfaces/contract/update-coupon-rates.md b/docs/interfaces/contract/update-coupon-rates.md deleted file mode 100644 index 539b526c..00000000 --- a/docs/interfaces/contract/update-coupon-rates.md +++ /dev/null @@ -1,62 +0,0 @@ -# Update Coupon Rates - -```json -{ - "name": "update_coupon_rates", - "desc": "Update variable coupon interest rates in bps", - "readonly": false, - "args": [ - { - "type": "uint16[]", - "name": "coupon_rates", - "desc": "Coupon interest rates in bps" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Asset operations are suspended" - }, - { - "code": "INVALID_COUPON_RATES_LENGTH", - "message": "Coupon rates length is not equal to total coupons" - }, - { - "code": "INVALID_PAST_RATE", - "message": "Due coupon rates can not be modified" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. - -The call **MUST** fail with the `INVALID_COUPON_RATES_LENGTH` error code if the -length of the *coupon rates* is not equal to *total_coupons*. - -The call **MUST** fail with the `INVALID_PAST_RATE` error code if a due coupon rate -is modified. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. diff --git a/docs/interfaces/contract/update-global-unit-value.md b/docs/interfaces/contract/update-global-unit-value.md deleted file mode 100644 index b2dbab08..00000000 --- a/docs/interfaces/contract/update-global-unit-value.md +++ /dev/null @@ -1,48 +0,0 @@ -# Update Global Unit Value - -```json -{ - "name": "update_global_unit_value", - "desc": "Update D-ASA nominal unit value globally", - "readonly": false, - "args": [ - { - "type": "uint64", - "name": "unit_value", - "desc": "D-ASA nominal unit value, expressed in denomination asset" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Asset operations are suspended" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. diff --git a/docs/interfaces/contract/update-interest-rate.md b/docs/interfaces/contract/update-interest-rate.md deleted file mode 100644 index 95bdf90b..00000000 --- a/docs/interfaces/contract/update-interest-rate.md +++ /dev/null @@ -1,48 +0,0 @@ -# Update Interest Rate - -```json -{ - "name": "update_interest_rate", - "desc": "Update variable interest rates in bps", - "readonly": false, - "args": [ - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rate in bps" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Asset operations are suspended" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. diff --git a/docs/interfaces/contract/update-time-events.md b/docs/interfaces/contract/update-time-events.md deleted file mode 100644 index 940fc1c6..00000000 --- a/docs/interfaces/contract/update-time-events.md +++ /dev/null @@ -1,76 +0,0 @@ -# Update Time Events - -```json -{ - "name": "update_time_events", - "desc": "Update D-ASA variable time schedule", - "readonly": false, - "args": [ - { - "type": "uint64[]", - "name": "time_events", - "desc": "D-ASA time events (strictly ascending order)" - } - ], - "returns": { - "type": "(uint64, uint64, uint64, uint64, uint64)", - "desc": "Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Timestamp of the update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_TIME_EVENTS_LENGTH", - "message": "Time events length is invalid" - }, - { - "code": "INVALID_TIME", - "message": "Time events must be set in the future" - }, - { - "code": "INVALID_SORTING", - "message": "Time events are not sorted correctly" - }, - { - "code": "INVALID_PAST_EVENT", - "message": "Past time events can not be modified" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. - -The call **MUST** fail with the `INVALID_TIME_EVENTS_LENGTH` error code if the length -of the *time events* is not equal to *total\_coupons* plus `4`. - -The call **MUST** fail with the `INVALID_TIME` error code if the first *time event* -is earlier than the latest timestamp (or block height). - -The call **MUST** fail with the `INVALID_SORTING` error code if the *time events* -are not sorted in strictly ascending order. - -The call **MUST** fail with the `INVALID_PAST_EVENT` error code if a past event -is modified. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. diff --git a/docs/interfaces/contract/update-time-periods.md b/docs/interfaces/contract/update-time-periods.md deleted file mode 100644 index b0cb2160..00000000 --- a/docs/interfaces/contract/update-time-periods.md +++ /dev/null @@ -1,56 +0,0 @@ -# Update Time Periods - -```json -{ - "name": "update_time_periods", - "desc": "Update D-ASA variable time periods", - "readonly": false, - "args": [ - { - "type": "(uint64,uint64)[]", - "name": "time_periods", - "desc": "D-ASA time periods" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_TIME_PERIOD", - "message": "Time period durations must be greater than zero" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} - -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. - -The call **MUST** fail with the `INVALID_TIME_PERIOD` error code if the *time period -durations* are not strictly greater than zero. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. diff --git a/docs/interfaces/contract/update-total-units.md b/docs/interfaces/contract/update-total-units.md deleted file mode 100644 index 693b0e7a..00000000 --- a/docs/interfaces/contract/update-total-units.md +++ /dev/null @@ -1,48 +0,0 @@ -# Update Total Units - -```json -{ - "name": "update_total_units", - "desc": "Update D-ASA total_units", - "readonly": false, - "args": [ - { - "type": "uint64", - "name": "total_units", - "desc": "D-ASA total units" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the update" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Asset operations are suspended" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MAY** fail with the `SUSPENDED` error code if the asset is suspended. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. diff --git a/docs/interfaces/overview.md b/docs/interfaces/overview.md new file mode 100644 index 00000000..d93dc810 --- /dev/null +++ b/docs/interfaces/overview.md @@ -0,0 +1,4 @@ +# Interfaces + +The interface section documents the public ARC-4 ABI grouped by architecture layer, +plus the ABI structs used by those methods. diff --git a/docs/interfaces/payment-agent/early-repayment.md b/docs/interfaces/payment-agent/early-repayment.md deleted file mode 100644 index 2ac8e350..00000000 --- a/docs/interfaces/payment-agent/early-repayment.md +++ /dev/null @@ -1,100 +0,0 @@ -# Early Repayment - -```json -{ - "name": "early_repayment", - "desc": "Pay the principal to an account before maturity", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to repay" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "returns": { - "type": "(uint64, uint64, byte[])", - "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment information" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - }, - { - "code": "NO_UNITS", - "message": "No D-ASA units" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment for the account" - }, - { - "code": "ZERO_UNITS", - "message": "Can not repay zero units" - }, - { - "code": "OVER_REPAYMENT", - "message": "Insufficient units to repay for the account" - }, - { - "code": "ALREADY_MATURE", - "message": "Already mature" - } - ] -} -``` - -The call **MUST** remove D-ASA early rapid units from the Account Holding Address -and from circulation. - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `SUSPENDED` error code if the asset operations or -any account involved in the transfers are suspended. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Sender -or Receiver Holding Address is invalid. - -The call **MUST** fail with the `NO_UNITS` error code if the Account has no D-ASA -units. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -a due coupon still to be paid for the Account. - -The call **MUST** fail with the `ZERO_UNITS` error code if the distributing units -are null. - -The call **MUST** fail with the `OVER_REPAYMENT` error code if there are no sufficient -remaining D-ASA units to repay. - -The call **MUST** fail with the `ALREADY_MATURE` error code if the principal is -mature. - -If the D-ASA has on-chain payment agent, the call **MUST** fail with the `NOT_ENOUGH_FUNDS` -error code if funds are not enough for the payment. diff --git a/docs/interfaces/payment-agent/overview.md b/docs/interfaces/payment-agent/overview.md new file mode 100644 index 00000000..fb910485 --- /dev/null +++ b/docs/interfaces/payment-agent/overview.md @@ -0,0 +1,54 @@ +# Payment Agent Interface + +The Payment Agent interface funds due ACTUS cash events and allows holder claims. + +## `fund_due_cashflows` + +```json +{ + "name": "fund_due_cashflows", + "readonly": false, + "args": [ + { "name": "max_event_count", "type": "uint64" } + ], + "returns": { "type": "CashFundingResult", "desc": "Funding result for the processed events" }, + "errors": [ + "NOT_CONFIGURED", + "UNAUTHORIZED", + "DEFAULTED", + "SUSPENDED", + "PENDING_IED", + "NO_DUE_CASHFLOW", + "NOT_ENOUGH_FUNDS" + ] +} +``` + +Only the Arranger may call this method. + +## `claim_due_cashflows` + +```json +{ + "name": "claim_due_cashflows", + "readonly": false, + "args": [ + { "name": "holding_address", "type": "address" }, + { "name": "payment_info", "type": "byte[]" } + ], + "returns": { "type": "CashClaimResult", "desc": "Holder claim result" }, + "errors": [ + "NOT_CONFIGURED", + "INVALID_HOLDING_ADDRESS", + "UNAUTHORIZED", + "DEFAULTED", + "SUSPENDED", + "PENDING_IED", + "NO_DUE_CASHFLOW", + "NOT_ENOUGH_FUNDS" + ] +} +``` + +If the holder's payment path is not executable, the method reports the claimable +amounts without clearing them. diff --git a/docs/interfaces/payment-agent/pay-coupon.md b/docs/interfaces/payment-agent/pay-coupon.md deleted file mode 100644 index 3ddcb893..00000000 --- a/docs/interfaces/payment-agent/pay-coupon.md +++ /dev/null @@ -1,92 +0,0 @@ -# Pay Coupon - -```json -{ - "name": "pay_coupon", - "desc": "Pay due coupon to an account", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "events": [ - { - "type_name": "IP" - } - ], - "returns": { - "type": "(uint64, uint64, byte[])", - "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - }, - { - "code": "NO_UNITS", - "message": "No D-ASA units" - }, - { - "code": "NO_DUE_COUPON", - "message": "No due coupon to pay" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - }, - { - "code": "NOT_ENOUGH_FUNDS", - "message": "Not enough funds for the payment" - } - ] -} -``` - -> A reference implementation **SHOULD NOT** require an authorized caller. - -If the D-ASA has an amortizing principal payment schedule, the call **MUST** update -the Account's *unit value*. - -If the call requires authorization, it **MUST** fail with the `UNAUTHORIZED` error -code if not called by an authorized caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -does not exist. - -The call **MUST** fail with the `NO_UNITS` error code if the Account has no D-ASA -units. - -The call **MUST** fail with the `NO_DUE_COUPON` error code if there is no due -coupon left to pay for the Account. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -an old due coupon still to be paid to any account. - -If the D-ASA has on-chain payment agent, the call **MUST** fail with the `NOT_ENOUGH_FUNDS` -error code if funds are not enough for the payment. diff --git a/docs/interfaces/payment-agent/pay-principal.md b/docs/interfaces/payment-agent/pay-principal.md deleted file mode 100644 index d9c04e52..00000000 --- a/docs/interfaces/payment-agent/pay-principal.md +++ /dev/null @@ -1,88 +0,0 @@ -# Pay Principal - -```json -{ - "name": "pay_principal", - "desc": "Pay the outstanding principal to an account", - "readonly": false, - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "events": [ - { - "type_name": "PR" - } - ], - "returns": { - "type": "(uint64, uint64, byte[])", - "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - }, - { - "code": "NO_UNITS", - "message": "No D-ASA units" - }, - { - "code": "NOT_MATURE", - "message": "Not mature" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -> A reference implementation **SHOULD NOT** require an authorized caller. - -The call **MUST** remove D-ASA units from the Account Holding Address and from -circulation. - -If the call requires authorization, it **MUST** fail with the `UNAUTHORIZED` error -code if not called by an authorized caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `SUSPENDED` error code if the asset operations are -suspended. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Account -does not exist. - -The call **MUST** fail with the `NO_UNITS` error code if the Account has no D-ASA -units. - -The call **MUST** fail with the `NOT_MATURE` error code if the principal is not -mature. - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -any due coupon still to be paid. - -If the D-ASA has on-chain payment agent, the call **MUST** fail with the `NOT_ENOUGH_FUNDS` -error code if funds are not enough for the payment. diff --git a/docs/interfaces/rbac/assign-role.md b/docs/interfaces/rbac/assign-role.md deleted file mode 100644 index 646d508e..00000000 --- a/docs/interfaces/rbac/assign-role.md +++ /dev/null @@ -1,59 +0,0 @@ -# RBAC Assign Role - -```json -{ - "name": "rbac_assign_role", - "desc": "Assign a role to an address", - "readonly": false, - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "INVALID_ROLE", - "message": "Invalid role identifier" - }, - { - "code": "INVALID_ROLE_ADDRESS", - "message": "Invalid account role address" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an -authorized. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `INVALID_ROLE` error code if the *role identifier* -is invalid. - -The call **MUST** fail with the `INVALID_ROLE_ADDRESS` error code if the *role -address* has been already assigned to the *role*. diff --git a/docs/interfaces/rbac/get-arranger.md b/docs/interfaces/rbac/get-arranger.md deleted file mode 100644 index 8d49bff0..00000000 --- a/docs/interfaces/rbac/get-arranger.md +++ /dev/null @@ -1,15 +0,0 @@ -# RBAC Get Arranger - -```json -{ - "name": "rbac_get_arranger", - "desc": "Get Arranger address", - "readonly": true, - "args": [], - "returns": { - "type": "address", - "desc": "Arranger address" - }, - "errors": [] -} -``` diff --git a/docs/interfaces/rbac/get-role-config.md b/docs/interfaces/rbac/get-role-config.md deleted file mode 100644 index 0ceeef6d..00000000 --- a/docs/interfaces/rbac/get-role-config.md +++ /dev/null @@ -1,35 +0,0 @@ -# RBAC Get Role Config - -```json -{ - "name": "rbac_get_role_config", - "desc": "Get role configuration", - "readonly": true, - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "byte[]", - "desc": "Role configuration" - }, - "errors": [ - { - "code": "INVALID_ROLE", - "message": "Invalid role identifier" - }, - { - "code": "INVALID_ROLE_ADDRESS", - "message": "Invalid account role address" - } - ] -} -``` diff --git a/docs/interfaces/rbac/get-roles.md b/docs/interfaces/rbac/get-roles.md deleted file mode 100644 index f4f55273..00000000 --- a/docs/interfaces/rbac/get-roles.md +++ /dev/null @@ -1,14 +0,0 @@ -# RBAC Get Roles - -```json -{ - "name": "rbac_get_roles", - "desc": "Get role identifiers", - "readonly": true, - "args": [], - "returns": { - "type": "uint8[]", - "desc": "Role identifiers" - } -} -``` diff --git a/docs/interfaces/rbac/gov-asset-suspension.md b/docs/interfaces/rbac/gov-asset-suspension.md deleted file mode 100644 index 4abbaa57..00000000 --- a/docs/interfaces/rbac/gov-asset-suspension.md +++ /dev/null @@ -1,29 +0,0 @@ -# RBAC Governance Asset Suspension - -```json -{ - "name": "rbac_gov_asset_suspension", - "desc": "Set asset suspension status", - "readonly": false, - "args": [ - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set asset suspension status" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. diff --git a/docs/interfaces/rbac/overview.md b/docs/interfaces/rbac/overview.md new file mode 100644 index 00000000..b983a543 --- /dev/null +++ b/docs/interfaces/rbac/overview.md @@ -0,0 +1,158 @@ +# RBAC Interface + +The RBAC interface manages privileged roles, suspension state, contract default +state, and application control. + +Only the Arranger may call RBAC methods, unless otherwise specified. + +## `contract_update` + +```json +{ + "name": "contract_update", + "readonly": false, + "args": [], + "returns": { "type": "void" }, + "errors": ["UNAUTHORIZED"] +} +``` + +## `rbac_rotate_arranger` + +```json +{ + "name": "rbac_rotate_arranger", + "readonly": false, + "args": [ + { "name": "new_arranger", "type": "address" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the rotation" }, + "errors": ["UNAUTHORIZED"] +} +``` + +## `rbac_set_op_daemon` + +```json +{ + "name": "rbac_set_op_daemon", + "readonly": false, + "args": [ + { "name": "address", "type": "address" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the assignment" }, + "errors": ["UNAUTHORIZED"] +} +``` + +This is a non-normative helper for payment automation. + +## `rbac_assign_role` + +```json +{ + "name": "rbac_assign_role", + "readonly": false, + "args": [ + { "name": "role_id", "type": "uint8" }, + { "name": "role_address", "type": "address" }, + { "name": "validity", "type": "RoleValidity" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the assignment" }, + "errors": ["UNAUTHORIZED", "DEFAULTED", "INVALID_ROLE", "INVALID_ROLE_ADDRESS"] +} +``` + +## `rbac_revoke_role` + +```json +{ + "name": "rbac_revoke_role", + "readonly": false, + "args": [ + { "name": "role_id", "type": "uint8" }, + { "name": "role_address", "type": "address" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the revocation" }, + "errors": ["UNAUTHORIZED", "DEFAULTED", "INVALID_ROLE", "INVALID_ROLE_ADDRESS"] +} +``` + +## `rbac_contract_suspension` + +```json +{ + "name": "rbac_contract_suspension", + "readonly": false, + "args": [ + { "name": "suspended", "type": "bool" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the suspension update" }, + "errors": ["UNAUTHORIZED"] +} +``` + +Only an active Authority may call this method. + +## `rbac_contract_default` + +```json +{ + "name": "rbac_contract_default", + "readonly": false, + "args": [ + { "name": "defaulted", "type": "bool" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the default update" }, + "errors": ["UNAUTHORIZED"] +} +``` + +Only an active Trustee may call this method. + +It sets or clears the contract-level `defaulted` performance flag. This flag is +distinct from the kernel lifecycle `status`. + +## `rbac_get_arranger` + +```json +{ + "name": "rbac_get_arranger", + "readonly": true, + "args": [], + "returns": { "type": "address", "desc": "Current arranger address" }, + "errors": [] +} +``` + +## `rbac_get_address_roles` + +```json +{ + "name": "rbac_get_address_roles", + "readonly": true, + "args": [ + { "name": "address", "type": "address" } + ], + "returns": { + "type": "(bool,bool,bool,bool,bool)", + "desc": "Account manager, primary dealer, trustee, authority, observer" + }, + "errors": [] +} +``` + +## `rbac_get_role_validity` + +```json +{ + "name": "rbac_get_role_validity", + "readonly": true, + "args": [ + { "name": "role_id", "type": "uint8" }, + { "name": "role_address", "type": "address" } + ], + "returns": { "type": "RoleValidity", "desc": "Stored validity interval" }, + "errors": ["INVALID_ROLE", "INVALID_ROLE_ADDRESS"] +} +``` diff --git a/docs/interfaces/rbac/revoke-role.md b/docs/interfaces/rbac/revoke-role.md deleted file mode 100644 index db5cd107..00000000 --- a/docs/interfaces/rbac/revoke-role.md +++ /dev/null @@ -1,54 +0,0 @@ -# RBAC Revoke Role - -```json -{ - "name": "rbac_revoke_role", - "desc": "Revoke a role from an address", - "readonly": false, - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role revocation" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "INVALID_ROLE", - "message": "Invalid role identifier" - }, - { - "code": "INVALID_ROLE_ADDRESS", - "message": "Invalid account role address" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller or if the operation is not authorized. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `INVALID_ROLE` error code if the *role identifier* -is invalid. - -The call **MUST** fail with the `INVALID_ROLE_ADDRESS` error code if the Account -Role Address is invalid. diff --git a/docs/interfaces/rbac/rotate-arranger.md b/docs/interfaces/rbac/rotate-arranger.md deleted file mode 100644 index 82d5e44a..00000000 --- a/docs/interfaces/rbac/rotate-arranger.md +++ /dev/null @@ -1,28 +0,0 @@ -# RBAC Rotate Arranger - -```json -{ - "name": "rbac_rotate_arranger", - "desc": "Rotate Arranger role to a new address", - "readonly": false, - "args": [ - { - "type": "address", - "name": "new_arranger", - "desc": "New Arranger address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - } - ] -} -``` - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by the Arranger. diff --git a/docs/interfaces/transfer-agent/asset-transfer.md b/docs/interfaces/transfer-agent/asset-transfer.md deleted file mode 100644 index 878c0ed1..00000000 --- a/docs/interfaces/transfer-agent/asset-transfer.md +++ /dev/null @@ -1,105 +0,0 @@ -# Asset Transfer - -```json -{ - "name": "asset_transfer", - "desc": "Transfer D-ASA units between accounts", - "readonly": false, - "args": [ - { - "type": "address", - "name": "sender_holding_address", - "desc": "Sender Account Holding Address" - }, - { - "type": "address", - "name": "receiver_holding_address", - "desc": "Receiver Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to transfer" - } - ], - "returns": { - "type": "uint64", - "desc": "Transferred actualized value in denomination asset" - }, - "errors": [ - { - "code": "UNAUTHORIZED", - "message": "Not authorized" - }, - { - "code": "DEFAULTED", - "message": "Defaulted" - }, - { - "code": "SUSPENDED", - "message": "Suspended operations" - }, - { - "code": "INVALID_HOLDING_ADDRESS", - "message": "Invalid account holding address" - }, - { - "code": "SECONDARY_MARKET_CLOSED", - "message": "Secondary market is closed" - }, - { - "code": "SELF_TRANSFER", - "message": "Sender and receiver must be different" - }, - { - "code": "NULL_TRANSFER", - "message": "Transfer units must be greater than zero" - }, - { - "code": "OVER_TRANSFER", - "message": "Insufficient sender units to transfer" - }, - { - "code": "NON_FUNGIBLE_UNITS", - "message": "Sender and receiver units are not fungible" - }, - { - "code": "PENDING_COUPON_PAYMENT", - "message": "Pending due coupon payment" - } - ] -} -``` - -The call **MUST** transfer D-ASA units from the Sender Account Holding Address (removing -D-ASA units) to the Receiver Account Holding Address (adding D-ASA units). - -The call **MUST** fail with the `UNAUTHORIZED` error code if not called by an authorized -caller. - -The call **MUST** fail with the `DEFAULTED` error code if the asset is defaulted. - -The call **MUST** fail with the `SUSPENDED` error code if the asset operations or -any account involved in the transfers are suspended. - -The call **MUST** fail with the `INVALID_HOLDING_ADDRESS` error code if the Sender -or Receiver Holding Address is invalid. - -The call **MUST** fail with the `SECONDARY_MARKET_CLOSED` error code if the secondary -market is closed. - -The call **MUST** fail with the `SELF_TRANSFER` error code if the Sender and Receiver -Holding Addresses are the same. - -The call **MUST** fail with the `NULL_TRANSFER` error code if the transfer units -are zero. - -The call **MUST** fail with the `OVER_TRANSFER` error code if the Sender Account -Holding Address has insufficient D-ASA units to transfer. - -The call **MUST** fail with the `NON_FUNGIBLE_UNITS` error code if the Sender and -Receiver units are not fungible (e.g. different paid coupons, see D-ASA units fungibility -section). - -The call **MUST** fail with the `PENDING_COUPON_PAYMENT` error code if there is -a due coupon still to be paid to the Sender Holding Address. diff --git a/docs/interfaces/transfer-agent/overview.md b/docs/interfaces/transfer-agent/overview.md new file mode 100644 index 00000000..65eeaa06 --- /dev/null +++ b/docs/interfaces/transfer-agent/overview.md @@ -0,0 +1,75 @@ +# Transfer Agent Interface + +The Transfer Agent interface manages transfer windows, primary allocations, and +secondary transfers. + +## `transfer_set_schedule` + +```json +{ + "name": "transfer_set_schedule", + "readonly": false, + "args": [ + { "name": "open_date", "type": "uint64" }, + { "name": "closure_date", "type": "uint64" } + ], + "returns": { "type": "uint64", "desc": "UNIX timestamp of the schedule update" }, + "errors": ["UNAUTHORIZED", "INVALID_SORTING"] +} +``` + +Only the Arranger may call this method. + +## `primary_distribution` + +```json +{ + "name": "primary_distribution", + "readonly": false, + "args": [ + { "name": "holding_address", "type": "address" }, + { "name": "units", "type": "uint64" } + ], + "returns": { "type": "uint64", "desc": "Remaining undistributed unit balance" }, + "errors": [ + "NOT_CONFIGURED", + "UNAUTHORIZED", + "DEFAULTED", + "SUSPENDED", + "PRIMARY_DISTRIBUTION_CLOSED", + "INVALID_HOLDING_ADDRESS", + "ZERO_UNITS", + "OVER_DISTRIBUTION" + ] +} +``` + +## `transfer` + +```json +{ + "name": "transfer", + "readonly": false, + "args": [ + { "name": "sender_holding_address", "type": "address" }, + { "name": "receiver_holding_address", "type": "address" }, + { "name": "units", "type": "uint64" } + ], + "returns": { "type": "uint64", "desc": "Number of units transferred" }, + "errors": [ + "NOT_CONFIGURED", + "DEFAULTED", + "SUSPENDED", + "PENDING_IED", + "CLOSED_TRANSFER", + "UNAUTHORIZED", + "INVALID_HOLDING_ADDRESS", + "SELF_TRANSFER", + "NULL_TRANSFER", + "OVER_TRANSFER", + "PENDING_ACTUS_EVENT" + ] +} +``` + +The current implementation requires the sender holding address to submit the transaction. diff --git a/docs/interfaces/types.md b/docs/interfaces/types.md new file mode 100644 index 00000000..2b37a5bb --- /dev/null +++ b/docs/interfaces/types.md @@ -0,0 +1,192 @@ +# ABI Types + +This section documents the canonical ARC-4 structs exposed by the D-ASA ABI. + +The types below refer to the on-chain ABI structs in `smart_contracts/abi_types.py`, +not to the richer SDK-side normalization models in `src/models.py`. + +## `RoleValidity` + +Time-bounded role assignment. + +| Field | Type | Meaning | +|:----------------------|:---------|:-------------------------------| +| `role_validity_start` | `uint64` | Inclusive activation timestamp | +| `role_validity_end` | `uint64` | Inclusive expiration timestamp | + +## `Prospectus` + +Informational contract metadata uploaded with `contract_config`. + +| Field | Type | Meaning | +|:-------|:-----------|:-----------------------------| +| `hash` | `byte[32]` | Prospectus digest | +| `url` | `string` | Prospectus location or label | + +## `NormalizedActusTerms` + +Normalized ACTUS terms required by the AVM kernel. + +| Field | Type | Meaning | +|:-------------------------------|:---------|:---------------------------------------------| +| `contract_type` | `uint8` | ACTUS contract family id | +| `denomination_asset_id` | `uint64` | Denomination asset id | +| `settlement_asset_id` | `uint64` | Settlement asset id | +| `total_units` | `uint64` | Total unit supply | +| `notional_principal` | `uint64` | Notional principal in base units | +| `initial_exchange_amount` | `uint64` | Initial exchange amount in base units | +| `initial_exchange_date` | `uint64` | `IED` timestamp | +| `maturity_date` | `uint64` | `MD` timestamp, or `0` if absent | +| `day_count_convention` | `uint8` | Supported day-count identifier | +| `rate_reset_spread` | `uint64` | Fixed-point spread | +| `rate_reset_multiplier` | `uint64` | Fixed-point rate multiplier | +| `rate_reset_floor` | `uint64` | Fixed-point floor | +| `rate_reset_cap` | `uint64` | Fixed-point cap | +| `rate_reset_next` | `uint64` | Prefixed next rate value | +| `has_rate_reset_floor` | `bool` | Floor flag | +| `has_rate_reset_cap` | `bool` | Cap flag | +| `dynamic_principal_redemption` | `bool` | Dynamic annuity redemption flag | +| `fixed_point_scale` | `uint64` | Fixed-point scale, currently `1_000_000_000` | + +SDK-only metadata such as `notional_unit_value` and secondary-market dates is not +part of this ABI struct. + +## `InitialKernelState` + +Pre-`IED` state snapshot uploaded with `contract_config`. + +| Field | Type | Meaning | +|:-----------------------------|:---------|:-------------------------------------------| +| `status_date` | `uint64` | Reference timestamp for the uploaded state | +| `event_cursor` | `uint64` | Starting global event cursor | +| `outstanding_principal` | `uint64` | Outstanding principal in base units | +| `interest_calculation_base` | `uint64` | Interest base in base units | +| `nominal_interest_rate` | `uint64` | Current fixed-point nominal rate | +| `accrued_interest` | `uint64` | Accrued interest in base units | +| `next_principal_redemption` | `uint64` | Next redemption target | +| `cumulative_interest_index` | `uint64` | Per-unit fixed-point interest index | +| `cumulative_principal_index` | `uint64` | Per-unit fixed-point principal index | + +## `ExecutionScheduleEntry` + +One normalized ACTUS schedule entry. + +| Field | Type | Meaning | +|:-----------------------------|:---------|:-----------------------------------| +| `event_id` | `uint64` | Global contiguous event identifier | +| `event_type` | `uint8` | ACTUS event id | +| `scheduled_time` | `uint64` | Due timestamp | +| `accrual_factor` | `uint64` | Fixed-point accrual factor | +| `redemption_accrual_factor` | `uint64` | Fixed-point redemption factor | +| `next_nominal_interest_rate` | `uint64` | Fixed-point next rate | +| `next_principal_redemption` | `uint64` | Next redemption state value | +| `next_outstanding_principal` | `uint64` | Next outstanding principal | +| `flags` | `uint64` | Entry flags | + +## `ExecutionSchedulePage` + +Alias for: + +```text +ExecutionScheduleEntry[] +``` + +The current kernel accepts at most `16` entries per page. + +## `ObservedEventRequest` + +Observed non-cash event payload used by `apply_non_cash_event`. + +| Field | Type | Meaning | +|:-----------------------------|:---------|:---------------------------------| +| `event_id` | `uint64` | Expected event id when appending | +| `event_type` | `uint8` | ACTUS event id | +| `scheduled_time` | `uint64` | Event timestamp | +| `accrual_factor` | `uint64` | Fixed-point accrual factor | +| `redemption_accrual_factor` | `uint64` | Fixed-point redemption factor | +| `observed_rate` | `uint64` | Observed fixed-point rate input | +| `next_nominal_interest_rate` | `uint64` | Fixed-point next rate | +| `next_principal_redemption` | `uint64` | Next redemption state value | +| `next_outstanding_principal` | `uint64` | Next outstanding principal | +| `flags` | `uint64` | Observed-event flags | + +## `ObservedCashEventRequest` + +Observed cash event payload used by `append_observed_cash_event`. + +| Field | Type | Meaning | +|:-----------------------------|:---------|:---------------------------------| +| `event_id` | `uint64` | Expected event id when appending | +| `event_type` | `uint8` | ACTUS cash event id | +| `scheduled_time` | `uint64` | Event timestamp | +| `accrual_factor` | `uint64` | Fixed-point accrual factor | +| `redemption_accrual_factor` | `uint64` | Fixed-point redemption factor | +| `next_nominal_interest_rate` | `uint64` | Fixed-point next rate | +| `next_principal_redemption` | `uint64` | Next redemption state value | +| `next_outstanding_principal` | `uint64` | Next outstanding principal | +| `flags` | `uint64` | Observed cash-event flags | + +## `KernelState` + +Readonly snapshot returned by `contract_get_state`. + +| Field | Type | Meaning | +|:-----------------------------|:---------|:---------------------------------| +| `contract_type` | `uint8` | ACTUS contract family id | +| `status` | `uint64` | Kernel lifecycle status | +| `total_units` | `uint64` | Total unit supply | +| `reserved_units_total` | `uint64` | Units reserved pre-`IED` | +| `initial_exchange_amount` | `uint64` | Initial exchange amount | +| `event_cursor` | `uint64` | Current global event cursor | +| `schedule_entry_count` | `uint64` | Total uploaded schedule entries | +| `outstanding_principal` | `uint64` | Outstanding principal | +| `interest_calculation_base` | `uint64` | Current interest base | +| `nominal_interest_rate` | `uint64` | Current fixed-point nominal rate | +| `accrued_interest` | `uint64` | Current accrued interest | +| `cumulative_interest_index` | `uint64` | Global per-unit interest index | +| `cumulative_principal_index` | `uint64` | Global per-unit principal index | +| `reserved_interest` | `uint64` | Reserved interest balance | +| `reserved_principal` | `uint64` | Reserved principal balance | + +The contract-level `defaulted` performance flag is stored separately in RBAC-managed +global state and is not part of `KernelState`. + +## `AccountPosition` + +Accounting position returned by `account_get_position`. + +| Field | Type | Meaning | +|:-----------------------|:----------|:-----------------------------------| +| `payment_address` | `address` | Cashflow destination | +| `units` | `uint64` | Active units | +| `reserved_units` | `uint64` | Pre-`IED` reserved units | +| `suspended` | `bool` | Account suspension flag | +| `settled_cursor` | `uint64` | Last settled global cursor | +| `interest_checkpoint` | `uint64` | Applied interest index checkpoint | +| `principal_checkpoint` | `uint64` | Applied principal index checkpoint | +| `claimable_interest` | `uint64` | Claimable interest amount | +| `claimable_principal` | `uint64` | Claimable principal amount | + +## `CashFundingResult` + +Result returned by `fund_due_cashflows`. + +| Field | Type | Meaning | +|:-------------------|:---------|:--------------------------------| +| `funded_interest` | `uint64` | Interest reserved in the call | +| `funded_principal` | `uint64` | Principal reserved in the call | +| `total_funded` | `uint64` | Total reserved amount | +| `processed_events` | `uint64` | Number of processed cash events | +| `timestamp` | `uint64` | Execution timestamp | + +## `CashClaimResult` + +Result returned by `claim_due_cashflows`. + +| Field | Type | Meaning | +|:-------------------|:---------|:----------------------------------| +| `interest_amount` | `uint64` | Interest realized or reported | +| `principal_amount` | `uint64` | Principal realized or reported | +| `total_amount` | `uint64` | Total realized or reported amount | +| `timestamp` | `uint64` | Execution timestamp | +| `context` | `byte[]` | Opaque caller-supplied context | diff --git a/docs/rationale.md b/docs/rationale.md deleted file mode 100644 index d304e344..00000000 --- a/docs/rationale.md +++ /dev/null @@ -1,17 +0,0 @@ -# Rationale {#rationale} - -This standard has been designed to support different types of debt instruments and -their payoffs, with cash-flows executed both on-chain and off-chain. - -The standard fosters modularity, with high degree of flexibility with respect to -the integration of external components (Applications), such as KYC, auctions, order-books, -off-chain transfer agents, etc. - -The specification makes sure that the trust model and RBAC of D-ASA implementations -can range from trustless versions (e.g., payments triggered automatically if the -conditions are met, default called automatically on payment failure) to trusted -ones (e.g., payments triggered only by authorized entities, default called manually -by a trustee). - -The implementation of the specified interfaces is left to the use-cases, which may -cherry-pick a subset of methods and getters based on their requirements. diff --git a/docs/sdk/deploy-and-attach.md b/docs/sdk/deploy-and-attach.md new file mode 100644 index 00000000..fae79db4 --- /dev/null +++ b/docs/sdk/deploy-and-attach.md @@ -0,0 +1,60 @@ +# Deploy and Attach + +## Deploy + +```python +from d_asa import DAsa + +app = DAsa.deploy( + algorand=algorand, + arranger=arranger, + app_name="my-dasa", +) +``` + +## Deploy and Configure + +`deploy_configured(...)` accepts either a precomputed `NormalizationResult` or raw +`ContractAttributes` plus the normalization inputs. + +```python +app = DAsa.deploy_configured( + algorand=algorand, + arranger=arranger, + normalized=normalized, + prospectus_url="Issuer term sheet", +) +``` + +When configuration happens through the high-level API, `DAsa` also stores a `PricingContext` +derived from `normalized.terms.notional_unit_value`. + +## Attach to an Existing App + +```python +app = DAsa.from_app_id( + algorand=algorand, + app_id=12345, +) +``` + +If you already have the generated client: + +```python +from d_asa.artifacts.dasa_client import DasaClient + +raw_client = DasaClient(algorand=algorand, app_id=12345) +app = DAsa.from_client(raw_client) +``` + +## Contract View + +`app.contract` exposes readonly helpers built from on-chain state: + +- `get_state()` +- `get_next_due_event()` +- `get_schedule_entry(event_id)` +- `get_arranger()` +- `get_address_roles(address)` +- `get_role_validity(role, address)` +- `raw_client` diff --git a/docs/sdk/dvp.md b/docs/sdk/dvp.md new file mode 100644 index 00000000..308aaa63 --- /dev/null +++ b/docs/sdk/dvp.md @@ -0,0 +1,46 @@ +# Over-the-Counter (OTC) DvP Builder + +`HoldingAccount.build_otc_dvp(...)` builds an atomic delivery-vs-payment group for +OTC secondary trades. + +The builder is intentionally non-custodial: + +- it creates the payment leg +- it creates the D-ASA transfer leg +- it returns the composed group for inspection, signing, simulation, or sending + +## Algo Settlement + +```python +draft = app.account(seller).build_otc_dvp( + buyer=buyer, + units=10, + payment_amount=150_000, +) + +result = draft.send() +``` + +## ASA Settlement + +```python +draft = app.account(seller).build_otc_dvp( + buyer=buyer, + units=10, + payment_amount=15_000, + payment_asset_id=settlement_asa_id, +) +``` + +## Guardrails + +The builder validates: + +- `units > 0` +- `payment_amount > 0` +- seller and buyer are different +- the seller signer matches the transfer sender holding address +- optional quote tolerance, when provided + +You can combine it with `quote_trade(...)` inputs to fail fast when the negotiated +payment amount drifts too far from the SDK's accrual-aware reference. diff --git a/docs/sdk/overview.md b/docs/sdk/overview.md new file mode 100644 index 00000000..5c8222b1 --- /dev/null +++ b/docs/sdk/overview.md @@ -0,0 +1,35 @@ +# SDK Overview + +The high-level Python API lives in the `d_asa` package and is centered on `DAsa`. + +It wraps the generated ARC-56 client in [`d_asa.artifacts.dasa_client`](../../src/d_asa/artifacts/dasa_client.py) +and keeps the generated ABI structs out of the normal user flow. + +```python +from d_asa import ( + DAsa, + ContractAttributes, + PricingContext, + make_pam_zero_coupon_bond, + normalize_contract_attributes, +) +``` + +The root package also continues to expose the domain models and the ACTUS normalizer +directly: + +- `ContractAttributes` +- `make_pam_zero_coupon_bond(...)` +- `make_pam_fixed_coupon_bond_profile(...)` +- `normalize_contract_attributes(...)` +- `NormalizationResult` +- `NormalizedActusTerms` +- `InitialKernelState` +- `ExecutionScheduleEntry` +- `AccountPosition` +- `ObservedEventRequest` +- `ObservedCashEventRequest` +- `Cycle` + +Use `DAsa` for contract interaction, and keep `d_asa.artifacts.dasa_client` as the +explicit low-level escape hatch when needed. diff --git a/docs/sdk/roles.md b/docs/sdk/roles.md new file mode 100644 index 00000000..5c808fec --- /dev/null +++ b/docs/sdk/roles.md @@ -0,0 +1,56 @@ +# Role Wrappers + +`DAsa` binds signer accounts into role-oriented wrappers. + +```python +arranger = app.arranger(arranger_account) +account_manager = app.account_manager(manager_account) +primary_dealer = app.primary_dealer(dealer_account) +trustee = app.trustee(trustee_account) +authority = app.authority(authority_account) +observer = app.observer(observer_account) +op_daemon = app.op_daemon(op_daemon_account) +holder = app.account(holder_account) +``` + +## Arranger + +`ArrangerRole` covers the contract lifecycle and arranger-controlled actions: + +- `configure(...)` +- `configure_from_attributes(...)` +- `configure_contract(...)` +- `upload_schedule(...)` +- `execute_ied()` +- `set_transfer_window(...)` +- `fund_due_cashflows(...)` +- `append_observed_cash_event(...)` +- `append_observed_cash_events(...)` +- `apply_non_cash_event(...)` +- `rotate_arranger(...)` +- `set_op_daemon(...)` +- `assign_role(...)` +- `revoke_role(...)` + +## Other Roles + +- `AccountManagerRole.open_account(...)` +- `PrimaryDealerRole.primary_distribution(...)` +- `TrusteeRole.set_default(...)` +- `AuthorityRole.suspend_account(...)` +- `AuthorityRole.set_contract_suspension(...)` +- `ObserverRole.apply_non_cash_event(...)` +- `OpDaemonRole.claim(...)` + +## Holding Accounts + +`HoldingAccount` is the investor-facing wrapper: + +- `get_raw_position()` +- `get_actualized_position(...)` +- `get_valuation(...)` +- `quote_trade(...)` +- `build_otc_dvp(...)` +- `transfer(...)` +- `claim(...)` +- `update_payment_address(...)` diff --git a/docs/sdk/valuation.md b/docs/sdk/valuation.md new file mode 100644 index 00000000..f8e8fad2 --- /dev/null +++ b/docs/sdk/valuation.md @@ -0,0 +1,61 @@ +# Actualized Positions and Valuation + +`HoldingAccount.get_actualized_position()` mirrors the contract's lazy settlement +rules off chain: + +- reserved units become active after `IED` +- cumulative interest and principal indices are applied to the holder checkpoints +- the returned position is a preview only; it does not mutate chain state + +```python +holder = app.account(investor) +position = holder.get_actualized_position() +``` + +`get_valuation()` builds on top of that position and adds economic fields: + +- `principal_share` +- `claimable_interest` +- `claimable_principal` +- `accrued_interest_not_due` +- `economic_value_total` + +```python +valuation = holder.get_valuation() +``` + +## Trade Quotes + +`quote_trade(units=...)` is intended to support secondary-market pricing in the +middle of an accrual period. + +The quote always returns: + +- the current principal share of the traded units +- accrued interest that is not yet due +- a par-reference clean value +- a par-reference dirty value + +If a clean quote is supplied, the SDK derives a market dirty value by adding accrued-not-due +carry. + +```python +from decimal import Decimal +from d_asa import TradeQuoteInput + +quote = holder.quote_trade( + 25, + clean_quote=TradeQuoteInput(clean_price_per_100=Decimal("99.25")), +) +``` + +Important behavior: + +- Quotes are rejected when a due ACTUS event is already pending at the requested +timestamp. + +- Existing `claimable_interest` and `claimable_principal` remain attached to the +seller account and are reported as retained balances, not transferred unit value. + +- `clean_price_per_100` requires a `PricingContext`, because `notional_unit_value` +is SDK metadata and is not stored on chain. diff --git a/docs/specs/accounting/account.md b/docs/specs/accounting/account.md new file mode 100644 index 00000000..a0051f1e --- /dev/null +++ b/docs/specs/accounting/account.md @@ -0,0 +1,30 @@ +# Account (Investor) + +> Investors are lenders providing capital to borrowers with the expectation of a +> financial return, defined by debt instruments. + +Investors \\( [CPID] \\) own D-ASA accounts, characterized by a pair of Algorand +Addresses: + +- *Holding Address*: address that owns D-ASA units with the right to future payments; +- *Payment Address*: address that receives D-ASA payments. + +The Payment Address **MAY** be different from the Holding Address. + +The Account is uniquely identified by the account key of the form: + +`[A#||]` + +Where || denotes concatenation. + +> D-ASA units can be in custody with a third party or temporarily deposited on an +> order book (Holding Address). At the same time, payments are always executed +> towards the investor (on the Payment Address). + +## Seniority + +> Debt instruments may have an order of repayment in the event of a sale or default +> of the issuer, based on investors’ seniority. Investors with the same seniority +> are treated equally. + +D-ASA does not enforce investor *seniority* \\( [SEN] \\). diff --git a/docs/specs/accounting/overview.md b/docs/specs/accounting/overview.md new file mode 100644 index 00000000..ae720f2c --- /dev/null +++ b/docs/specs/accounting/overview.md @@ -0,0 +1,4 @@ +# Accounting + +The accounting section defines how the kernel's contract-wide cashflow state is +projected into holder positions, checkpoints, and claimable balances. diff --git a/docs/specs/accounting/units.md b/docs/specs/accounting/units.md index e1701efb..d3cc30e6 100644 --- a/docs/specs/accounting/units.md +++ b/docs/specs/accounting/units.md @@ -1,69 +1,61 @@ # D-ASA units {#d-asa-units} -> D-ASA units represent the ownership of the tokenized debt instrument. +D-ASA units represent pro-rata ownership of the normalized ACTUS contract. -## Supply {#supply} +## Total supply -The D-ASA **MUST** define its *total units* (`uint64`). +The kernel **MUST** store `total_units` as a `uint64`. -If the D-ASA has a *principal*, its initials *total units* **MUST** be equal to -the *principal* divided by the *minimum denomination.* +The off-chain normalization process **MUST** derive `total_units` exactly as: -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with a principal of 1M EUR and a minimum -> denomination of 1,000 EUR. The D-ASA has 1,000 initial total units. +```text +notional_principal / notional_unit_value +``` -The D-ASA *total units* **MAY** be updated with the **OPTIONAL** `update_total_units` -method. +The division **MUST** be exact. If the principal is not divisible by the chosen +unit value, normalization **MUST** fail. -## Value {#value} +`notional_unit_value` is an SDK-side normalization input. It is used to derive +`total_units`, but it is not persisted on chain. -> The D-ASA unit’s value is always intended as **nominal value** (at redemption). +## Unit states -The D-ASA *unit value* (`uint64`) **MUST** be expressed in the *denomination asset*. +A holder account stores two unit balances: -If the D-ASA has a *principal*, its initial *unit value* **MUST** be equal to the -*minimum denomination.* +- `reserved_units`: units allocated before `IED`; +- `units`: active units participating in funded ACTUS cashflows. -The D-ASA *unit* *value* **MAY** change over time. +When `IED` executes, reserved units become activatable and are moved into `units` +the first time the holder position is touched. -> The D-ASA unit’s value may change according to different conditions, such as an -> amortizing principal repayment schedule (see [Amortizing Schedule](../execution/payment-agent/principal-repayment.md#amortizing-schedule) -> section). +## Position accounting -The D-ASA *unit value* **MAY** change globally or locally (per account). +Each holder position **MUST** track: -> The D-ASA unit’s value can be global or local (per-account). Global unit value -> should be used when the value of all the units can be updated at the same time. -> Local unit value should be used when the units' value is updated at different -> times per each account. +- The payment address; +- Active and reserved unit balances; +- Suspension state; +- The last settled event cursor; +- The last applied cumulative interest index; +- The last applied cumulative principal index; +- Claimable interest and principal amounts. -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with an initial unit value of 1,000 EUR. -> The D-ASA accrues interest on a daily basis, paid at redemption. The unit value -> is updated globally (for all the units). +The accounting layer does not maintain a mutable on-chain nominal unit value. Transfers +and claims are therefore unit-based and index-based, not value-array-based. -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with an initial unit value of 1,000 EUR. -> The D-ASA has an amortizing principal repayment schedule. Repayments are executed -> per-account. The unit value is updated per-account (for the account’s units). +## Lazy settlement -The D-ASA *unit value* **MAY** be globally updated with the **OPTIONAL** `update_global_unit_value` -method. +The accounting layer **MUST** settle holder positions lazily against the global +cumulative indices maintained by the kernel. -## Fungibility {#fungibility} +On settlement: -> D-ASA units' fungibility depends on: -> -> - Units value (nominal); -> - Executed payments. -> +1. The delta between global and account checkpoints is computed; +1. The delta is multiplied by the holder's active units; +1. The result is moved into `claimable_interest` and `claimable_principal`; +1. The checkpoints and settled cursor are advanced. -The D-ASA *fungible units* **MUST** have the same *value* and *executed payments.* +This model allows: -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA with 4 coupons. Investors A and B are holding 10 D-ASA units -> each. The 1st coupon is due. Coupon payments might not be executed synchronously -> for all the Investors. The coupon payment is executed for Investor A, while Investor -> B is still waiting for the payment settlement. Investor A units are temporarily -> non-fungible with Investor B units until the 1st coupon is paid for both. +- Contract-wide funding of due ACTUS cash events once; +- Account-by-Account realization of the funded cashflows later. diff --git a/docs/specs/contract/actus-compliance-profile.md b/docs/specs/contract/actus-compliance-profile.md new file mode 100644 index 00000000..2ea2e41b --- /dev/null +++ b/docs/specs/contract/actus-compliance-profile.md @@ -0,0 +1,82 @@ +# ACTUS Compliance Profile + +> Debt instruments such as bullet bonds, amortizing loans, mortgages, etc. differ +> based on their cash flow exchange patterns (e.g., principal and interest payment +> time schedules, fixed or variable interest rates, etc.). + +> The ACTUS taxonomy reduces the majority of all financial contracts to a defined +> set of 32 generalized cash flow exchange patterns, called contract types. + +The D-ASA **MUST** be classified with an ACTUS *contract type* \\( [CT] \\) (see +the [ACTUS taxonomy](https://github.com/actusfrf/actus-dictionary/blob/master/actus-dictionary-taxonomy.json)). + +The *contract type* **MUST** have the following properties: + +- `family`: Basic +- `class`: Fixed Income +- `sub-class`: Maturities + +## Contract Identifier + +The D-ASA *contract identifier* \\( [CID] \\) is the Algorand Application ID (`uint64`). + +The D-ASA contract layer **MUST** follow a constrained ACTUS fixed-income profile +that can be normalized and executed on the AVM. + +## Supported contract families + +The current kernel supports the following ACTUS contract family identifiers: + +| ID | Contract Type | Description | Rate | Use case | +|:---:|:-------------:|:---------------------------------------------------------------------------------------------------------------------------------------|:----------------------|:----------------------------------------------------------------| +| `0` | `PAM` | Principal payment fully at \\( [IED] \\) and repaid at \\( [MD] \\). | Fix or variable rates | All kind of bonds, term deposits, bullet loans, mortgages, etc. | +| `1` | `ANN` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\). | Fix or variable rates | Classical level payment mortgages, leasing contracts, etc. | +| `2` | `NAM` | As `ANN`, when resetting rate total amount (principal + interest) stays constant. \\( [MD] \\) shifts. | Variable only | Adjustable rate mortgages | +| `3` | `LAM` | Principal payment fully at \\( [IED] \\) and repaid periodically in constants amounts till \\( [MD] \\), interest reduced accordingly. | Fix or variable | Amortizing loans | +| `4` | `LAX` | Flexible version of `LAM`. | Fix or variable | Teaser rate loans | +| `5` | `CLM` | Loans rolled over as long as they are not called. Once called, it has to be paid back after noticed period. | Fix or variable | Loans with call options | + +> Non-normative subtypes such as `PAM:ZCB` and `PAM:FCB` are resolved before normalization. +> The AVM kernel stores only the normalized family identifier. + +## Supported event types + +The normalized execution schedule **MUST** contain only event types permitted for +the configured contract family. + +| Family | Allowed events | +|:-------|:----------------------------------------------------------| +| `PAM` | `IED`, `IP`, `MD`, `RR`, `RRF` | +| `ANN` | `IED`, `IP`, `PR`, `MD`, `RR`, `RRF`, `IPCB`, `PRF` | +| `NAM` | `IED`, `IP`, `PR`, `MD`, `RR`, `RRF`, `IPCB` | +| `LAM` | `IED`, `IP`, `PR`, `MD`, `RR`, `RRF`, `IPCB` | +| `LAX` | `IED`, `IP`, `PR`, `PI`, `MD`, `RR`, `RRF`, `IPCB`, `PRF` | +| `CLM` | `IED`, `IP`, `PR`, `MD`, `RR`, `RRF` | + +- **Cash events** are limited to `IP`, `PR`, and `MD`. + +- **Non-cash events** are limited to `IED`, `PI`, `RR`, `RRF`, `IPCB`, and `PRF`. + +## Normalization constraints + +The D-ASA profile further requires: + +- `business_day_convention = NOS`; +- `calendar = NC`; +- One of the supported day-count conventions listed in [Day-Count Convention](./day-count-convention.md); +- AVM-compatible `uint64` values for amounts, times, and fixed-point factors. + +Normalization **MUST** reject any contract that cannot satisfy those constraints. + +## Observed events + +Observed schedule extension is intentionally narrow: + +- Only `CLM` contracts may append observed events at runtime; + +- `append_observed_cash_event` only accepts observed `PR` cash events; + +- `apply_non_cash_event` applies due `RR` and `RRF` events under Observer control; + +- Arranger-controlled observed appends **MUST** preserve event ordering and contiguous +event IDs. diff --git a/docs/specs/contract/attributes.md b/docs/specs/contract/attributes.md new file mode 100644 index 00000000..f22f7c04 --- /dev/null +++ b/docs/specs/contract/attributes.md @@ -0,0 +1,227 @@ +# Main Contract Attributes + +The following are the main ACTUS Contract Attributes. + +This section is intended to clarify ACTUS-specific terminology and map it to the +corresponding terms used in the D-ASA implementation. ACTUS remains the normative +specification throughout. + +> [!IMPORTANT] +> In the event of any inconsistency, the ACTUS specification shall prevail. + +> For further details, refer to the ACTUS specification. + +## Principal + +> Debt instruments principal is the amount of capital borrowed and used as a base +> for calculating interest. + +The D-ASA **MUST** define the *principal* \\( [NT] \\), expressed in the *denomination +asset*. + +The D-ASA **MUST** define a *minimum denomination*, expressed in the *denomination +asset*. + +The *minimum denomination* **MUST** be a divisor of the *principal*. + +### Discount + +> Debt instruments principal may be placed at premium or discount on issuance. + +The D-ASA **MAY** define a *premium* or *discount* \\( [PDIED] \\) to apply to the +principal on the issuance. + +> [!TIP] +> Let’s have a D-ASA denominated in EUR, with a principal of 1M EUR paid at maturity +> and a minimum denomination of 1,000 EUR. The D-ASA has a principal discount of +> 200 bps (2%) at the issuance. Each D-ASA unit is sold on the primary market at +> 980 EUR and will be redeemed for 1,000 EUR of principal at maturity. + +## Interests + +> Debt instruments interest is calculated on a fixed or variable rate on the outstanding +> principal. + +> The interest rate is the nominal yield paid by the debt instrument on the principal, +> usually defined *per-annum* (APY). + +### Interest Rate + +> Debt instruments may have variable interest rates, based on external data oracles. + +The D-ASA **MAY** define a nominal *interest rate* \\( [IPNR] \\). + +If the interest rate is variable, the D-ASA **MUST** define *interest update dates* +known \\( [RRF] \\) or unknown \\( [RR] \\). + +#### Cap and Floor + +> Debt instruments may define limitations to the interest rate variability, either +> over the whole contract lifespan or over specific periods. + +#### Life Caps + +The D-ASA **MAY** define a *life cap* \\( [RRLC] \\) to apply to the variable *interest +rate*. + +The D-ASA **MAY** define a *life floor* \\( [RRLF] \\) to apply to the variable +*interest rate*. + +#### Period Caps + +The D-ASA **MAY** define a *period cap* \\( [RRPC] \\) to the variable *interest +rate*. + +The D-ASA **MAY** define a *period floor* \\( [RRPF] \\) to apply to the variable +*interest rate*. + +#### Fixing Period + +> Debt instruments usually schedule interest rate updates before the new rate applies +> (defined by the rate reset schedule). + +The D-ASA **MUST** define a *fixing period* \\( [RRFIX] \\) that specifies a period +of time before the *interest payment* \\( [IP] \\) in which the interest can be +updated. + +## Issuance + +> Debt instruments start accruing interest on the issuance date. + +The D-ASA **MUST** have an *initial exchange date* \\( [IED] \\) (issuance). + +## Maturity + +> Debt instruments may have a maturity date, on which the principal is repaid and +> the contract obligations expire. + +> Debt instruments may have a fixed or variable maturity date. + +The D-ASA **MAY** have a *maturity date* \\( [MD] \\). + +The *maturity date* **MAY** be updated in case of pre-payment options. + +## Prepayment Options + +> Debt instruments could have early repayment options to repay the principal to +> investors (partially or totally) before maturity or to reduce the maturity date. + +> Debt instrument with defined maturity date may terminate earlier if the full principal +> redemption happens earlier than maturity. + +If the debt instrument has early repayment options, the D-ASA **MUST** implement +the **OPTIONAL** `set_early_repayment_option` method. + +### Prepayment Effects + +> Debt instruments could have early repayment options to repay the principal to +> investors (partially or totally) before maturity or to reduce the maturity date. + +> Debt instrument with a defined maturity date may terminate earlier if the full +> principal redemption happens earlier than maturity. + +An early repayment option could have different *prepayment effects* \\( [PPEF] \\): + +- It **MAY** repay the *principal* partially or totally before the *maturity date*; + +- It **MAY** reduce the *maturity date*. + +The *prepayment effect* **MUST** be identified with one of the following enumerated +IDs: + +| ID | Name | ACTUS Acronym | Description | +|:------|:------------------------------------:|---------------|:------------------------------------------------------------------------------------------------| +| `0` | No Prepayment | \\([N]\\) | Prepayment is not allowed under the agreement | +| `1` | Prepayment Reduces Redemption Amount | \\([A]\\) | Prepayment is allowed and reduces the redemption amount for the remaining period up to maturity | +| `2` | Prepayment Reduces Maturity | \\([M]\\) | Prepayment is allowed and reduces the maturity | + +### Penalties + +> Debt instruments may have a penalty as a consequence of an early repayment option. + +The D-ASA **MAY** define a *penalty type* \\( [PYTP] \\) for the early repayment +options. + +The *penalty type* **MUST** be identified with one of the following enumerated IDs: + +| ID | Name | ACTUS Acronym | Description | +|:------|:--------------------------:|---------------|:-------------------------------------------------------------------------------------------------------| +| `0` | No Penalty | \\([N]\\) | No penalty applies | +| `1` | Fixed Penalty | \\([A]\\) | A fixed amount applies as penalty | +| `2` | Relative Penalty | \\([R]\\) | A penalty relative to the notional outstanding applies | +| `3` | Interest Rate Differential | \\([I]\\) | A penalty based on the current interest rate differential relative to the notional outstanding applies | + +## Performance + +> Debt instruments performances are exposed to credit risks. + +The D-ASA *performance* \\( [PRF] \\) **MUST** be identified with one of the following +enumerated IDs: + +| ID | Name | ACTUS Acronym | Description | +|:----|:----------:|---------------|:-------------------------------------------------------------------------------------| +| `0` | Performant | \\( [PF] \\) | Contract is performing according to terms and conditions | +| `1` | Delayed | \\( [DL] \\) | Contractual payment obligations are delayed according to the *grace period* | +| `2` | Delinquent | \\( [DQ] \\) | Contractual payment obligations are delinquent according to the *delinquency period* | +| `3` | Default | \\( [DF] \\) | Contract defaulted on payment obligations according to *delinquency period* | +| `4` | Matured | \\( [MA] \\) | Contract matured | +| `5` | Terminated | \\( [TE] \\) | Contract has been terminated | + +> [!NOTE] +> The current reference implementation supports manual default-performance tracking +> through an RBAC-managed boolean `defaulted` flag. It does not yet model the full +> `PRF` lifecycle enum or automatic grace-period and delinquency transitions on +> chain. + +### Grace Period + +> Debt instruments may define a grace period as a time window after the payment +> due date during which payment may be retried without a penalty. + +The D-ASA **MAY** define a *grace period* \\( [GRP] \\). + +### Delinquency Period + +> Debt instruments may define a delinquency period as a time window after the grace +> period. If payment happens after the delinquency period, then the counterparty +> is in technical default. + +The D-ASA **MAY** define a *delinquency period* \\( [DQP] \\). + +### Default + +> Default is the ultimate failure to pay the lenders according to the payment obligations. +> When this happens, the creditors have the right to declare default to the debtors. + +> Default processes require the intervention of regulatory bodies and courts, therefore +> the D-ASA default status bridges the default process off-chain. + +The D-ASA **SHOULD** enter *default* status if it cannot perform payments on due +dates. + +The D-ASA **MAY** disable all non-administrative methods on *default* status. + +> The D-ASA default can be called either automatically (based on program conditions) +> or manually (based on the decision of a trustee). + +The *Trustee* **MAY** set the default status with the `rbac_contract_default` +method. + +In the current reference implementation, `rbac_contract_default(defaulted: bool)` +stores a boolean `defaulted` flag in RBAC global state. This performance flag is +distinct from the kernel lifecycle `status`. + +> [!TIP] +> The D-ASA has no *grace period* and no *delinquency period*. A D-ASA coupon payment +> is triggered on due date, but there is not enough liquidity to pay all the investors. +> The D-ASA contract automatically enters in *default* immediately. + +> [!TIP] +> The D-ASA has a *grace period* and a *delinquency period*. A D-ASA coupon payment +> is triggered on due date, but there is not enough liquidity to pay all the investors. +> The D-ASA program starts counting the *grace period* and *delinquency period*. +> If the *delinquency period* expires, then the contract enters in *default*. + +> [!TIP] +> A D-ASA coupon payment is triggered on due date, but there is not enough liquidity +> to pay all the investors. The D-ASA contract relies on a Trustee to call the *default*. diff --git a/docs/specs/contract/day-count-convention.md b/docs/specs/contract/day-count-convention.md index d33a71e8..2aad6ab0 100644 --- a/docs/specs/contract/day-count-convention.md +++ b/docs/specs/contract/day-count-convention.md @@ -1,10 +1,10 @@ # Day-Count Convention {#day-count-convention} -> Debt instruments use a day-count -> convention to calculate the amount of accrued interest when the next coupon -> payment is less than a full coupon period away. +> Debt instruments use a [day-count convention](https://en.wikipedia.org/wiki/Day_count_convention) +> to calculate the amount of accrued interest when the next coupon payment is less +> than a full coupon period away. -The D-ASA **MUST** specify one *day-count convention* \\([IPCD]\\) (`uint8`). +The D-ASA **MUST** specify one *day-count convention* \\( [IPCD] \\). The *day-count convention* **MUST** be identified with one of the following enumerated IDs (`uint8`): @@ -18,40 +18,6 @@ IDs (`uint8`): | `4` | 30/360 | \\([30E360]\\) | Year fractions accrue on the basis of 30 days per month and 360 days per year in the respective period | | `5` | 28/366 | \\([28E366]\\) | Year fractions accrue on the basis of 28 days per month and 366 days per year in the respective period | | `6` | 30/365 | - | Year fractions accrue on the basis of 30 days per month and 365 days per year in the respective period | -| `255` | Continuous | - | Time fractions accrue on the basis of the number of UNIX time units (non-leap seconds) in the respective time period | - -The *day-count convention* defines the *day-count factor* as a fraction of: - -- Numerator: elapsed time of the accrual period to date; -- Denominator: time of the full accrual period defined by the *time schedule*. - -The *day-count convention* **MUST** be set using the `asset_config` method. - -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA with the following coupon dates: -> -> - `date1`: starting date for the current coupon’s interest accrual, defined by -> the *time schedule*; -> - `date2`: date through which the interest is being accrued (“to” date), equals -> to the current block timestamp; -> - `date3`: next coupon due date, defined by the *time schedule*. -> -> The day-count factor is calculated as: -> -> **Continuous** (`255`) convention: -> -> ```text -> (date2 - date1) / (date3 - date1) -> ``` -> -> **Actual/Actual** (`0`) convention: -> -> ```text -> days_in(date2 - date1) / days_in(date3 - date1) -> ``` -> -> Where `days_in` returns the actual number of days (equal to `86400` seconds) in -> the time interval. ## Calendar @@ -60,22 +26,16 @@ The *day-count convention* **MUST** be set using the `asset_config` method. > The AVM (so the D-ASA) time has no notion of calendars. Conversion of serial UNIX > timestamps into a year/month/day triple[^1] (and vice versa) can be performed -> by external Algorand Applications[^2] or client side. +> by external Algorand Applications[^2] or client side (normalization). -The D-ASA **MAY** specify a *calendar* \\([CLDR]\\). +The D-ASA **MAY** specify a *calendar* \\( [CLDR] \\). -The *calendar* **MUST** be identified with one of the following enumerated IDs (`uint8`): +The *calendar* **MUST** be identified with one of the following enumerated IDs: | ID | Name | ACTUS | Description | |:------|:----------------:|------------|:-----------------------------------------------| | `0` | No Calendar | \\([NC]\\) | No holidays defined (default if not specified) | | `1` | Monday to Friday | \\([MF]\\) | Saturdays and Sundays are holidays | -| `255` | Custom | - | Custom holidays definition | - -The *calendar* **MAY** be set using the **OPTIONAL** `set_asset_metadata` method -(see [Metadata](metadata.md) section). - -> A reference implementation **SHOULD** use the default *calendar* (`0`). ## Business Day Convention @@ -85,15 +45,7 @@ The *calendar* **MAY** be set using the **OPTIONAL** `set_asset_metadata` method > The business day convention defines how D-ASA execution can be shifted to the > next business day (following) or the previous on (preceding). -The D-ASA **MAY** specify a *business day convention* \\([BDC]\\). - -It is **RECOMMENDED** to use an ACTUS *business day convention*. - -The *business day convention* **MAY** be set using the **OPTIONAL** `set_asset_metadata` -method (see [Metadata](metadata.md) section). - -> A reference implementation **SHOULD NOT** adopt a *business day convention* (as -> it has no defined calendar). +The D-ASA **MAY** specify a *business day convention* \\( [BDC] \\). ## End of Month Convention @@ -102,15 +54,44 @@ method (see [Metadata](metadata.md) section). > The end-of-month convention defines how D-ASA execution can be shifted according > to the different number of days in months (31, 30, and 28) according to the calendar. -The D-ASA **MAY** specify a *end-of-month convention* \\([EOMC]\\). +The D-ASA **MAY** specify a *end-of-month convention* \\( [EOMC] \\). + +## Normalization profile restrictions + +The D-ASA kernel **MUST** store one normalized day-count convention identifier. + +The current kernel accepts the following identifiers: + +| ID | Name | ACTUS | +|:----|:--------------|:-------------| +| `0` | Actual/Actual | `AA` | +| `1` | Actual/360 | `A360` | +| `2` | Actual/365 | `A365` | +| `3` | 30E/360 ISDA | `30E360ISDA` | +| `4` | 30E/360 | `30E360` | + +A contract configuration **MUST** fail if the normalized terms use any other day-count +identifier. + +The current D-ASA ACTUS profile imposes the following additional constraints on +date handling: + +- `business_day_convention` **MUST** be `NOS`; +- `calendar` **MUST** be `NC`; +- Timestamps **MUST** be expressed as UTC UNIX seconds. + +Those constraints are enforced during normalization so that the AVM only receives +values that can be executed deterministically without external calendar logic. + +## Accrual factors -It is **RECOMMENDED** to use an ACTUS *end-of-month convention*. +The AVM kernel does not recompute year fractions from raw dates. Instead, normalization +**MUST** precompute the relevant accrual factors and place them in each `ExecutionScheduleEntry`. -The *end-of-month convention* **MAY** be set using the **OPTIONAL** `set_asset_metadata` -method (see [Metadata](metadata.md) section). +This split is intentional: -> A reference implementation **SHOULD NOT** adopt an *end-of-month day convention* -> (as it has no defined calendar). +- Date arithmetic and ACTUS schedule generation happen off chain; +- Execution, validation, and state transitions happen on chain. --- diff --git a/docs/specs/contract/denomination.md b/docs/specs/contract/denomination.md index 54571b71..e27308f8 100644 --- a/docs/specs/contract/denomination.md +++ b/docs/specs/contract/denomination.md @@ -6,12 +6,11 @@ The D-ASA **MUST** be denominated either in an on-chain or off-chain *denomination asset* \\([CUR]\\)[^1]. -The *denomination asset identifier* (`uint64`) **MUST** be set using the `asset_config` -method. - All values (`uint64`) are integer minor units of the relevant on-chain or off-chain *denomination asset*. +> The reference implementation supports only on-chain ASA denominations (e.g., "stablecoins"). + ## On-chain denomination {#on-chain-denomination} The *denomination asset* **MUST** be an Algorand Standard Asset (ASA), an Application @@ -24,7 +23,7 @@ If asset is ALGO (`0`): amount is in microALGOs (\\( 10^{-6} \\) ALGO). If asset is ASA or App: amount is in base units as per that asset’s `decimals`. -{{#include ../../_include/styles.md:example}} +> [!TIP] > The value (`uint64`) `10000` of an ASA denomination with 2 `decimals` is interpreted > as `100.00` units of the ASA. @@ -39,7 +38,7 @@ The *denomination asset* **MUST** use the decimal digits specified by the [!TIP] > The value (`uint64`) `10000` an EUR (ISO 4217, 2 decimals) denomination is interpreted > as `100.00` Euro. diff --git a/docs/specs/contract/early-repayment-options.md b/docs/specs/contract/early-repayment-options.md deleted file mode 100644 index 9c590ef5..00000000 --- a/docs/specs/contract/early-repayment-options.md +++ /dev/null @@ -1,99 +0,0 @@ -# Early Repayment Options {#early-repayment-options} - -> Debt instruments could have early repayment options to repay the principal to -> investors (partially or totally) before maturity or to reduce the maturity date. - -> Debt instrument with defined maturity date may terminate earlier if the full principal -> redemption happens earlier than maturity. - -If the debt instrument has early repayment options, the D-ASA **MUST** implement -the **OPTIONAL** `set_early_repayment_option` method. - -## Early Repayment Schedule - -If the D-ASA has early repayment options, it **MUST** define *early repayment time -events* as `uint64[]` array, where: - -- The length of the array **MUST** be `N>=1`; - -- The first element **MUST** be the *early repayment start date* \\([OPANX]\\) (`uint64`): -the time after which early repayment options could be executed; - -- If the D-ASA has a *maturity date*, the last element **MUST** be the *early repayment -end date* \\([OPXED]\\) (`uint64`): the time after which early repayment options -cannot be executed. - -The *early repayment time events* **MUST** be sorted in strictly ascending order. - -The *early repayment start date* **MUST NOT** be earlier than the *issuance date*. - -The *early repayment end date* **MUST NOT** be later than the *maturity date*. - -The unscheduled *prepayment events* \\([PP]\\) **MUST** occur within the defined -*early repayment schedule*. - -In the case of non-continuous *day-count conventions* (`ID<255`, see [Day-Count -Conventions](day-count-convention.md) section), the *time periods* between subsequent -events **MUST** be multiples of a day, in seconds (`86400`). - -The *early repayment time events* **MUST** be set with the `set_early_repayment_option` -method. - -The *early repayment time events* **MAY** be updated with the `set_early_repayment_option` -method. - -The updated *early repayment time events* **MUST NOT** modify past events. - -## Prepayment Effects - -An early repayment option could have different *prepayment effects* \\([PPEF]\\): - -- It **MAY** repay the *principal* partially or totally, to all or some Investors -before the *maturity date* (see [Early Repayment](../execution/payment-agent/early-repayment.md) -section); - -- It **MAY** reduce the *maturity date* (see [Variable Time Schedule](variable-time-schedule.md) -section). - -The *prepayment effect* **MUST** be identified with one of the following enumerated -IDs (`uint8`): - -| ID | Name | ACTUS Acronym | Description | -|:------|:------------------------------------:|---------------|:------------------------------------------------------------------------------------------------| -| `0` | No Prepayment | \\([N]\\) | Prepayment is not allowed under the agreement | -| `1` | Prepayment Reduces Redemption Amount | \\([A]\\) | Prepayment is allowed and reduces the redemption amount for the remaining period up to maturity | -| `2` | Prepayment Reduces Maturity | \\([M]\\) | Prepayment is allowed and reduces the maturity | -| `255` | Custom | - | Prepayment is allowed and the effect is custom | - -The *prepayment effect* **MAY** be set using the **OPTIONAL** `set_asset_metadata` -method (see [Metadata](metadata.md) section). - -> The implementation **SHOULD** manage the accrued interest on early repayments. - -## Penalties - -> Debt instruments may have a penalty as a consequence of an early repayment option. - -The D-ASA **MAY** define a *penalty type* \\([PYTP]\\) (`uint8`) for the early repayment -options. - -The *penalty type* **MUST** be identified with one of the following enumerated IDs: - -| ID | Name | ACTUS Acronym | Description | -|:------|:--------------------------:|---------------|:-------------------------------------------------------------------------------------------------------| -| `0` | No Penalty | \\([N]\\) | No penalty applies | -| `1` | Fixed Penalty | \\([A]\\) | A fixed amount applies as penalty | -| `2` | Relative Penalty | \\([R]\\) | A penalty relative to the notional outstanding applies | -| `3` | Interest Rate Differential | \\([I]\\) | A penalty based on the current interest rate differential relative to the notional outstanding applies | -| `255` | Custom | - | Custom penalty | - -The *penalty type* **MAY** be set using the **OPTIONAL** `set_asset_metadata` method -(see [Metadata](metadata.md) section). - -If the debt instrument has a *penalty type* with `ID>0`, the D-ASA **MUST** define -a *penalty rate* \\([PYRT]\\) (`uint64`) for the amount of the penalty. - -> The *penalty rate* is either the absolute amount or the rate of the penalty. - -The *penalty rate* **MAY** be set using the **OPTIONAL** `set_early_repayment_option` -method (see [Metadata](metadata.md) section). diff --git a/docs/specs/contract/interests.md b/docs/specs/contract/interests.md deleted file mode 100644 index e908f6f3..00000000 --- a/docs/specs/contract/interests.md +++ /dev/null @@ -1,86 +0,0 @@ -# Interests - -> Debt instruments interest is calculated on a fixed or variable rate on the outstanding -> principal. - -> The interest rate is the nominal yield paid by the debt instrument on the principal, -> usually expressed as *Annual Percentage Yield* (APY). - -The D-ASA *interest rates* **MUST** be defined in *basis -points* (*bps*). - -## Interest Rate - -The D-ASA **MAY** define a nominal *interest rate* \\([IPNR]\\) (`uint16`). - -The *interest rate* **MUST** be set using the `asset_config` method. - -## Coupons - -> Debt instruments can pay interest in periodic installments, called coupons. - -> Coupons mature in a coupon period, according to a defined coupon schedule. - -The D-ASA **MUST** define the number of *total coupons* `K` (`uint64`): - -- `K>0` if the D-ASA has a **defined** number of coupons; -- `K=0` if the D-ASA has **zero** or **undefined** (perpetual) coupons. - -## Coupon Rates - -> Debt instruments can pay coupons with fixed or variable interest rates. - -The D-ASA **MAY** define the *coupon rates* \\([ARRATE]\\) as `uint16[]` array, -where: - -- The length of the array **MUST** be `K`, equal to the *total coupons*; -- The `K`\-elements of the array are the *coupon rates*, expressed in *bps*. - -If the D-ASA has zero or undefined coupons (`K=0`), the *coupon rates* array **MUST** -be empty and the *interest rate* **MUST** be used instead. - -> Coupon rates could be derived from the interest rate. - -{{#include ../../_include/styles.md:example}} -> D-ASA with 4 coupons with the following rates: 2,00%, 2,50%, 3,00%, and 3,50% -> would have the following coupon rates array (bps): -> -> ```text -> uint16[] = [200, 250, 300, 350] -> ``` - -{{#include ../../_include/styles.md:example}} -> D-ASA with zero coupons would have the following coupon rates array (bps): -> -> ```text -> uint16[] = [] -> ``` - -The *coupon rates* **MUST** be set using the `asset_config` method. - -## Accruing Interest - -> Debt instruments may accrue interest over time. - -The D-ASA *units* **MAY** accrue interest \\([IPAC]\\), according to the *day-count -convention* (see [Day-Count Convention](day-count-convention.md) section). - -If the D-ASA has coupons, the *units* accrued interest **MUST** be calculated with -respect to the latest coupon due date. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with `4` coupons. The 2nd coupon is due. The D-ASA units are -> accruing the interest of the 3rd coupon. The accrued interest is calculated according -> to the day-count convention, applied to the elapsed time with respect to the 2nd -> coupon due date. - -If the D-ASA has coupons, the account *units* accrued interest calculation **SHOULD** -fail if it has pending coupon payments. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with `4` coupons. The 2nd coupon is due. The D-ASA units are -> accruing the interest of the 3rd coupon. Coupon payments are not executed synchronously -> for all the Investors. The 2nd coupon payment is executed for Investor A, while -> Investor B is still waiting for the payment settlement. The accrued interest calculation -> succeeds for Investor A and fails for Investor B until the 2nd coupon payment -> is settled. diff --git a/docs/specs/contract/intro.md b/docs/specs/contract/intro.md index 44bd159a..0c0162ab 100644 --- a/docs/specs/contract/intro.md +++ b/docs/specs/contract/intro.md @@ -4,5 +4,36 @@ > on the exchange of future cash flows. Debt instruments are a subset of financial > contracts. -This section specifies the D-ASA *data model*, with properties and attributes, which -enables the tokenization of a variety of fixed income contracts. +This section specifies the D-ASA ACTUS contract layer. + +A conforming D-ASA **MUST** express the debt instrument as: + +1. ACTUS contract attributes; + +1. Normalized ACTUS terms, initial kernel state, and execution schedule for the +AVM; + +1. Explicit AVM execution of due ACTUS events. + +The canonical execution chain is, therefore: + +```mermaid +flowchart LR + ACTUS["ACTUS Contract"] + NORMALIZE["AVM Normalization"] + EXEC["AVM Execution"] + + ACTUS --> NORMALIZE + NORMALIZE --> EXEC + + style ACTUS fill:#fff9c4,stroke:#f57f17,stroke-width:2px,color:#000 + style NORMALIZE fill:#c8e6c9,stroke:#388e3c,stroke-width:2px,color:#000 + style EXEC fill:#ffccbc,stroke:#d84315,stroke-width:2px,color:#000 +``` + +The following pages define: + +- The supported ACTUS compliance profile; +- The normalized on-chain state and schedule model; +- The contract normalization and configuration flow; +- The numeric representation rules required to move ACTUS values onto the AVM. diff --git a/docs/specs/contract/kernel-state-and-schedule.md b/docs/specs/contract/kernel-state-and-schedule.md new file mode 100644 index 00000000..63f7fa53 --- /dev/null +++ b/docs/specs/contract/kernel-state-and-schedule.md @@ -0,0 +1,148 @@ +# Kernel State and Schedule + +The ACTUS kernel stores the executable contract as three normalized payload classes: + +1. `NormalizedActusTerms` +1. `InitialKernelState` +1. `ExecutionScheduleEntry[]` + +## Normalized Terms + +`NormalizedActusTerms` **MUST** contain the immutable or quasi-immutable contract +configuration required by the kernel, including: + +- Contract Type ID; +- Denomination asset ID and Settlement asset ID; +- Total units; +- Notional Principal; +- Initial Exchange Amount and Date; +- Maturity Date; +- Day-Count Convention ID; +- Rate Reset parameters; +- Dynamic-principal-redemption flags; +- Fixed-point scale. + +## Initial kernel state + +`InitialKernelState` **MUST** capture the pre-`IED` kernel state snapshot uploaded +with `contract_config`. It defines: + +- Status Date \\( [SD] \\); +- Starting event cursor; +- Outstanding principal; +- Interest calculation base; +- Current nominal rate; +- Accrued interest; +- Next principal redemption; +- Cumulative interest and principal indices. + +## Execution schedule + +Each `ExecutionScheduleEntry` **MUST** contain: + +- A contiguous `event_id`; +- An ACTUS `event_type`; +- `scheduled_time`; +- Precomputed accrual factors; +- The next normalized rate and principal state; +- Entry flags. + +The schedule **MUST** satisfy the following invariants: + +- `event_id = 0` **MUST** be `IED`; +- Event IDs **MUST** be contiguous across all pages; +- Schedule entries **MUST** be ordered by nondecreasing `scheduled_time`; +- Page size **MUST NOT** exceed `16` entries in the current kernel; +- The last uploaded page **MUST** finalize `schedule_entry_count` and move the +contract to `STATUS_PENDING_IED`. + +## ACTUS cycles + +ACTUS cycles are an off-chain schedule-generation concept. They define recurring +periods before normalization resolves them into concrete timestamps. + +The D-ASA SDK models ACTUS cycles with the syntax: + +```text +[+|-] +``` + +where: + +- `count` is a positive integer; +- `unit` is one of `D`, `W`, `M`, `Q`, `H`, `Y`; +- `+` and `-` are optional ACTUS stub markers. + +Examples: + +- `90D` +- `3M` +- `1Q` +- `1H` +- `2Y` +- `3M+` +- `1Q-` + +Cycles are used together with ACTUS anchors in `ContractAttributes`, such as: + +- `interest_payment_anchor` + `interest_payment_cycle` +- `principal_redemption_anchor` + `principal_redemption_cycle` +- `rate_reset_anchor` + `rate_reset_cycle` + +The normalization process **MUST** resolve those cycles into explicit schedule entries +before the contract is uploaded to the AVM. + +As a result, the on-chain kernel does not store raw ACTUS cycles. It stores only +the normalized timestamps and state transitions that were derived from those cycles. + +## Contract status machine + +The kernel uses the following status identifiers: + +| Status | ID | Meaning | +|:--------------|:------|:----------------------------------------------| +| `INACTIVE` | `0` | Terms and schedule not fully configured | +| `PENDING_IED` | `50` | Schedule uploaded; issuance not yet activated | +| `ACTIVE` | `100` | `IED` executed; contract lifecycle is live | +| `ENDED` | `200` | Terminal state reached | + +```mermaid +stateDiagram-v2 + [*] --> INACTIVE + INACTIVE --> PENDING_IED: Upload schedule + PENDING_IED --> ACTIVE: Execute IED + ACTIVE --> ACTIVE: Execute events + ACTIVE --> ENDED: Terminal state + ENDED --> [*] + + state "INACTIVE (0)
Terms and schedule
not fully configured" as INACTIVE + state "PENDING_IED (50)
Schedule uploaded
Issuance not activated" as PENDING_IED + state "ACTIVE (100)
IED executed
Contract lifecycle live" as ACTIVE + state "ENDED (200)
Terminal state reached" as ENDED +``` + +## Performance default flag + +Kernel lifecycle `status` and contract performance are distinct concepts. + +Outside the kernel normalized state, the reference implementation stores a boolean +RBAC-managed global-state flag, `defaulted`, to record manual contract default +performance. + +An active Trustee **MAY** update this flag by calling `rbac_contract_default` +with a boolean `defaulted` argument. + +`defaulted` is not part of `InitialKernelState` and is not returned by `contract_get_state`. +Clients that need it **MUST** read the dedicated global-state key. + +## Due-event execution + +The kernel advances the schedule through explicit ABI calls: + +- `contract_execute_ied` applies the first due `IED`; +- `apply_non_cash_event` applies the next due non-cash event after `IED`; +- `fund_due_cashflows` processes due cash events and advances the cursor; +- `contract_get_next_due_event` returns the next due entry, or a zero sentinel after +end. + +This split is the normative execution model for D-ASA. diff --git a/docs/specs/contract/metadata.md b/docs/specs/contract/metadata.md index 9d2635a2..b2552896 100644 --- a/docs/specs/contract/metadata.md +++ b/docs/specs/contract/metadata.md @@ -1,12 +1,10 @@ # Metadata {#metadata} -> Metadata can be used to inform optional properties that define the specific D-ASA -> implementation. +> Metadata can be used to inform optional properties that define the specific D-ASA. -The D-ASA metadata **MAY** be set using the **OPTIONAL** `set_asset_metadata` method. - -The D-ASA metadata **MAY** be updated using the **OPTIONAL** `set_asset_metadata` -method. +> [!IMPORTANT] +> D-ASA metadata is *informational only*, they have no influence on the contract +> execution and are non-normative with respect to ACTUS specifications. ## Prospectus @@ -15,7 +13,7 @@ method. > The D-ASA can notarize the debt instrument prospectus in the metadata. The D-ASA *prospectus hash* (`byte[32]`) and *prospectus URL* (`string`) **MAY** -be set using the **OPTIONAL** `set_asset_metadata` method. +be set on contract configuration. The *prospectus hash* **MUST** be computed with SHA-512/256, as defined in NIST FIPS 180-4. diff --git a/docs/specs/contract/normalization-and-configuration.md b/docs/specs/contract/normalization-and-configuration.md new file mode 100644 index 00000000..dce76130 --- /dev/null +++ b/docs/specs/contract/normalization-and-configuration.md @@ -0,0 +1,96 @@ +# Normalization and Configuration + +The contract configuration flow **MUST** follow the same sequence as the reference +implementation: + +```text +ContractAttributes -> normalize_contract_attributes() -> contract_config() -> contract_schedule() -> primary_distribution() -> contract_execute_ied() +``` + +## Required steps + +1. Define the debt instrument with `ContractAttributes`. + +1. Normalize the contract off chain with `normalize_contract_attributes()`. + +1. Upload `NormalizedActusTerms`, `InitialKernelState`, and the prospectus with +`contract_config`. + +1. Upload the normalized schedule in contiguous pages with `contract_schedule`. + +1. Reserve all units with `primary_distribution`. + +1. Activate issuance by executing `contract_execute_ied`. + +`contract_schedule` **MUST** be called after `contract_config`, and `contract_execute_ied` +**MUST** be called only after the full schedule is uploaded and the full unit supply +is reserved. + +## Example + +The deployment helpers and tests provide a code-accurate PAM fixed coupon bond example: + +```python +attrs = make_pam_fixed_coupon_bond_profile( + contract_id=1, + status_date=1_700_000_000, + initial_exchange_date=1_702_592_000, + maturity_date=1_858_112_000, + notional_principal=10_000, + nominal_interest_rate=0.02, + interest_payment_cycle=Cycle.parse_cycle("90D"), + interest_payment_anchor=1_710_368_000, +) + +normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=12345, + denomination_asset_decimals=2, + notional_unit_value=100, + secondary_market_opening_date=1_702_592_000, + secondary_market_closure_date=1_858_198_400, +) + +pages = normalized.schedule_pages(page_size=16) +``` + +The normalized result has the following properties: + +- `notional_principal = 1_000_000` base units; +- `total_units = 100`; +- `fixed_point_scale = 1_000_000_000`; +- `schedule = [IED] + 20 * [IP] + [MD]`; +- `len(schedule) = 22`; +- `len(pages) = 2`. + +The upload sequence is: + +```python +client.send.contract_config(...) +client.send.contract_schedule(schedule_page_index=0, is_last_page=False, ...) +client.send.contract_schedule(schedule_page_index=1, is_last_page=True, ...) +client.send.primary_distribution(...) +client.send.contract_execute_ied() +``` + +## Schedule paging + +Schedule paging is part of configuration, not a transport detail. The caller **MUST** +preserve: + +- contiguous `schedule_page_index` values; +- contiguous `event_id` values across pages; +- chronological ordering across page boundaries; +- one final page flagged with `is_last_page = true`. + +## Secondary-market configuration + +`transfer_set_schedule` is separate from kernel configuration. Secondary-market +dates are not part of the on-chain `NormalizedActusTerms` struct in the current +ABI and, if enforced, **MUST** be configured separately at the execution layer. + +## Performance state + +The contract-level `defaulted` performance flag is not part of normalization or +`InitialKernelState`. If used, it is updated separately at execution time through +the RBAC method `rbac_contract_default`. diff --git a/docs/specs/contract/numeric-precision.md b/docs/specs/contract/numeric-precision.md new file mode 100644 index 00000000..9a14408d --- /dev/null +++ b/docs/specs/contract/numeric-precision.md @@ -0,0 +1,85 @@ +# Numeric Precision and Conversions + +All values uploaded to the kernel **MUST** fit into AVM `uint64` values. + +## Amounts + +Display amounts are normalized into ASA base units: + +```text +base_units = int(display_amount * 10^decimals) +``` + +The conversion truncates toward zero because normalization converts the scaled decimal +value to an integer directly. + +## Rates + +Rates are normalized into fixed-point integers with: + +```text +fixed_point_rate = int(rate * 1_000_000_000) +``` + +The D-ASA fixed-point scale is: + +```text +FIXED_POINT_SCALE = 1_000_000_000 +``` + +The kernel then uses wide multiplication and division to apply those rates safely +on chain. + +## Units + +The normalization process **MUST** derive the total unit supply from: + +```text +total_units = notional_principal / notional_unit_value +``` + +This division **MUST** be exact. + +## Initial exchange amount + +The initial exchange amount is normalized as: + +```text +initial_exchange_amount = notional - discount +initial_exchange_amount = notional + premium +``` + +where: + +- a positive `premium_discount_at_ied` is treated as a discount; +- a negative `premium_discount_at_ied` is treated as a premium. + +Normalization **MUST** fail if the result becomes negative or exceeds `uint64`. + +## Overflow constraints + +Every normalization step **MUST** reject: + +- negative amounts that would require signed integers on chain; +- values larger than `2^64 - 1`; +- scaled amounts or rates that overflow after multiplication by their scale. + +## Example + +For a denomination asset with `2` decimals: + +- `10_000` display units normalize to `1_000_000` base units; +- `100` display units normalize to `10_000` base units; +- `0.02` normalizes to `20_000_000` fixed-point units; +- `1_000_000 / 10_000 = 100` total units. + +## Cumulative indices + +The accounting layer uses fixed-point cumulative indices for contract-wide cashflow +funding: + +- Contract-wide amount -> Per-unit index delta; +- Per-unit index delta -> Claim at settlement time. + +This design preserves precision at contract level while keeping holder settlement +lazy and deterministic. diff --git a/docs/specs/contract/overview.md b/docs/specs/contract/overview.md new file mode 100644 index 00000000..a72ad57e --- /dev/null +++ b/docs/specs/contract/overview.md @@ -0,0 +1,10 @@ +# Contract + +The contract section defines the ACTUS compliance profile, the normalized kernel +state, the schedule model, and the AVM configuration flow. + +The canonical execution chain is: + +```text +ACTUS contract -> AVM normalization -> AVM execution +``` diff --git a/docs/specs/contract/performance.md b/docs/specs/contract/performance.md deleted file mode 100644 index db3cc289..00000000 --- a/docs/specs/contract/performance.md +++ /dev/null @@ -1,107 +0,0 @@ -# Performance {#performance} - -> Debt instruments performances are exposed to credit risks. - -The D-ASA *performance* \\([PRF]\\) **MUST** be identified with one of the following -enumerated IDs (`uint8`): - -| ID | Name | ACTUS Acronym | Description | -|:----|:----------:|---------------|:-------------------------------------------------------------------------------------| -| `0` | Performant | \\([PF]\\) | Contract is performing according to terms and conditions | -| `1` | Delayed | \\([DL]\\) | Contractual payment obligations are delayed according to the *grace period* | -| `2` | Delinquent | \\([DQ]\\) | Contractual payment obligations are delinquent according to the *delinquency period* | -| `3` | Default | \\([DF]\\) | Contract defaulted on payment obligations according to *delinquency period* | -| `4` | Matured | \\([MA]\\) | Contract matured | -| `5` | Terminated | \\([TE]\\) | Contract has been terminated | - -## Grace Period {#grace-period} - -> Debt instruments may define a grace period as a time window after the payment -> due date during which payment may be retried without a penalty. - -The D-ASA **MAY** define a *grace period* \\([GRP]\\) (`uint64`). - -The *grace period* **MUST** be defined as UNIX time, in seconds. - -In case of non-continuous *day-count conventions* (`ID<255`, see [Day-Count Conventions](day-count-convention.md) -section), the *grace period* **MUST** be multiples of a day, in seconds (`86400`). - -The *grace period* **MAY** be set using the `asset_config` method as *time period* -with: - -- The *time period duration* (`uint64`) equal to the *grace period* duration; - -- The *time period repetitions* (`uint64`) equal to `1`. - -- The *grace period* **MUST** be anchored \\([ANX]\\) to the *time event* of the -first failed payment. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with a *grace period*. A D-ASA coupon payment is triggered -> on due date, but there is not enough liquidity to pay all the investors. The D-ASA -> program starts counting the *grace period*, increments a failed payments counter, -> and waits 3 hours to retry. If the D-ASA payment retrial succeeds within the *grace -> period*, no penalty or fee is applied. - -## Delinquency Period {#delinquency-period} - -> Debt instruments may define a delinquency period as a time window after the grace -> period. If payment happens after the delinquency period, then the counterparty -> is in technical default. - -The D-ASA **MAY** define a *delinquency period* \\([DQP]\\) (`uint64`). - -The *delinquency period* **MUST** be defined as UNIX time, in seconds. - -In case of non-continuous *day-count conventions* (`ID<255`, see [Day-Count Conventions](day-count-convention.md) -section), the *delinquency period* **MUST** be multiples of a day, in seconds (`86400`). - -The *delinquency period* **MAY** be set using the `asset_config` method as *time -period* with: - -- The *time period duration* (`uint64`) equal to the *delinquency period* duration; - -- The *time period repetitions* (`uint64`) equal to `1`. - -- The *delinquency period* **MUST** be anchored \\([ANX]\\) to the *time event* -of the first failed payment or at the end of the *grace period* (if any). - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with a *delinquency period*. A D-ASA coupon payment is triggered -> on due date, but there is not enough liquidity to pay all the investors. The D-ASA -> program starts counting the *delinquency period*, increments a failed payments -> counter, and waits 3 hours to retry. If the D-ASA payment retrial succeeds within -> the *delinquency period*, a penalty or fee is applied. - -## Default - -> Default is the ultimate failure to pay the lenders according to the payment obligations. -> When this happens, the creditors have the right to declare default to the debtors. - -> Default processes require the intervention of regulatory bodies and courts, therefore -> the D-ASA default status bridges the default process off-chain. - -The D-ASA **SHOULD** enter *default* status if it cannot perform payments on due -dates. - -The D-ASA **MAY** disable all non-administrative methods on *default* status. - -> The D-ASA default can be called either automatically (based on program conditions) -> or manually (based on the decision of a trustee). - -The *default* status **MAY** be set with the **OPTIONAL** `set_default_status` method. - -{{#include ../../_include/styles.md:example}} -> The D-ASA has no *grace period* and no *delinquency period*. A D-ASA coupon payment -> is triggered on due date, but there is not enough liquidity to pay all the investors. -> The D-ASA contract automatically enters in *default* immediately. - -{{#include ../../_include/styles.md:example}} -> The D-ASA has a *grace period* and a *delinquency period*. A D-ASA coupon payment -> is triggered on due date, but there is not enough liquidity to pay all the investors. -> The D-ASA program starts counting the *grace period* and *delinquency period*. -> If the *delinquency period* expires, then the contract enters in *default*. - -{{#include ../../_include/styles.md:example}} -> A D-ASA coupon payment is triggered on due date, but there is not enough liquidity -> to pay all the investors. The D-ASA contract relies on a trustee to call the *default*. diff --git a/docs/specs/contract/principal.md b/docs/specs/contract/principal.md deleted file mode 100644 index 9451baa8..00000000 --- a/docs/specs/contract/principal.md +++ /dev/null @@ -1,91 +0,0 @@ -# Principal {#principal} - -> Debt instruments principal is the amount of capital borrowed and used as a base -> for calculating interest. - -The D-ASA **MAY** define the *principal* \\([NT]\\) (`uint64`), expressed in the -*denomination asset*. - -If the D-ASA has a *principal*, it **MUST** define a *minimum denomination* (`uint64`), -expressed in the *denomination asset*. - -The *minimum denomination* **MUST** be a divisor of the *principal*. - -The *principal* and the *minimum denomination* **MUST** be set using the `asset_config` -method. - -If the D-ASA has no defined *principal*, the *principal* and the *minimum denomination* -**MUST** be set to `0`. - -## Discount - -> Debt instruments principal may be placed at discount on issuance. - -The D-ASA **MAY** define a *discount* rate \\([PDIED]\\) (`uint16`) in *bps* to -apply to the principal on the issuance. - -The *discount* **MUST** be set using the `asset_config` method. - -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with a principal of 1M EUR paid at maturity -> and a minimum denomination of 1,000 EUR. The D-ASA has a principal discount of -> 200 bps (2%) at the issuance. Each D-ASA unit is sold on the primary market at -> 980 EUR and will be redeemed for 1,000 EUR of principal at maturity. - -## Amortization - -> ⚠️This section is still subject to major changes and reviews. - -> Debt instruments principal may be amortized until maturity, according to an amortization -> schedule. - -If the debt instrument has *principal amortization*, the D-ASA **MUST** define the -*amortization rates* as `uint16[]` array, where: - -- The length of the array is `N=K+1`, with `K` equal to the **fixed** *total coupons* -(see [Coupons](interests.md#coupons) section); - -- The first `K`elements of the array are the *amortizing rates* associated with -*coupon* payments; - -- The last element of the array is the *amortization rate* associated with *outstanding -principal* payment at *maturity date*; - -- The elements of the array are expressed in *basis -points* (*bps*); - -- The sum of all the *amortization rates* is equal to `10,000` *bps*. - -The *amortization rates* define the amount of principal \\([PRNXT]\\) paid at the -next payment date. - -{{#include ../../_include/styles.md:example}} -> A D-ASA with 5 coupons and even principal amortizing rates has the following amortizing -> rates (bps): -> -> ```uint16[] = [2000, 2000, 2000, 2000, 2000, 0]``` - -{{#include ../../_include/styles.md:example}} -> A D-ASA with 5 coupons and a single principal early repayment of 50% has the following -> amortizing rates (bps): -> -> ```uint16[] = [0, 0, 5000, 0, 0, 5000]``` - -{{#include ../../_include/styles.md:example}} -> A D-ASA with 4 coupons and different principal amortizing rates (bps): -> -> ```uint16[] = [1000, 2000, 3000, 4000, 0]``` - -{{#include ../../_include/styles.md:example}} -> The following are invalid amortizing rates, since their sum is not equal to `10,000` -> bps: -> -> ```uint16[] = [1000, 2000, 3000, 4000, 5000]``` - -The *amortizing rates* **MUST** be set using the **OPTIONAL** `set_amortizing_rates` -method. - -The *amortizing rates* **MAY** be updated with the **OPTIONAL** `set_amortizing_rates` -method. - -The updated *amortizing rates* **MUST NOT** modify past amortizing rates. diff --git a/docs/specs/contract/time-events.md b/docs/specs/contract/time-events.md deleted file mode 100644 index f4d7712e..00000000 --- a/docs/specs/contract/time-events.md +++ /dev/null @@ -1,138 +0,0 @@ -# Time Events - -> D-ASA *time events* are time on which contractual events are due or on which cyclic -> events begin or end. - -## Primary Distribution - -> Debt instruments can be distributed on the primary market during the primary distribution. - -> The opening and closure dates define the primary distribution duration. - -The D-ASA **MUST** have a *primary opening* (`uint64`) and *closure date* (`uint64`). - -## Issuance - -> Debt instruments start accruing interest on the issuance date. - -The D-ASA **MUST** have an *issuance date* \\([IED]\\) (`uint64`). - -## Maturity - -> Debt instruments may have a maturity date, on which the principal is repaid and -> the contract obligations expire. - -> Debt instruments may have a fixed or variable maturity date. - -The D-ASA **MAY** have a *maturity date* \\([MD]\\) (`uint64`). - -The *maturity date* **MAY** be updated in case of early repayment options (see -[Early Repayment Options](early-repayment-options.md) section). - -## Time Events Array - -The D-ASA **MUST** define *time events* \\([TEV]\\) as `uint64[]` array, where: - -- The length of the array **MUST** be: - - - `N=K+4`, if the D-ASA **has** a *maturity date;* - - `N=K+3`, if the D-ASA **has not** a *maturity date;* - - with `K` equal to the *total coupons*. - -- The first element **MUST** be the *primary distribution opening date* (`uint64`): -the time at which the D-ASA primary distribution opens; - -- The second element **MUST** be the *primary distribution closure date* (`uint64`): -the time at which the D-ASA primary distribution closes; - -- The third element **MUST** be the *issuance date* (`uint64`): the time at which -D-ASA starts to accrue interest on the principal; - -- If the D-ASA has a **fixed** number of *coupons*, then the next `K`-elements -**MUST** be the *coupon due dates* \\([IP]\\) (`uint64[K]`): times at which the -coupons mature and the interest payment \\([IPPNT]\\) can be executed[^1]. The first -coupon due date corresponds to \\([IPANX]\\). - -- If the D-ASA has **unlimited** number of *coupons*, then `K` **MUST** be `0` and -*coupons due dates* \\([IP]\\) are managed with *time periods* (see [Time Periods](time-periods.md#unlimited-time-schedule) -section). - -- If the D-ASA **has** a *maturity date*, the last element **MUST** be the *maturity -date* (`uint64`). - -The *time events* **MUST** be sorted in strictly ascending order. - -The *time events* **MUST** be defined as UNIX time, in seconds. - -In the case of non-continuous *day-count conventions* (`ID<255`, see [Day-Count -Conventions](day-count-convention.md) section), the *time periods* between subsequent -events **MUST** be multiples of a day, in seconds (`86400`)[^2]. - -The *time events* **MUST** be set using the `asset_config` method. - -{{#include ../../_include/styles.md:example}} -> The following are valid *time events* (UNIX times): -> -> ```text -> uint64[] = [1704067200, 1735603200, 1767139200, 1798675200, 1830211200] -> ``` - -{{#include ../../_include/styles.md:example}} -> The following are invalid (respectively unsorted and not-strictly sorted) *time -> events* (UNIX times): -> -> ```text -> uint64[] = [1830211200, 1704067200, 1735603200, 1767139200, 1798675200] -> ``` -> -> ```text -> uint64[] = [1704067200, 1735603200, 1767139200, 1798675200, 1830211200, 1830211200] -> ``` - -{{#include ../../_include/styles.md:example}} -> A D-ASA with `K` *total coupons* and a **defined** *maturity date*, has the following -> *time events*: -> -> ```text -> uint64[] = [primary_distribution_opening_date, primary_distribution_closure_date, issuance_date, coupon_due_date_1, ..., coupon_due_date_K, maturity_date] -> ``` - -{{#include ../../_include/styles.md:example}} -> A D-ASA whose primary distribution lasts from December 1st, 2023 00:00:00 GMT+0 -> to December 15th, 2023 00:00:00 GMT+0, is issued on January 1st, 2024 00:00:00 -> GMT+0 and matures on January 1st, 2028 00:00:00 GMT+0, with 4 annual coupons, -> each paid on December 31st 00:00:00 GMT+0, has the following *time events* array -> (UNIX times): -> -> ```text -> uint64[] = [1701388800, 1702598400, 1704067200, 1735603200, 1767139200, 1798675200, 1830211200, 1830297600] -> ``` - -{{#include ../../_include/styles.md:example}} -> A D-ASA whose primary distribution lasts from December 1st, 2023 00:00:00 GMT+0 -> to December 15th, 2023 00:00:00 GMT+0, is issued on January 1st, 2024 00:00:00 -> GMT+0 and matures on January 1st, 2028 00:00:00 GMT+0, with zero coupons, has -> the following *time events* array (UNIX times): -> -> ```text -> uint64[] = [1701388800, 1702598400, 1704067200, 1830297600] -> ``` - -{{#include ../../_include/styles.md:example}} -> A D-ASA whose primary distribution lasts from December 1st, 2023 00:00:00 GMT+0 -> to December 15th, 2023 00:00:00 GMT+0, is issued on January 1st, 2024 00:00:00 -> GMT+0 and no maturity, with perpetual coupons, has the following *time events* -> array (UNIX times): -> -> ```text -> uint64[] = [1701388800, 1702598400, 1704067200] -> ``` - ---- - -[^1]: The D-ASA supports just interest payments at the end of each coupon period. - -[^2]: This applies to any kind of time event (e.g., principal and interest payments, -primary and secondary market dates, early repayments options, interest updates, -etc.) diff --git a/docs/specs/contract/time-periods.md b/docs/specs/contract/time-periods.md deleted file mode 100644 index 5ddb5303..00000000 --- a/docs/specs/contract/time-periods.md +++ /dev/null @@ -1,84 +0,0 @@ -# Time Periods - -> D-ASA time periods can be used to define recurring (or "cyclic") events. - -> D-ASA time periods start on (are "anchored" to) *time events*. - -The D-ASA **MAY** define *time periods* \\([CL]\\) as `(uint64,uint64)[]` array, -where: - -- The first element of the tuple defines the *time period duration* (`uint64`). -It **MUST** be strictly greater than `0`; - -- The second element of the tuple defines the *time period repetitions* (`uint64`). -It **MUST** be `0` if *repetitions* are **unlimited**; - -The *time periods* **MUST** be anchored \\([ANX]\\) to a *time event* (see [Time -Events](time-events.md) section). - -The *time periods* **MUST** be defined as UNIX time, in seconds. - -In case of non-continuous *day-count conventions* (`ID<255`, see [Day-Count Conventions](day-count-convention.md) -section), the *time periods* **MUST** be multiples of a day, in seconds (`86400`). - -The *time periods* **MAY** be set using the `asset_config` method. - -If the D-ASA does not implement *time periods,* it **MUST** be set to `[]` in the -`asset_config` method. - -{{#include ../../_include/styles.md:example}} -> The following are valid *time periods* (UNIX times) indicating: -> -> - a daily time event with unlimited repetitions -> - a monthly (30 days) time event with 12 repetitions -> -> ```text -> (uint64,uint64)[] = [(86400, 0), (2592000, 12)] -> ``` - -{{#include ../../_include/styles.md:example}} -> The following are invalid *time periods* (UNIX times): -> -> ```text -> (uint64,uint64)[] = [(0, 0), (0, 12)] -> ``` - -The *time periods* **MUST** be chronologically consistent with respect to the *time -events*. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with an *issuance date* and a *maturity date*, defined as *time -> events*, and 4 coupons whose periods are defined by *time periods*. -> -> The sum of the 4 coupon *time period durations* must be smaller than the time -> period between the *issuance date* and the *maturity date*. - -## Unlimited Time Schedule - -If the D-ASA has an **undefined** number of *coupons*, then the *coupon due dates* -\\([IP]\\) **MUST** be defined with a *time period* `(uint64,uint64)`. - -The first coupon due date \\([IPANX]\\) occurs on *issuance date* plus the *time -period duration* \\([IPCL]\\) and the interest payment \\([IPPNT]\\) can be executed[^1]. - -{{#include ../../_include/styles.md:example}} -> A D-ASA whose primary distribution lasts from December 1st, 2023 00:00:00 GMT+0 -> to December 15th, 2023 00:00:00 GMT+0, is issued on January 1st, 2024 00:00:00 -> GMT+0 and no maturity, with perpetual coupons maturing every 365 days, has the -> following *time events* array (UNIX times): -> -> ```text -> uint64[] = [1701388800, 1702598400, 1704067200] -> ``` -> -> and the following *time period*: -> -> ```text -> (uint64, uint64) = [31536000, 0] -> ``` -> -> The first coupon due date \\([IPANX]\\) is `1704067200 + 31536000` (UNIX time). - ---- - -[^1]: The D-ASA supports just interest payments at the end of each coupon period. diff --git a/docs/specs/contract/time-schedule.md b/docs/specs/contract/time-schedule.md deleted file mode 100644 index eb1c13f5..00000000 --- a/docs/specs/contract/time-schedule.md +++ /dev/null @@ -1,33 +0,0 @@ -# Time Schedule - -> Debt instruments may have fixed or variable time schedule (e.g., variable coupon -> due date, etc.). - -> Debt instruments may have a limited or unlimited time schedule (e.g., a fixed -> coupon bond or a perpetual bond). - -## Time Measurement - -The time on the Algorand Virtual Machine is defined by the block UNIX -timestamp[^1]. - -> The Algorand protocol has dynamic block latency with instant finality. At the -> time of writing (Jan 2025), block finality is about 2.8 seconds[^2]. - -> The AVM time may present a drift with respect to external standard time references. - -## Events - -The D-ASA events \\([EVT]\\) are defined by: - -- *time events* \\([TEV]\\) (or "anchors"); -- *time periods* (or "cycles"). - ---- - -[^1]: ACTUS is based on ISO 8601 -timestamps. The UNIX to ISO 8601 conversions are left to clients (see [Calendar](day-count-convention.md#calendar) -section). - -[^2]: ACTUS timestamps have millisecond precision, which is not compatible with -blockchains' latency. diff --git a/docs/specs/contract/type.md b/docs/specs/contract/type.md deleted file mode 100644 index c01e9e66..00000000 --- a/docs/specs/contract/type.md +++ /dev/null @@ -1,22 +0,0 @@ -# Contract Type - -> Debt instruments such as bullet bonds, amortizing loans, mortgages, etc. differ -> based on their cash flow exchange patterns (e.g., principal and interest payment -> time schedules, fixed or variable interest rates, etc.). - -> The ACTUS taxonomy reduces the majority of all financial contracts to a defined -> set of 32 generalized cash flow exchange patterns, called contract types. - -It is **RECOMMENDED** to classify the D-ASA with an ACTUS *contract type* \\([CT]\\) -(`uint8`) (see the ACTUS -taxonomy). - -The *contract type* **MUST** have the following properties: - -- `family`: Basic -- `class`: Fixed Income - -The *contract type* **MAY** be set using the **OPTIONAL** `set_asset_metadata` method -(see [Metadata](metadata.md) section). - -It is **RECOMMENDED** to use the unique D-ASA ID as *contract identifier* \\([CID]\\). diff --git a/docs/specs/contract/variable-interests.md b/docs/specs/contract/variable-interests.md deleted file mode 100644 index 7a054b26..00000000 --- a/docs/specs/contract/variable-interests.md +++ /dev/null @@ -1,122 +0,0 @@ -# Variable Rates - -> ⚠️This section is still subject to major changes and reviews. - -> Debt instruments may have variable interest rates, based on external data oracles. - -If the debt instrument has *variable interest rates*, the D-ASA **MAY** implement -the **OPTIONAL** `set_variable_interest_rate` method. - -## Interest Update Dates - -The D-ASA **MUST** define *interest update dates* of known \\([RRF]\\) or unknown -\\([RR]\\) with respect to: - -- *time events* if the D-ASA has **fixed** number of *coupons* (see [Time -Events](time-events.md#time-events-array) section); - -- *time periods* if the D-ASA has **undefined** number of *coupons* (see [Time -Periods](time-periods.md#unlimited-time-schedule) section). - -The first *interest update date* corresponds to \\([RRANX]\\). - -## Spread - -> Debt instruments typically define a spread (bps) with respect to an external index -> to update the interest rate. - -The D-ASA **MAY** define a *rate spread* \\([RRSP]\\) (`uint16`) in *bps* to apply -to the external interest data feed. - -The *rate spread* **MUST** be set using the **OPTIONAL** `set_variable_interest_rate` -method. - -If the debt instrument has no *rate spread*, then the D-ASA **MUST** set the *rate -spread* to `0`. - -{{#include ../../_include/styles.md:example}} -> A D-ASA has variable interest rates pegged to an off-chain index. Interest update -> is equal to the off-chain index plus the *rate spread* (bps). - -## Cap and Floor - -> Debt instruments may define limitations to the interest rate variability, either -> over the whole contract lifespan or over specific periods. - -### Life Caps - -The D-ASA **MAY** define a *life cap* \\([RRLC]\\) (`uint16`) in *bps* to apply -to the variable *interest rate*. - -The D-ASA **MAY** define a *life floor* \\([RRLF]\\) (`uint16`) in *bps* to apply -to the variable *interest rate*. - -The *life cap* and the *life floor* **MUST** be set using the **OPTIONAL** `set_variable_interest_rate` -method. - -If the debt instrument has no *life cap*, then the D-ASA **MUST** set the *life -cap* to `0`. - -If the debt instrument has no *life floor*, then the D-ASA **MUST** set the *life -floor* to `0`. - -### Period Caps - -The D-ASA **MAY** define a *period cap* \\([RRPC]\\) (`uint16`) in *bps* to apply -to the variable *interest rate*. - -The D-ASA **MAY** define a *period floor* \\([RRPF]\\) (`uint16`) in *bps* to -apply to the variable *interest rate*. - -The *period cap* and the *period floor* **MUST** be set using the **OPTIONAL** `set_variable_interest_rate` -method. - -If the debt instrument has no *period cap*, then the D-ASA **MUST** set the *period -cap* to `0`. - -If the debt instrument has no *period floor*, then the D-ASA **MUST** set the *period -floor* to `0`. - -## Fixing Period - -> Debt instruments usually schedule interest rate updates before the new rate applies -> (defined by the rate reset schedule). - -The D-ASA **MUST** define a *fixing period* \\([RRFIX]\\) (`uint64`) that specifies -a period of time before the *coupon due date* in which the interest can be updated. - -The *fixing period* **MUST** be set using the **OPTIONAL** `set_variable_interest_rate` -method. - -## Rates Update - -> Debt instruments may have a fixed or undefined rate update schedule. - -If the debt instrument has a **fixed** rate update schedule, then the D-ASA **MUST** -use the *coupon due dates* (either *time events* or *time periods*) as anchors for -the rate update events (see [Time Schedule](time-schedule.md) section). - -The *interest rate* **MAY** be updated using the **OPTIONAL** `update_interest_rate` -method. - -If the D-ASA has coupons, the *interest rate* **MUST NOT** be updated if there is -any due coupon still to be paid. - -The *coupon rates* **MAY** be updated using the **OPTIONAL** `update_coupon_rates` -method. - -The *coupon rates* **MUST NOT** be updated if there is any due coupon still to be -paid. - -The updated *coupon rates* **MUST NOT** modify past coupon rates. - -The *interest rate* and *coupon rates* updatability **MUST** be restricted to the -*interest oracle* role (see [Oracles](../rbac/roles.md#oracles) section). - -{{#include ../../_include/styles.md:example}} -> A D-ASA has variable interest rates pegged to an off-chain index. Interest update -> permissions are granted to an external interest oracle. - -{{#include ../../_include/styles.md:example}} -> A D-ASA has variable interest rates based on covenant breaches. Interest update -> permissions are granted to a trustee in charge of verifying breaches. diff --git a/docs/specs/contract/variable-time-schedule.md b/docs/specs/contract/variable-time-schedule.md deleted file mode 100644 index 5e749664..00000000 --- a/docs/specs/contract/variable-time-schedule.md +++ /dev/null @@ -1,47 +0,0 @@ -# Variable Time Schedule {#variable-time-schedule} - -> Debt instruments can have variable time schedule, based on different contract -> terms, such as covenants, etc. - -## Variable Time Events {#variable-time-events} - -The *time events* **MAY** be updated with the **OPTIONAL** `update_time_events` -method. - -The updated *time events* **MUST NOT** modify past events. - -> A reference implementation **SHOULD** restrict the time events updatability according -> to the optionalities of the agreement. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with a *maturity date* and 4 coupons, defined by *time events*. -> The 2nd coupon is due. -> -> The updated time events **can no longer** modify: -> -> - the *primary distribution opening date*; -> - the *primary distribution closure date*; -> - the *issuance date*; -> - the 1st and 2nd coupon due dates. -> -> The updated time events **can still** modify: -> -> - the 3rd and 4th coupon due dates; -> - the *maturity date*. - -## Variable Time Periods {#variable-time-periods} - -The *time periods* **MAY** be updated with the **OPTIONAL** `update_time_periods` -method. - -The updated *time periods* **MUST** preserve chronological consistency with respect -to the *time events*. - -> A reference implementation **SHOULD** restrict the time periods updatability. - -{{#include ../../_include/styles.md:example}} -> Let's have a D-ASA with an *issuance date* and a *maturity date*, defined as *time -> events*, and 4 coupons whose periods are defined by *time periods*. -> -> The sum of the 4 updated coupon *time period durations* must be smaller than the -> time period between the *issuance date* and the *maturity date*. diff --git a/docs/specs/execution/overview.md b/docs/specs/execution/overview.md new file mode 100644 index 00000000..0cb22d0a --- /dev/null +++ b/docs/specs/execution/overview.md @@ -0,0 +1,4 @@ +# Execution + +The execution layer applies the configured contract in production through primary +distribution, cashflow funding and claims, and unit transfers. diff --git a/docs/specs/execution/payment-agent/coupons-payment.md b/docs/specs/execution/payment-agent/coupons-payment.md deleted file mode 100644 index fa3daad1..00000000 --- a/docs/specs/execution/payment-agent/coupons-payment.md +++ /dev/null @@ -1,11 +0,0 @@ -# Coupons Payment {#coupons-payment} - -If the D-ASA has coupons, it **MUST** pay due coupons, according to the *time schedule*, -with the **OPTIONAL** `pay_coupon` method. - -The D-ASA **MUST** pay due coupons, once, to the Investors. - -The D-ASA **MUST NOT** pay coupons before *coupon due dates*. - -In the case of an on-chain payment agent, the D-ASA **MUST** pay the *coupons* to -the Investor Payment Addresses. diff --git a/docs/specs/execution/payment-agent/early-repayment.md b/docs/specs/execution/payment-agent/early-repayment.md deleted file mode 100644 index 0999c4db..00000000 --- a/docs/specs/execution/payment-agent/early-repayment.md +++ /dev/null @@ -1,18 +0,0 @@ -# Early Repayment {#early-repayment} - -If the *early repayment options* repays the principal amount before *maturity* (*prepayment -effect* `1`, see [Prepayment Effects](../../contract/early-repayment-options.md#prepayment-effects) -section), the D-ASA **MUST** implement the **OPTIONAL** `early_repayment` method. - -In the case of an on-chain payment agent, the D-ASA **MUST** repay the *principal* -to the Investor Payment Addresses. - -The D-ASA units associated with the early repaid principal **MUST** be removed from -Investors’ Accounts and from circulation. - -{{#include ../../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with a *principal* of 1M EUR and a *minimum -> denomination* of 1,000 EUR. The D-ASA originally had 1,000 *total units* in circulation. -> An early repayment of 500k EUR (equal to 500 units) is executed for some Investors. -> The D-ASA now has 500 circulating units (worth 1,000 EUR each), while 500 early -> repaid units are removed from circulation. diff --git a/docs/specs/execution/payment-agent/payment-agent.md b/docs/specs/execution/payment-agent/payment-agent.md index a12903eb..8f04fc4d 100644 --- a/docs/specs/execution/payment-agent/payment-agent.md +++ b/docs/specs/execution/payment-agent/payment-agent.md @@ -1,40 +1,66 @@ # Payment Agent {#payment-agent} > Debt instruments' cash flows usually involve: -> > - *Principal repayment* > - *Early repayments* > - *Coupon payments* -> D-ASA cash flows might not be executed synchronously for all the Investors. The -> execution of a given cash flow could last a few blocks[^1], depending on the number -> of payees. +The Payment Agent executes ACTUS cashflows in two phases: -> Although a single block proposer could order transactions in a block, in a healthy -> network block proposers are selected randomly by the Algorand consensus. Therefore, -> order of payments in a block is random and unbiased, with no systematic advantage -> or precedence of a payee with respect to others. +1. `fund_due_cashflows` +1. `claim_due_cashflows` -> D-ASA supports both on-chain and off-chain payment agents, depending on the settlement -> asset (see [Settlement](settlement.md) section). +This split is normative for the current reference implementation. There are no +separate `pay_coupon`, `pay_principal`, or legacy early-repayment payment methods. -> For reference implementations using on-chain payment agents, the AVM fees (ALGO) -> for the cash flows execution **SHOULD** be paid by who triggers the cash flows. +## Funding phase -> A reference implementation of an on-chain payment agent **SHOULD NOT** require -> extra fees for the cash flows execution. +`fund_due_cashflows` **MUST**: -The D-ASA payment methods **MAY** provide additional information about the payment. +- Inspect the schedule at the current global cursor; +- Process only due cash events (`IP`, `PR`, `MD`); +- Compute contract-wide interest and principal due from the normalized schedule; +- Reserve settlement funds in the contract; +- Convert those amounts into cumulative per-unit indices; +- Advance the global event cursor. + +Only the Arranger **MUST** be able to call `fund_due_cashflows`. + +## Claim phase + +`claim_due_cashflows` **MUST**: + +- Settle the holder position to the latest cumulative indices; +- Expose the holder's claimable interest and principal amounts; +- Execute an on-chain transfer if the payment address is executable; +- Otherwise leave the claimable amounts reserved for a later attempt. + +The method **MUST** return an opaque `payment_info` context unchanged so callers +can bind off-chain metadata to the claim. > The payment information could be used, for example, for: -> > - Adding unique identifiers or external context to the payments; > - Enabling external payment system integration in the case of off-chain settlement; > - Providing information about the settled amount and conversion rate used with > respect to the denomination asset. ---- +## Authorization model + +If an Op Daemon address is configured, `claim_due_cashflows` **MUST** only accept +calls from: + +- The Op Daemon; +- The Account *holding address*; +- The Account *payment address*. + +If no Op Daemon is configured, the current implementation applies no extra caller +restriction beyond the contract and account checks. + +## Payment ordering -[^1]: The Algorand protocol has dynamic block latency with instant finality. At -the time of writing (Jan 2025), block finality is about 2.8 seconds, the block size -is 5 MB, resulting in theoretical throughput of 10,000 transactions per second. +> [!IMPORTANT] +> Algorand block proposers could order transactions in a block. In a *healthy network*, +> block proposers are selected randomly by the Algorand consensus based on a Verifiable +> Random Function (VRF). Therefore, the order of payments in a block is random and +> unbiased, with no systematic advantage or precedence of a payee with respect to +> others. diff --git a/docs/specs/execution/payment-agent/principal-repayment.md b/docs/specs/execution/payment-agent/principal-repayment.md deleted file mode 100644 index 127b756c..00000000 --- a/docs/specs/execution/payment-agent/principal-repayment.md +++ /dev/null @@ -1,49 +0,0 @@ -# Principal Repayment {#principal-repayment} - -> Debt instruments repay the principal according to the repayment schedule. - -The *principal* **MUST** be repaid according to a *principal repayment schedule*. - -In the case of an on-chain payment agent, the D-ASA **MUST** repay the *principal* -to the Investor’s Payment Addresses. - -## Bullet Schedule - -If the debt instrument has a *bullet principal repayment schedule*, the principal -**MUST** be paid entirely at the *maturity date* using the `pay_principal` method. - -If the D-ASA has coupons, the *principal* **MUST NOT** be paid if there is any due -coupon still to be paid. - -## Amortizing Schedule - -If the debt instrument has an *amortizing principal repayment schedule*, the *principal* -**MUST** be repaid along with the **fixed** number of *coupons*, according to the -*principal amortization* (see [Amortization](../../contract/principal.md#amortization) -section), using the `pay_coupon` method. - -The first coupon due date corresponds to \\([PRANX]\\). - -The D-ASA *unit value* **MUST** be updated according to the *outstanding principal.* - -It is **RECOMMENDED** to use an ACTUS *interest calculation base* \\([IPCB]\\). - -> A reference implementation **SHOULD** calculate interest on the outstanding principal. - -> A reference implementation **SHOULD** restrict the amortizing rates updatability. - -{{#include ../../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with a *principal* of 1M EUR and a *minimum -> denomination* of 1,000 EUR, 5 coupons, and an even amortizing schedule (20% amortizing -> rate). The D-ASA has 1,000 *total units*. The D-ASA initial *unit value* is 1,000 -> EUR. The 1st coupon pays both the interest (according to the *coupon rates*) and -> 20% of the principal (according to *amortizing rates*). The D-ASA outstanding -> principal is 800k EUR. The D-ASA *unit value* is 800 EUR. - -{{#include ../../../_include/styles.md:example}} -> Let’s have a D-ASA denominated in EUR, with a *principal* of 1M EUR and a *minimum -> denomination* of 1,000 EUR. The D-ASA originally had 1,000 *total units* (worth -> 1,000 EUR each) in circulation. A partial repayment of 500k EUR (50% of the original -> principal) must be executed pro-rata to all investors. A single amortizing rate -> of 5,000 bps is used. After the partial repayment, the D-ASA still has 1000 circulating -> units (worth 500 EUR each). diff --git a/docs/specs/execution/payment-agent/settlement.md b/docs/specs/execution/payment-agent/settlement.md index 9d9fdc67..d4a89a4c 100644 --- a/docs/specs/execution/payment-agent/settlement.md +++ b/docs/specs/execution/payment-agent/settlement.md @@ -2,11 +2,8 @@ > Debt instruments cash flows may be settled in a currency different from the denomination. -The D-ASA **MUST** define either an on-chain or off-chain *settlement asset* \\([CURS]\\)[^1] -to regulate the cash flows. - -The *settlement asset identifier* (`uint64`) **MUST** be set using the `asset_config` -method. +The D-ASA **MUST** define either an on-chain or off-chain *settlement asset* +\\( [CURS] \\)[^1] to regulate the cash flows. All values (`uint64`) are integer minor units of the relevant on-chain or off-chain *settlement asset*. @@ -22,6 +19,13 @@ If the D-ASA **does not define** a different *settlement asset*, then the cash f **MUST** be settled in the denomination asset and the *settlement asset identifier* **MUST** be equal to the *denomination asset identifier*. +> [!NOTE] +> The D-ASA reference implementation supports only on-chain ASA settlement assets. + +> [!NOTE] +> The D-ASA reference implementation requires settlement assets to be the denomination +> asset. + ## On-chain settlement {#on-chain-settlement} The *settlement asset* **MUST** be an Algorand Standard Asset (ASA), an Application @@ -34,7 +38,7 @@ If asset is ALGO (`0`): amount is in microALGOs (\\( 10^{-6} \\) ALGO). If asset is ASA or App: amount is in base units as per that asset’s `decimals`. -{{#include ../../../_include/styles.md:example}} +> [!TIP] > The value (`uint64`) `10000` of settlement in ASA settlement 2 decimals is interpreted > as `100.00` units of the ASA. @@ -52,7 +56,7 @@ The *settlement asset* **MUST** use the decimal digits specified by the [!TIP] > The value (`uint64`) `10000` of a settlement in EUR (ISO 4217, 2 decimals) is > interpreted as `100.00` Euro. diff --git a/docs/specs/execution/primary-market.md b/docs/specs/execution/primary-market.md deleted file mode 100644 index a9411de6..00000000 --- a/docs/specs/execution/primary-market.md +++ /dev/null @@ -1,23 +0,0 @@ -# Primary Market {#primary-market} - -> Debt instruments can be distributed on the primary market in different ways, such -> as book building, auctions, etc. - -The D-ASA units **MUST** be distributed to D-ASA accounts, at most up to *total -units*, using the `primary_distribution` method. - -The primary distribution of D-ASA *units* **SHALL** be completed between the *primary -distribution opening* and *closing dates*, according to the primary market. - -The `primary_distribution` method **MUST** be called by an authorized primary distribution -entity. - -{{#include ../../_include/styles.md:example}} -> The primary market is performed as an auction on a dedicated Algorand Application. -> The implementation requires the `primary_distribution` method to be called exclusively -> by the primary market Application, which defines the auction’s outcome. - -{{#include ../../_include/styles.md:example}} -> The primary market is performed as a book building by an authorized Book-builder -> Address. The implementation requires the `primary_distribution` method to be called -> exclusively by the authorized Book-builder. diff --git a/docs/specs/execution/secondary-market.md b/docs/specs/execution/secondary-market.md deleted file mode 100644 index db4b77fb..00000000 --- a/docs/specs/execution/secondary-market.md +++ /dev/null @@ -1,37 +0,0 @@ -# Secondary Market {#secondary-market} - -> Debt instruments can be traded on secondary markets. - -If the debt instrument can be traded on secondary markets, the D-ASA **MUST** be -transferable and implement the **OPTIONAL** `set_secondary_time_events`. - -The D-ASA **MUST** define *secondary market time events* as `uint64[]` array, where: - -- The length of the array **MUST** be `N>=1`; - -- The first element **MUST** be the *secondary market opening date* (`uint64`): -the time at which the secondary market opens; - -- If the secondary market has a closure date, the last element **MUST** be the -*secondary market closure date* (`uint64`): the time at which the secondary market -closes. - -The *secondary market time events* **MUST** be sorted in strictly ascending order. - -The *secondary market opening date* **MUST NOT** be earlier than the *issuance date*. - -The *secondary market closure date* **MUST NOT** be later than the *maturity date*. - -In case of non-continuous *day-count conventions* (`ID<255`, see [Day-Count Conventions](../contract/day-count-convention.md) -section), the *time periods* between subsequent events **MUST** be multiples of -a day, in seconds (`86400`). - -The *secondary market time events* **MUST** be set using the `set_secondary_time_events` -method. - -The *secondary market time events* **MAY** be updated with the `set_secondary_time_events` -method. - -The updated *secondary market time events* **MUST NOT** modify past events. - -The `asset_transfer` method **MUST** fail if the secondary market is closed. diff --git a/docs/specs/execution/time.md b/docs/specs/execution/time.md new file mode 100644 index 00000000..e989f0c6 --- /dev/null +++ b/docs/specs/execution/time.md @@ -0,0 +1,8 @@ +# Time + +The time on the Algorand Virtual Machine is defined by the block UNIX timestamp. + +> The Algorand protocol has dynamic block latency with instant finality. At the +> time of writing (March 2026), block finality is about 2.8 seconds. + +> The AVM time may present a drift with respect to external standard time references. diff --git a/docs/specs/execution/transfer-agent.md b/docs/specs/execution/transfer-agent.md deleted file mode 100644 index af2a4dfd..00000000 --- a/docs/specs/execution/transfer-agent.md +++ /dev/null @@ -1,34 +0,0 @@ -# Transfer Agent {#transfer-agent} - -> Debt instruments can be transferable among investors. - -> D-ASA supports both on-chain and off-chain transfer agents. - -The Transfer Agent **SHALL** authorize the D-ASA transfers according to the transferability -policy and the secondary market. - -The sender and receiver of the D-ASA transfer: - -- **MUST** have a valid Holding Addresse, and -- **MUST** be different from each other, and -- **MUST NOT** be suspended from operations. - -The sender of the D-ASA transfer **MUST** have sufficient D-ASA *units* to transfer. - -The transferred D-ASA *units*: - -- **MUST** be non-zero, and -- **MUST** be *fungible* (see [D-ASA Units fungibility](../accounting/units.md#fungibility-fungibility) -section), and -- **MUST** record D-ASA *unit value* and *paid coupons*. - -D-ASA *units* **SHALL NOT** be transferred if the sender has pending due coupon -payments. - -> The D-ASA transferability policy may involve and integrate KYC/AML processes, -> secondary market restrictions, etc. - -If the debt instrument is transferable, the D-ASA **MUST** implement the **OPTIONAL** -`asset_transfer` methods. - -The `asset_transfer` method **MAY** be restricted to an authorized Transfer Agent. diff --git a/docs/specs/execution/transfer-agent/dvp.md b/docs/specs/execution/transfer-agent/dvp.md new file mode 100644 index 00000000..f6681bf5 --- /dev/null +++ b/docs/specs/execution/transfer-agent/dvp.md @@ -0,0 +1,27 @@ +# Delivery-vs-Payment (DvP) + +> Delivery-vs-Payment (DvP) can be used to exchange D-ASA units both on the primary +> market (placement) and secondary market (e.g., OTC trades). + +The D-ASA framework supports the execution of composable DvP transactions. + +The D-ASA DvP transactions are native Algorand Group transactions. + +The Algorand Group transactions ensure **atomicity**, they are executed on an "all-or-nothing" +basis, meaning that either all transactions in the group are executed or none of +them are. + +Therefore, D-ASA DvP ensures **no counterparty risk**, as the transfer of D-ASA +units and the corresponding payment occur simultaneously. If either the transfer +or the payment fails, the entire transaction group is rejected, preventing any party +from being left in a vulnerable position. + +The simplest DvP consists of: + +- A *delivery-leg*, executed by the D-ASA Transfer Agent; +- A *payment-leg*, executed as a general Algorand transaction (usually an ASA transfer). + +The **payment** is not restricted to specific assets (e.g., not restricted to the +denomination or settlement assets). + +The amounts of the DvP are negotiated between the two parties. diff --git a/docs/specs/execution/transfer-agent/primary-market.md b/docs/specs/execution/transfer-agent/primary-market.md new file mode 100644 index 00000000..781f4ba1 --- /dev/null +++ b/docs/specs/execution/transfer-agent/primary-market.md @@ -0,0 +1,52 @@ +# Primary Market {#primary-market} + +> Debt instruments can be distributed on the primary market in different ways, such +> as book building, auctions, etc. + +The primary market allocates units before the contract becomes active. + +## Allocation phase + +`primary_distribution` **MUST** reserve units for an existing holder account while +the contract is in `STATUS_PENDING_IED`. + +The method **MUST** reject allocations that: + +- Occur before configuration is complete; +- Occur after `IED`; +- Exceed the remaining unallocated supply; +- Target a suspended or missing holder account; +- Request zero units. + +Only an active Primary Dealer **MUST** be able to call `primary_distribution`. + +## Completion requirement + +`contract_execute_ied` **MUST** fail unless: + +```text +reserved_units_total == total_units +``` + +This rule makes full issuance an explicit precondition of activation in the current +reference implementation. + +## Activation + +Primary distribution reserves units only. Reserved units do not accrue funded ACTUS +cashflows until `IED` executes and the holder position is activated. + +## Proxies + +The Primary Dealer role **MAY** be delegated to a proxy Application implementing +a primary market. + +> [!TIP] +> The primary market is performed as an auction on a dedicated Algorand Application. +> The implementation requires the `primary_distribution` method to be called exclusively +> by the primary market Application, which defines the auction’s outcome. + +> [!TIP] +> The primary market is performed as a book building by an authorized Book-builder +> Address. The implementation requires the `primary_distribution` method to be called +> exclusively by the authorized Book-builder. diff --git a/docs/specs/execution/transfer-agent/secondary-market.md b/docs/specs/execution/transfer-agent/secondary-market.md new file mode 100644 index 00000000..324f99c3 --- /dev/null +++ b/docs/specs/execution/transfer-agent/secondary-market.md @@ -0,0 +1,30 @@ +# Secondary Market {#secondary-market} + +> Debt instruments can be traded on secondary markets. + +Secondary-market control is an execution-layer policy. + +## Transfer window + +If transfer window enforcement is required, the Arranger **MUST** configure it with +`transfer_set_schedule(open_date, closure_date)`. + +The transfer window is interpreted as: + +```text +open_date <= now < closure_date +``` + +The method **MUST** reject a schedule in which `open_date >= closure_date`. + +## Default behavior + +If no transfer window is configured, the current reference implementation applies +no additional secondary-market date restriction beyond the generic transfer checks. + +## Relation to normalization + +The SDK normalization helpers may carry secondary-market dates as deployment metadata. +Those dates are not part of the on-chain `NormalizedActusTerms` ABI struct in the +current kernel. On-chain enforcement therefore happens through `transfer_set_schedule`, +not through `contract_config`. diff --git a/docs/specs/execution/transfer-agent/transfer-agent.md b/docs/specs/execution/transfer-agent/transfer-agent.md new file mode 100644 index 00000000..16037810 --- /dev/null +++ b/docs/specs/execution/transfer-agent/transfer-agent.md @@ -0,0 +1,34 @@ +# Transfer Agent {#transfer-agent} + +> Debt instruments can be transferable among investors. + +> D-ASA supports both on-chain and off-chain transfer agents. + +The Transfer Agent executes primary and secondary movement of D-ASA units. + +## Secondary transfers + +`transfer` **MUST** move active units only after: + +- The contract is active; +- The transfer window is open, if a window was configured; +- Both counterparties are valid, distinct, and unsuspended accounts; +- Both counterparties are settled to the current global indices; +- There is no due ACTUS event pending at the global cursor. + +The sender of the D-ASA transfer **MUST** have enough D-ASA *units* to transfer. + +The method **MUST** return the number of units transferred. + +Transfers are unit-based. The current kernel does not persist a mutable per-unit +nominal value or per-unit coupon status. + +## Caller model + +> The D-ASA transferability policy may involve and integrate KYC/AML processes, +> pre-authorizations, secondary market restrictions, etc. + +The current reference implementation requires the holder to call `transfer` directly. + +The method **MUST** reject calls from any other address. Transfers are therefore +direct holder actions, not transfer-agent proxy calls. diff --git a/docs/specs/overview.md b/docs/specs/overview.md index 42b84328..39722c6c 100644 --- a/docs/specs/overview.md +++ b/docs/specs/overview.md @@ -1,38 +1,84 @@ # Overview {#overview} -A *Debt Algorand Standard Application* (D-ASA) is a debt instrument issued as an -Algorand Application, that conforms to this specification, and whose operations -and cash flows are executed on the AVM. - -This specification defines the actors of a D-ASA and the interfaces of the Algorand -Application to: - -- Arrange and configure the D-ASA (e.g. principal, interest, time events, etc.); -- Manage D-ASA accounts (e.g. opening and closing accounts, etc.); -- Distribute the D-ASA on the primary market (e.g. book building, auctions, etc.); -- Execute D-ASA cash flows (e.g coupon payments, principal repayment, etc.); -- Exchange the D-ASA on secondary markets (if any); -- Query D-ASA information (e.g. due coupons, next coupon due date, etc.). - -This specification also provides the interfaces to comply with regulatory requirements, -such as defining a role-based access control, suspending D-ASA operations completely -or for specific accounts, managing default processes, etc. - -The contents are structured on four functional layers: - -1. *Trust Model*: this layer defines the application role-based access -control model to manage the fixed income contract and comply with regulatory frameworks; -1. *Contract*: this layer provides the algorithmic definitions of the debt instrument -(data model, attributes, and cash flows); -1. *Accounting*: this layer defines the tokenization of the contract; -1. *Execution*: this layer defines the execution of the contract, both the distribution, -cash flows and transfers. +A *Debt Algorand Standard Application* (D-ASA) is an Algorand application that +executes a fixed-income ACTUS contract on the AVM. + +A conforming D-ASA **MUST** process a debt instrument through the following stages: + +1. Define the debt instrument as an ACTUS contract. + +1. Normalize the ACTUS contract into AVM-compatible integers, state, and schedule +pages. + +1. Execute the normalized contract on the AVM through explicit ABI methods. + +The D-ASA therefore uses the AVM as the execution layer of ACTUS. The canonical +contract interface is the normalized ACTUS interface defined in this specification. + +This specification is structured in four layers: + +1. **RBAC**: identifies operational actors and their authorities. + +1. **ACTUS Kernel**: defines the normalized contract terms, schedule, and lifecycle +state machine. + +1. **Accounting**: defines holder positions, unit balances, checkpoints, and claims. + +1. **Execution**: executes the ACTUS cashflows and tokenized contract transfers. + + - *Payment Agent*: defines funding and withdrawal of due ACTUS cashflows. + + - *Transfer Agent*: defines primary distribution and secondary transfer execution. + +--- + +```mermaid +flowchart TD + RBAC["Layer 1: RBAC
Operational actors & authorities"] + KERNEL["Layer 2: ACTUS Kernel
Contract terms, schedule & state machine"] + ACCOUNTING["Layer 3: Accounting
Positions, balances, checkpoints & claims"] + PAYMENT["Layer 4a: Payment Agent
Funding & withdrawal of cashflows"] + TRANSFER["Layer 4b: Transfer Agent
Primary distribution & secondary transfers"] + + RBAC --> KERNEL + KERNEL --> ACCOUNTING + ACCOUNTING --> PAYMENT + ACCOUNTING --> TRANSFER + + style RBAC fill:#bbdefb,stroke:#1976d2,stroke-width:2px,color:#000 + style KERNEL fill:#fff9c4,stroke:#f57f17,stroke-width:2px,color:#000 + style ACCOUNTING fill:#c8e6c9,stroke:#388e3c,stroke-width:2px,color:#000 + style PAYMENT fill:#ffccbc,stroke:#d84315,stroke-width:2px,color:#000 + style TRANSFER fill:#ffccbc,stroke:#d84315,stroke-width:2px,color:#000 +``` + +--- + +## Conformance + +A conforming implementation: + +- **MUST** implement the public ABI described in the [Interfaces](../interfaces/types.md) +section; + +- **MUST** accept normalized ACTUS terms, an initial kernel state, and a paged execution +schedule; + +- **MUST** execute ACTUS non-cash and cash events through the kernel and agent interfaces; + +- **MUST** follow the ACTUS compliance profile defined in the [Contract](./contract/intro.md) +section. ## ACTUS compliance -
ACTUS still presents some limitations with -respect to blockchain-based implementations. +D-ASA is designed to be ACTUS-compliant, with three minor deviations required by +AVM constraints: -Therefore, ACTUS compliance is **RECOMMENDED** but not mandatory. +| | ACTUS | D-ASA | +|:---------------|:---------------------------------------------------|:------------------------------------------------| +| Time format | [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) | [UNIX](https://en.wikipedia.org/wiki/Unix_time) | +| Time precision | Millisecond \\( 10^{-3} [s] \\) | Second \\( [s] \\) | +| Arithmetic | Floating-point | Fixed-point | -ACTUS limitations are usually marked with footnotes. +> The ACTUS compliance has not yet been certified by an *official* ACTUS standardization +> body. diff --git a/docs/specs/rbac/overview.md b/docs/specs/rbac/overview.md new file mode 100644 index 00000000..d58278e6 --- /dev/null +++ b/docs/specs/rbac/overview.md @@ -0,0 +1,7 @@ +# Trust Model + +The trust model defines who is allowed to configure, operate, suspend, and observe +the D-ASA lifecycle. + +The canonical role set and the RBAC enforcement rules are specified in the following +pages. diff --git a/docs/specs/rbac/rbac.md b/docs/specs/rbac/rbac.md index 69540bbe..fa39ba50 100644 --- a/docs/specs/rbac/rbac.md +++ b/docs/specs/rbac/rbac.md @@ -1,45 +1,79 @@ # Role-Based Access Control {#role-based-access-control} -> D-ASA can define a custom role-based access control to comply with administrative -> and regulatory requirements. +The D-ASA role model **MUST** gate every privileged ABI method. -A D-ASA *role* **MAY** be assigned using the **OPTIONAL** `rbac_assign_role` method. +## Role administration -A D-ASA *role* **MAY** be revoked using the **OPTIONAL** `rbac_revoke_role` method. +The Arranger **MUST** control role administration through: + +- `rbac_assign_role` +- `rbac_revoke_role` +- `rbac_get_role_validity` +- `rbac_get_address_roles` + +Role assignments **MUST** be validated against their stored time window at execution +time. A role that exists but is outside its validity interval **MUST** be treated +as inactive. + +## Arrangement + +The Arranger **MUST** retain the authority to: + +- rotate the arranger address with `rbac_rotate_arranger`; +- set the optional operation daemon with `rbac_set_op_daemon`; +- update the application with `contract_update`. ## Suspension > Debt instruments are regulated under different legal frameworks and their jurisdictions. -> The D-ASA ensures efficient execution of the debt instrument in the "best case -> scenarios", where it offers the highest improvements in cost and time efficiency +> The D-ASA ensures efficient execution of the debt instrument in the “best case +> scenarios”, where it offers the highest improvements in cost and time efficiency > if compared to the traditional, manual, and labor-intensive contracts. > The D-ASA provides methods to comply with regulatory obligations, allowing the -> management of the "worst case scenarios", in which the intervention of the authority +> management of the “worst case scenarios”, in which the intervention of the authority > or the regulator is necessary. > Debt instruments can be temporarily suspended due to regulations or operational > reasons. -The D-ASA suspension authority **MUST** be restricted to specific *contract roles*. +The D-ASA suspension authority **MUST** be restricted to specific contract roles. + +### Asset suspension + +`rbac_contract_suspension` **MUST** suspend or resume asset-wide operations. + +When the asset is suspended, the implementation **MUST** reject: + +- primary distribution; +- funding and claiming of due cashflows; +- holder payment-address updates; +- transfers; +- any other method explicitly guarded by the suspension flag. + +### Account suspension + +`account_suspension` **MUST** suspend or resume a specific holder account. -### Asset Suspension +When an account is suspended, the implementation **MUST** reject: -The D-ASA **MAY** suspend all: +- unit allocations to that account during primary distribution; +- transfers from or to that account; +- on-chain cashflow execution to that account while the suspension remains in force. -- Payments; -- D-ASA units transfers. +## Trustee-controlled default -The asset *suspension* status **MUST** be set with the `rbac_gov_asset_suspension` -method. +`rbac_contract_default` **MUST** be restricted to the Trustee role. -### Account Suspension +In the current reference implementation, this method sets or clears the contract-level +`defaulted` performance flag in RBAC global state. It does not change the kernel +lifecycle `status`. -The D-ASA **MAY** suspend an account: +## Observer-controlled events -- Payments (skipped on due dates); -- D-ASA units transfers (from and to). +The Observer role **MUST** authorize due `RR` and `RRF` event application through +`apply_non_cash_event`. -The account *suspension* status **MUST** be set with the `account_gov_suspension` -method. +All other non-cash events remain arranger-controlled unless a future profile explicitly +states otherwise. diff --git a/docs/specs/rbac/roles.md b/docs/specs/rbac/roles.md index 7d3fed86..eeb8cd6e 100644 --- a/docs/specs/rbac/roles.md +++ b/docs/specs/rbac/roles.md @@ -3,99 +3,115 @@ > D-ASA defines custom roles and permissions for the entities involved in the debt > instrument. -The D-ASA **MUST** define *contract roles* \\([CNTRL]\\). +The D-ASA **MUST** define contract roles \\( [CNTRL] \\). -The *contract roles* **MUST** be identified with a *role ID* (`uint8`). +The D-ASA **MUST** identify operational authorities with reserved role identifiers. -The *contract roles* **MUST** be associated with Algorand Addresses through a *role -key* of the form: +The contract roles **MUST** be associated with Algorand Addresses through a role +key of the form: -`[R||||#||]` +`[R:||||#||]` -Where `||` denotes concatenation. +Where || denotes concatenation. -{{#include ../../_include/styles.md:example}} -> Let’s have a D-ASA role ID `42` associated with the Algorand Address `XYZ`. The -> corresponding role key is `42#XYZ`. +The current reference implementation uses the following role set: -## Issuer (Borrower) +| Key | ID | Role | Scope | +|:-----:|:----:|:----------------|:------------------------------------------------------------------------------| +| `ARR` | `20` | Arranger | Owns contract creation, configuration, schedule upload, and upgrade authority | +| `OPD` | `25` | Op Daemon | Optional automation address for payment execution workflows | +| `MNG` | `40` | Account Manager | Opens holder accounts | +| `PYD` | `50` | Primary Dealer | Allocates units during primary distribution | +| `TRS` | `60` | Trustee | Sets or clears the contract default-performance flag | +| `AUT` | `70` | Authority | Suspends the contract or individual accounts | +| `MOC` | `80` | Observer | Applies rate-reset events that depend on observed data | -> Issuers are individuals, companies, institutions, governments, or other entities -> who borrow capital by issuing a debt. +> [!TIP] +> The Arranger with Algorand Address `XYZ` is identified as `R:ARR#XYZ`. -An Issuer \\([CRID]\\) is an entity that owes a debt issued as D-ASA. +## Role model -The Issuer role **MUST** be identified with the reserved ID `1` \\([RPL]\\). +The Arranger and Op Daemon are single-address global roles. -## Arranger +The Account Manager, Primary Dealer, Trustee, Authority, and Observer roles are +time-bounded assignments. A role assignment is active only if: -> Arrangers are legal entities authorized to arrange debt instruments on behalf -> of the issuers. +```text +role_validity_start <= current_block_timestamp <= role_validity_end +``` -The Arranger owns an Algorand Address. +The D-ASA **MUST** reject actions that require an inactive role assignment. -The Arranger role **MUST** be identified with the reserved ID `20`. +## Responsibilities -The Arranger **SHALL** configure the D-ASA using the `asset_config` method. +### Issuer (Borrower) -The Arranger **MAY** rotate its Algorand Address using the `rbac_rotate_arranger` -method. +> Issuers are individuals, companies, institutions, governments, or other entities +> who borrow capital by issuing a debt. -The Arranger **MAY** configure the D-ASA *role-based access control* with the **OPTIONAL** -`rbac_assign_role` and `rbac_revoke_role` methods. +The Issuer \\( [RPL] \\) is a meta-role in the D-ASA role model, they have no specific +permissions. -## Investor (Lender) +### Arranger -> Investors are lenders providing capital to borrowers with the expectation of a -> financial return, defined by debt instruments. +> Arrangers are legal entities authorized to arrange debt instruments on behalf +> of the issuers. + +The Arranger owns an Algorand Address. + +The Arranger **MUST** be able to: -Investors \\([CPID]\\) own D-ASA accounts, characterized by a pair of Algorand Addresses: +- create the contract; +- upload normalized ACTUS terms and schedule pages; +- execute `IED`; +- append or apply arranger-controlled observed events; +- rotate the arranger address; +- assign and revoke time-bounded roles; +- update the application. -- *Holding Address*: address that owns D-ASA units with the right to future payments; -- *Payment Address*: address that receives D-ASA payments. +### Op Daemon -The Payment Address **MAY** be different from the Holding Address. +The Op Daemon is an optional execution helper. If configured, the Op Daemon **MAY** +trigger holder cashflow claims in addition to the holder or payment address. -> D-ASA units can be in custody with a third party or temporarily deposited on an -> order book (Holding Address). At the same time, payments are always executed towards -> the investor (on the Payment Address). +### Account Manager -> The right to open and close investor accounts can be granted to different entities, -> such as KYC providers or banks. +The Account Manager owns an Algorand Address. -The Investor role **MUST** be identified with the reserved ID `30`. +The Account Manager **MUST** be able to open holder accounts. The role does not +control payments or transfers. -> Debt instruments may have an order of repayment in the event of a sale or default -> of the issuer, based on investors' seniority. +> The right to open investor accounts can be granted to different entities, such +> as KYC providers or banks. -> Investors with the same seniority are treated equally. +### Primary Dealer -The Investors **MAY** have different **seniority** \\([SEN]\\). +The Primary Dealer **MUST** be able to reserve units during primary distribution +before `IED`. -### Open Account +### Trustee -The D-ASA accounts **SHALL** be opened using the `account_open` method. +The Trustee role **MUST** control the contract performance \\( [PRF] \\) (see +[Performance](../contract/attributes.md#performance) section for further details). -The D-ASA accounts **MUST NOT** be opened if the D-ASA is suspended (see [Suspension](rbac.md#suspension) -section). +In the current reference implementation, an active Trustee can set or clear the +contract-level `defaulted` performance flag with `rbac_contract_default`. -The D-ASA accounts **MUST NOT** be opened if the D-ASA is in default (see [Default](../contract/performance.md#default) -section). +This performance flag is distinct from the kernel lifecycle `status`. -### Close Account +### Authority -The D-ASA accounts **MAY** be closed using the `account_close` method. +The Authority owns an Algorand Address. -The D-ASA accounts **MUST NOT** be closed if the D-ASA is in default (see [Default](../contract/performance.md#default) -section). +The Authority **MUST** be able to suspend the contract and individual holder +accounts. -## Oracles +### Observer > Debt instruments may rely on external data, such as interest rates, covenant breaches, > etc., provided by trusted oracles. -An Oracle \\([MOC]\\) is an external entity that provides trusted data to the D-ASA. - -A D-ASA **MAY** have multiple oracles. +The Observer \\( [MOC] \\) owns an Algorand Address. -The Oracle roles **MUST** be identified with the reserved IDs between `80 - 100`. +The Observer **MUST** be able to apply due rate-reset events (`RR`, `RRF`) whose +execution depends on observed external values. diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..7590863f --- /dev/null +++ b/examples/README.md @@ -0,0 +1,83 @@ +# Notebook Examples + +This folder contains two live LocalNet walkthroughs: + +- `pam_fixed_coupon_bond.ipynb` +- `pam_zero_coupon_bond.ipynb` + +They are intended to be run from the repository root and rerun from top to bottom +against a fresh AlgoKit LocalNet. + +## Quick Start (Docker - No Local Dependencies) + +The easiest way to run the notebooks is using Docker: + +```shell +./d-asa jupyter +``` + +Or via make: + +```shell +make jupyter-docker +``` + +This will: +- Build the Docker image with all dependencies +- Start AlgoKit LocalNet if needed +- Launch Jupyter Lab at http://localhost:8888 +- Automatically configure LocalNet connectivity + +Then open one of the notebooks in the `examples/` folder. + +Press Ctrl+C to stop Jupyter Lab when finished. + +## Alternative: Local Setup (Requires Local Dependencies) + +If you prefer running Jupyter locally, follow these steps: + +Bootstrap the full development environment: + +```shell +make install-dev +``` + +If you prefer the raw AlgoKit command, the equivalent bootstrap is: + +```shell +algokit bootstrap all +``` + +Install the optional notebook dependencies: + +```shell +poetry install --with notebooks +``` + +Start LocalNet: + +```shell +make localnet +``` + +or: + +```shell +algokit localnet start +``` + +Launch Jupyter from the repository root: + +```shell +poetry run jupyter lab examples/ +``` + +Then open one of the notebooks in `examples/`. + +## Notes + +- The notebooks perform real deployment and execution against LocalNet. +- Both notebooks assume the kernel is started from this repository checkout. +- If a prior run leaves LocalNet in an unexpected state, restart it and rerun the + notebook from the first cell. +- The notebooks are committed without outputs so each run shows fresh LocalNet data. diff --git a/examples/_support.py b/examples/_support.py new file mode 100644 index 00000000..ba869b89 --- /dev/null +++ b/examples/_support.py @@ -0,0 +1,211 @@ +from __future__ import annotations + +from collections.abc import Mapping, Sequence +from datetime import UTC, datetime +from decimal import Decimal +from typing import Any + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + AssetCreateParams, + AssetOptInParams, + SigningAccount, +) + +from d_asa import NormalizationResult +from d_asa.localnet import ( + Currency, + algorand_client_from_localnet, + load_localnet_config, + wait_for_localnet, +) + +DEFAULT_CURRENCY_NAME = "Euro" +DEFAULT_CURRENCY_UNIT = "EUR" +DEFAULT_CURRENCY_DECIMALS = 2 +DEFAULT_CURRENCY_TOTAL_UNITS = 10_000_000 + + +def connect_localnet(*, timeout_seconds: float = 30.0) -> AlgorandClient: + localnet_config = load_localnet_config(default_host="localhost") + wait_for_localnet( + localnet_config=localnet_config, + timeout_seconds=timeout_seconds, + poll_interval_seconds=1.0, + ) + return algorand_client_from_localnet(localnet_config) + + +def create_funded_account( + algorand: AlgorandClient, + *, + min_algo: int = 20, +) -> SigningAccount: + account = algorand.account.random() + algorand.account.ensure_funded_from_environment( + account_to_fund=account.address, + min_spending_balance=AlgoAmount.from_algo(min_algo), + ) + return account + + +def create_currency( + algorand: AlgorandClient, + *, + issuer: SigningAccount, + asset_name: str = DEFAULT_CURRENCY_NAME, + unit_name: str = DEFAULT_CURRENCY_UNIT, + decimals: int = DEFAULT_CURRENCY_DECIMALS, + total_units: int = DEFAULT_CURRENCY_TOTAL_UNITS, +) -> Currency: + total = total_units * (10**decimals) + currency_id = algorand.send.asset_create( + AssetCreateParams( + sender=issuer.address, + signer=issuer.signer, + total=total, + decimals=decimals, + asset_name=asset_name, + unit_name=unit_name, + ) + ).asset_id + return Currency( + id=currency_id, + total=total, + decimals=decimals, + name=asset_name, + unit_name=unit_name, + asa_to_unit=1 / (10**decimals), + ) + + +def opt_in_asset( + algorand: AlgorandClient, + *, + account: SigningAccount, + asset_id: int, +) -> None: + algorand.send.asset_opt_in( + AssetOptInParams( + asset_id=asset_id, + sender=account.address, + signer=account.signer, + ) + ) + + +def format_asset_amount( + amount: int, + *, + decimals: int, + unit_name: str | None = None, +) -> str: + quantizer = Decimal(1).scaleb(-decimals) + scaled = (Decimal(amount) / (Decimal(10) ** decimals)).quantize(quantizer) + if unit_name is None: + return f"{scaled:,.{decimals}f}" + return f"{scaled:,.{decimals}f} {unit_name}" + + +def format_timestamp(timestamp: int) -> str: + return datetime.fromtimestamp(timestamp, tz=UTC).strftime("%Y-%m-%d %H:%M:%SZ") + + +def format_rate(value: int, *, fixed_point_scale: int) -> str: + rate_percent = Decimal(value) * Decimal(100) / Decimal(fixed_point_scale) + return f"{rate_percent:.4f}%" + + +def schedule_rows( + normalized: NormalizationResult, + *, + currency_decimals: int, +) -> list[dict[str, str | int]]: + rows: list[dict[str, str | int]] = [] + for entry in normalized.schedule: + rows.append( + { + "event_id": entry.event_id, + "event_type": entry.event_type, + "scheduled_time": format_timestamp(entry.scheduled_time), + "accrual_factor": f"{Decimal(entry.accrual_factor) / Decimal(normalized.terms.fixed_point_scale):.6f}", + "next_outstanding_principal": format_asset_amount( + entry.next_outstanding_principal, + decimals=currency_decimals, + ), + "next_nominal_interest_rate": ( + format_rate( + entry.next_nominal_interest_rate, + fixed_point_scale=normalized.terms.fixed_point_scale, + ) + if entry.next_nominal_interest_rate is not None + else "-" + ), + } + ) + return rows + + +def cashflow_rows( + cashflows: Sequence[Mapping[str, Any]], + *, + currency: Currency, +) -> list[dict[str, str | int]]: + rows: list[dict[str, str | int]] = [] + for cashflow in cashflows: + rows.append( + { + "event_id": int(cashflow["event_id"]), + "event_type": str(cashflow["event_type"]), + "scheduled_time": format_timestamp(int(cashflow["scheduled_time"])), + "funded": format_asset_amount( + int(cashflow["funded"]), + decimals=currency.decimals, + unit_name=currency.unit_name, + ), + "interest_claimed": format_asset_amount( + int(cashflow["interest_claimed"]), + decimals=currency.decimals, + unit_name=currency.unit_name, + ), + "principal_claimed": format_asset_amount( + int(cashflow["principal_claimed"]), + decimals=currency.decimals, + unit_name=currency.unit_name, + ), + "total_claimed": format_asset_amount( + int(cashflow["total_claimed"]), + decimals=currency.decimals, + unit_name=currency.unit_name, + ), + "claim_timestamp": format_timestamp(int(cashflow["claim_timestamp"])), + } + ) + return rows + + +def render_table(rows: Sequence[Mapping[str, object]]) -> str: + if not rows: + return "(no rows)" + + headers = list(rows[0].keys()) + widths = [len(header) for header in headers] + rendered_rows: list[list[str]] = [] + for row in rows: + rendered = [str(row[header]) for header in headers] + rendered_rows.append(rendered) + widths = [ + max(current_width, len(value)) + for current_width, value in zip(widths, rendered, strict=True) + ] + + header_line = " | ".join( + header.ljust(width) for header, width in zip(headers, widths, strict=True) + ) + divider_line = "-+-".join("-" * width for width in widths) + row_lines = [ + " | ".join(value.ljust(width) for value, width in zip(row, widths, strict=True)) + for row in rendered_rows + ] + return "\n".join([header_line, divider_line, *row_lines]) diff --git a/examples/pam_fixed_coupon_bond.ipynb b/examples/pam_fixed_coupon_bond.ipynb new file mode 100644 index 00000000..e526fdbc --- /dev/null +++ b/examples/pam_fixed_coupon_bond.ipynb @@ -0,0 +1,424 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7fb27b941602401d91542211134fc71a", + "metadata": {}, + "source": [ + "# PAM Fixed Coupon Bond on LocalNet\n", + "\n", + "This notebook runs a live PAM fixed coupon bond lifecycle on AlgoKit LocalNet.\n", + "\n", + "It covers both:\n", + "- the high-level SDK flow to build ACTUS terms, normalize them, and deploy `DAsa`\n", + "- the live execution flow through `IED`, coupon funding, holder claims, and maturity\n" + ] + }, + { + "cell_type": "markdown", + "id": "acae54e37e7d407bbb7b55eff062a284", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "- run `make install-dev` once\n", + "- start LocalNet with `make localnet` or `algokit localnet start`\n", + "- rerun the notebook from the first cell on a fresh LocalNet when repeating the demo\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a63283cbaf04dbcab1f6479b197f3a8", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "from pathlib import Path\n", + "\n", + "REPO_ROOT = next(\n", + " path for path in [Path.cwd(), *Path.cwd().parents] if (path / \"pyproject.toml\").exists()\n", + ")\n", + "os.chdir(REPO_ROOT)\n", + "if str(REPO_ROOT / \"src\") not in sys.path:\n", + " sys.path.insert(0, str(REPO_ROOT / \"src\"))\n", + "\n", + "print(f\"Repository root: {REPO_ROOT}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a72551a49d687ac", + "metadata": {}, + "outputs": [], + "source": [ + "from algokit_utils import AssetTransferParams, CommonAppCallParams\n", + "\n", + "from d_asa import (\n", + " DAsa,\n", + " DAsaRole,\n", + " NormalizationResult,\n", + " enums,\n", + " make_pam_fixed_coupon_bond_profile,\n", + " normalize_contract_attributes,\n", + ")\n", + "from d_asa import constants as cst\n", + "from d_asa.artifacts.dasa_client import PrimaryDistributionArgs\n", + "from d_asa.localnet import get_latest_timestamp, time_warp\n", + "from d_asa.schedule import Cycle\n", + "from examples._support import (\n", + " cashflow_rows,\n", + " connect_localnet,\n", + " create_currency,\n", + " create_funded_account,\n", + " format_asset_amount,\n", + " opt_in_asset,\n", + " render_table,\n", + " schedule_rows,\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a1061c4b38b743d", + "metadata": {}, + "outputs": [], + "source": [ + "PRINCIPAL = 10_000\n", + "MINIMUM_DENOMINATION = 100\n", + "NOMINAL_RATE = 0.02\n", + "ISSUANCE_DELAY = Cycle.parse_cycle(\"30D\")\n", + "COUPON_CYCLE = Cycle.parse_cycle(\"90D\")\n", + "MATURITY_OFFSET = Cycle.parse_cycle(\"1800D\")\n", + "\n", + "\n", + "def day_cycle_seconds(cycle: Cycle) -> int:\n", + " if cycle.unit != \"D\":\n", + " raise ValueError(f\"Only fixed day cycles are used in this notebook, got {cycle}\")\n", + " return cycle.count * cst.DAY_2_SEC\n", + "\n", + "\n", + "def derive_total_interest_amount(normalized: NormalizationResult) -> int:\n", + " outstanding_principal = normalized.schedule[0].next_outstanding_principal\n", + " nominal_interest_rate = (\n", + " normalized.schedule[0].next_nominal_interest_rate or normalized.terms.rate_reset_next\n", + " )\n", + " accrued_interest = 0\n", + " total_interest = 0\n", + "\n", + " for entry in normalized.schedule[1:]:\n", + " interest_segment = (\n", + " outstanding_principal\n", + " * nominal_interest_rate\n", + " // normalized.terms.fixed_point_scale\n", + " * entry.accrual_factor\n", + " // normalized.terms.fixed_point_scale\n", + " )\n", + "\n", + " if entry.event_type in {\"IP\", \"MD\"}:\n", + " total_interest += accrued_interest + interest_segment\n", + " accrued_interest = 0\n", + " elif entry.event_type == \"PR\":\n", + " accrued_interest += interest_segment\n", + "\n", + " if entry.event_type in {\"PR\", \"MD\"}:\n", + " outstanding_principal = entry.next_outstanding_principal\n", + "\n", + " if entry.next_nominal_interest_rate:\n", + " nominal_interest_rate = entry.next_nominal_interest_rate\n", + "\n", + " return total_interest\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8edb47106e1a46a883d545849b8ab81b", + "metadata": {}, + "outputs": [], + "source": [ + "algorand = connect_localnet()\n", + "arranger = create_funded_account(algorand, min_algo=50)\n", + "bank = create_funded_account(algorand, min_algo=50)\n", + "account_manager = create_funded_account(algorand)\n", + "primary_dealer = create_funded_account(algorand)\n", + "investor = create_funded_account(algorand)\n", + "\n", + "currency = create_currency(algorand, issuer=bank)\n", + "opt_in_asset(algorand, account=investor, asset_id=currency.id)\n", + "\n", + "print(f\"Currency ASA id: {currency.id}\")\n", + "print(f\"Arranger: {arranger.address}\")\n", + "print(f\"Bank: {bank.address}\")\n", + "print(f\"Investor: {investor.address}\")\n", + "print(f\"Account manager: {account_manager.address}\")\n", + "print(f\"Primary dealer: {primary_dealer.address}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10185d26023b46108eb7d9f57d49d2b3", + "metadata": {}, + "outputs": [], + "source": [ + "current_ts = get_latest_timestamp(algorand.client.algod)\n", + "issuance_date = current_ts + day_cycle_seconds(ISSUANCE_DELAY)\n", + "coupon_period = day_cycle_seconds(COUPON_CYCLE)\n", + "maturity_offset = day_cycle_seconds(MATURITY_OFFSET)\n", + "first_coupon_date = issuance_date + coupon_period\n", + "maturity_date = issuance_date + maturity_offset\n", + "\n", + "attrs = make_pam_fixed_coupon_bond_profile(\n", + " contract_id=1,\n", + " status_date=current_ts,\n", + " initial_exchange_date=issuance_date,\n", + " maturity_date=maturity_date,\n", + " notional_principal=PRINCIPAL,\n", + " nominal_interest_rate=NOMINAL_RATE,\n", + " interest_payment_cycle=COUPON_CYCLE,\n", + " interest_payment_anchor=first_coupon_date,\n", + ")\n", + "normalized = normalize_contract_attributes(\n", + " attrs,\n", + " denomination_asset_id=currency.id,\n", + " denomination_asset_decimals=currency.decimals,\n", + " notional_unit_value=MINIMUM_DENOMINATION,\n", + " secondary_market_opening_date=issuance_date,\n", + " secondary_market_closure_date=maturity_date + cst.DAY_2_SEC,\n", + ")\n", + "total_interest_amount = derive_total_interest_amount(normalized)\n", + "num_ip_events = max(0, len(normalized.schedule) - 2)\n", + "expected_event_types = [\"IED\"] + [\"IP\"] * num_ip_events + [\"MD\"]\n", + "assert [entry.event_type for entry in normalized.schedule] == expected_event_types\n", + "\n", + "issue_price_label = format_asset_amount(\n", + " normalized.terms.initial_exchange_amount,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "interest_reserve_label = format_asset_amount(\n", + " total_interest_amount,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "print(f\"Issue price: {issue_price_label}\")\n", + "print(f\"Expected interest reserve: {interest_reserve_label}\")\n", + "print(render_table(schedule_rows(normalized, currency_decimals=currency.decimals)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8763a12b2bbd4a93a75aff182afb95dc", + "metadata": {}, + "outputs": [], + "source": [ + "app = DAsa.deploy_configured(\n", + " algorand=algorand,\n", + " arranger=arranger,\n", + " normalized=normalized,\n", + " prospectus_url=\"Notebook example: PAM fixed coupon bond\",\n", + ")\n", + "arranger_role = app.arranger(arranger)\n", + "arranger_role.assign_role(DAsaRole.ACCOUNT_MANAGER, account_manager.address)\n", + "arranger_role.assign_role(DAsaRole.PRIMARY_DEALER, primary_dealer.address)\n", + "\n", + "app.account_manager(account_manager).open_account(\n", + " holding_address=investor.address,\n", + " payment_address=investor.address,\n", + ")\n", + "\n", + "state_after_config = app.contract.get_state()\n", + "assert state_after_config.status == enums.STATUS_PENDING_IED\n", + "print(state_after_config)\n" + ] + }, + { + "cell_type": "markdown", + "id": "7623eae2785240b9bd12b16a66d81610", + "metadata": {}, + "source": [ + "## Primary Distribution\n", + "\n", + "The next cell uses `app.raw_client.new_group()` so the investor payment and the\n", + "`primary_distribution` app call stay atomic. That grouped flow is not yet wrapped\n", + "by a higher-level SDK helper.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7cdc8c89c7104fffa095e18ddfef8986", + "metadata": {}, + "outputs": [], + "source": [ + "if total_interest_amount > 0:\n", + " algorand.send.asset_transfer(\n", + " AssetTransferParams(\n", + " asset_id=currency.id,\n", + " amount=total_interest_amount,\n", + " receiver=app.app_address,\n", + " sender=bank.address,\n", + " signer=bank.signer,\n", + " )\n", + " )\n", + "\n", + "algorand.send.asset_transfer(\n", + " AssetTransferParams(\n", + " asset_id=currency.id,\n", + " amount=normalized.terms.initial_exchange_amount,\n", + " receiver=investor.address,\n", + " sender=bank.address,\n", + " signer=bank.signer,\n", + " )\n", + ")\n", + "\n", + "investor_purchase_txn = algorand.create_transaction.asset_transfer(\n", + " AssetTransferParams(\n", + " asset_id=currency.id,\n", + " amount=normalized.terms.initial_exchange_amount,\n", + " receiver=app.app_address,\n", + " sender=investor.address,\n", + " signer=investor.signer,\n", + " )\n", + ")\n", + "(\n", + " app.raw_client.new_group()\n", + " .add_transaction(investor_purchase_txn, investor.signer)\n", + " .primary_distribution(\n", + " PrimaryDistributionArgs(\n", + " holding_address=investor.address,\n", + " units=normalized.terms.total_units,\n", + " ),\n", + " params=CommonAppCallParams(\n", + " sender=primary_dealer.address,\n", + " signer=primary_dealer.signer,\n", + " ),\n", + " )\n", + " .send()\n", + ")\n", + "\n", + "raw_position = app.account(investor).get_raw_position()\n", + "assert raw_position.reserved_units == normalized.terms.total_units\n", + "print(raw_position)\n", + "print(\n", + " \"Contract currency balance:\",\n", + " format_asset_amount(\n", + " algorand.asset.get_account_information(app.app_address, currency.id).balance,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + " ),\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b118ea5561624da68c537baed56e602f", + "metadata": {}, + "outputs": [], + "source": [ + "pending_state = app.contract.get_state()\n", + "assert pending_state.status == enums.STATUS_PENDING_IED\n", + "\n", + "ied_entry = normalized.schedule[0]\n", + "time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC, algorand=algorand)\n", + "arranger_role.execute_ied()\n", + "\n", + "active_state = app.contract.get_state()\n", + "actualized_position = app.account(investor).get_actualized_position()\n", + "assert active_state.status == enums.STATUS_ACTIVE\n", + "assert actualized_position.units == normalized.terms.total_units\n", + "\n", + "print(active_state)\n", + "print(actualized_position)\n", + "print(\"Next due event:\", app.contract.get_next_due_event())\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "938c804e27f84196a10c8828c723f798", + "metadata": {}, + "outputs": [], + "source": [ + "holding = app.account(investor)\n", + "cashflows = []\n", + "\n", + "for entry in normalized.schedule[1:]:\n", + " time_warp(entry.scheduled_time, algorand=algorand)\n", + " funding = arranger_role.fund_due_cashflows(max_event_count=1)\n", + " claim = holding.claim()\n", + "\n", + " assert funding.processed_events == 1\n", + " assert claim.total_amount == funding.total_funded\n", + "\n", + " cashflows.append(\n", + " {\n", + " \"event_id\": entry.event_id,\n", + " \"event_type\": entry.event_type,\n", + " \"scheduled_time\": entry.scheduled_time,\n", + " \"funded\": funding.total_funded,\n", + " \"interest_claimed\": claim.interest_amount,\n", + " \"principal_claimed\": claim.principal_amount,\n", + " \"total_claimed\": claim.total_amount,\n", + " \"claim_timestamp\": claim.timestamp,\n", + " }\n", + " )\n", + "\n", + "print(render_table(cashflow_rows(cashflows, currency=currency)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "504fb2a444614c0babb325280ed9130a", + "metadata": {}, + "outputs": [], + "source": [ + "final_state = app.contract.get_state()\n", + "final_position = holding.get_actualized_position()\n", + "total_interest_claimed = sum(int(item[\"interest_claimed\"]) for item in cashflows)\n", + "total_principal_claimed = sum(int(item[\"principal_claimed\"]) for item in cashflows)\n", + "\n", + "assert final_state.status == enums.STATUS_ENDED\n", + "assert final_state.event_cursor == len(normalized.schedule)\n", + "assert total_interest_claimed == total_interest_amount\n", + "assert total_principal_claimed == normalized.terms.notional_principal\n", + "assert final_position.units == normalized.terms.total_units\n", + "\n", + "print(final_state)\n", + "print(final_position)\n", + "paid_label = format_asset_amount(\n", + " normalized.terms.initial_exchange_amount,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "received_label = format_asset_amount(\n", + " total_interest_claimed + total_principal_claimed,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "print(f\"Investor paid {paid_label}\")\n", + "print(f\"Investor received {received_label}\")\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/pam_zero_coupon_bond.ipynb b/examples/pam_zero_coupon_bond.ipynb new file mode 100644 index 00000000..cdc9592e --- /dev/null +++ b/examples/pam_zero_coupon_bond.ipynb @@ -0,0 +1,390 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7fb27b941602401d91542211134fc71a", + "metadata": {}, + "source": [ + "# PAM Zero Coupon Bond on LocalNet\n", + "\n", + "This notebook runs a live PAM zero coupon bond lifecycle on AlgoKit LocalNet.\n", + "\n", + "It covers both:\n", + "- the high-level SDK flow to build ACTUS terms, normalize them, and deploy `DAsa`\n", + "- the live execution flow through discounted issuance, `IED`, funding, holder claims, and maturity\n" + ] + }, + { + "cell_type": "markdown", + "id": "acae54e37e7d407bbb7b55eff062a284", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "- run `make install-dev` once\n", + "- start LocalNet with `make localnet` or `algokit localnet start`\n", + "- rerun the notebook from the first cell on a fresh LocalNet when repeating the demo\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a63283cbaf04dbcab1f6479b197f3a8", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "from pathlib import Path\n", + "\n", + "REPO_ROOT = next(\n", + " path for path in [Path.cwd(), *Path.cwd().parents] if (path / \"pyproject.toml\").exists()\n", + ")\n", + "os.chdir(REPO_ROOT)\n", + "if str(REPO_ROOT / \"src\") not in sys.path:\n", + " sys.path.insert(0, str(REPO_ROOT / \"src\"))\n", + "\n", + "print(f\"Repository root: {REPO_ROOT}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8dd0d8092fe74a7c96281538738b07e2", + "metadata": {}, + "outputs": [], + "source": [ + "from algokit_utils import AssetTransferParams, CommonAppCallParams\n", + "\n", + "from d_asa import (\n", + " DAsa,\n", + " DAsaRole,\n", + " enums,\n", + " make_pam_zero_coupon_bond,\n", + " normalize_contract_attributes,\n", + ")\n", + "from d_asa import constants as cst\n", + "from d_asa.artifacts.dasa_client import PrimaryDistributionArgs\n", + "from d_asa.localnet import get_latest_timestamp, time_warp\n", + "from d_asa.schedule import Cycle\n", + "from examples._support import (\n", + " cashflow_rows,\n", + " connect_localnet,\n", + " create_currency,\n", + " create_funded_account,\n", + " format_asset_amount,\n", + " opt_in_asset,\n", + " render_table,\n", + " schedule_rows,\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "72eea5119410473aa328ad9291626812", + "metadata": {}, + "outputs": [], + "source": [ + "PRINCIPAL = 10_000\n", + "MINIMUM_DENOMINATION = 100\n", + "ZERO_COUPON_MATURITY = Cycle.parse_cycle(\"360D\")\n", + "ZERO_COUPON_DISCOUNT_BPS = 200\n", + "ISSUANCE_DELAY = Cycle.parse_cycle(\"30D\")\n", + "\n", + "\n", + "def day_cycle_seconds(cycle: Cycle) -> int:\n", + " if cycle.unit != \"D\":\n", + " raise ValueError(f\"Only fixed day cycles are used in this notebook, got {cycle}\")\n", + " return cycle.count * cst.DAY_2_SEC\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8edb47106e1a46a883d545849b8ab81b", + "metadata": {}, + "outputs": [], + "source": [ + "algorand = connect_localnet()\n", + "arranger = create_funded_account(algorand, min_algo=50)\n", + "bank = create_funded_account(algorand, min_algo=50)\n", + "account_manager = create_funded_account(algorand)\n", + "primary_dealer = create_funded_account(algorand)\n", + "investor = create_funded_account(algorand)\n", + "\n", + "currency = create_currency(algorand, issuer=bank)\n", + "opt_in_asset(algorand, account=investor, asset_id=currency.id)\n", + "\n", + "print(f\"Currency ASA id: {currency.id}\")\n", + "print(f\"Arranger: {arranger.address}\")\n", + "print(f\"Bank: {bank.address}\")\n", + "print(f\"Investor: {investor.address}\")\n", + "print(f\"Account manager: {account_manager.address}\")\n", + "print(f\"Primary dealer: {primary_dealer.address}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10185d26023b46108eb7d9f57d49d2b3", + "metadata": {}, + "outputs": [], + "source": [ + "current_ts = get_latest_timestamp(algorand.client.algod)\n", + "issuance_date = current_ts + day_cycle_seconds(ISSUANCE_DELAY)\n", + "maturity_date = issuance_date + day_cycle_seconds(ZERO_COUPON_MATURITY)\n", + "discount_amount = PRINCIPAL * ZERO_COUPON_DISCOUNT_BPS // cst.BPS\n", + "\n", + "attrs = make_pam_zero_coupon_bond(\n", + " contract_id=2,\n", + " status_date=current_ts,\n", + " initial_exchange_date=issuance_date,\n", + " maturity_date=maturity_date,\n", + " notional_principal=PRINCIPAL,\n", + " premium_discount_at_ied=discount_amount,\n", + ")\n", + "normalized = normalize_contract_attributes(\n", + " attrs,\n", + " denomination_asset_id=currency.id,\n", + " denomination_asset_decimals=currency.decimals,\n", + " notional_unit_value=MINIMUM_DENOMINATION,\n", + " secondary_market_opening_date=issuance_date,\n", + " secondary_market_closure_date=maturity_date + cst.DAY_2_SEC,\n", + ")\n", + "bank_funding_amount = normalized.terms.notional_principal - normalized.terms.initial_exchange_amount\n", + "assert [entry.event_type for entry in normalized.schedule] == [\"IED\", \"MD\"]\n", + "\n", + "issue_price_label = format_asset_amount(\n", + " normalized.terms.initial_exchange_amount,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "principal_label = format_asset_amount(\n", + " normalized.terms.notional_principal,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "discount_label = format_asset_amount(\n", + " bank_funding_amount,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "print(f\"Issue price: {issue_price_label}\")\n", + "print(f\"Principal at maturity: {principal_label}\")\n", + "print(f\"Discount reserve: {discount_label}\")\n", + "print(render_table(schedule_rows(normalized, currency_decimals=currency.decimals)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8763a12b2bbd4a93a75aff182afb95dc", + "metadata": {}, + "outputs": [], + "source": [ + "app = DAsa.deploy_configured(\n", + " algorand=algorand,\n", + " arranger=arranger,\n", + " normalized=normalized,\n", + " prospectus_url=\"Notebook example: PAM zero coupon bond\",\n", + ")\n", + "arranger_role = app.arranger(arranger)\n", + "arranger_role.assign_role(DAsaRole.ACCOUNT_MANAGER, account_manager.address)\n", + "arranger_role.assign_role(DAsaRole.PRIMARY_DEALER, primary_dealer.address)\n", + "\n", + "app.account_manager(account_manager).open_account(\n", + " holding_address=investor.address,\n", + " payment_address=investor.address,\n", + ")\n", + "\n", + "state_after_config = app.contract.get_state()\n", + "assert state_after_config.status == enums.STATUS_PENDING_IED\n", + "print(state_after_config)\n" + ] + }, + { + "cell_type": "markdown", + "id": "7623eae2785240b9bd12b16a66d81610", + "metadata": {}, + "source": [ + "## Primary Distribution\n", + "\n", + "The next cell uses `app.raw_client.new_group()` so the investor payment and the\n", + "`primary_distribution` app call stay atomic. That grouped flow is not yet wrapped\n", + "by a higher-level SDK helper.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7cdc8c89c7104fffa095e18ddfef8986", + "metadata": {}, + "outputs": [], + "source": [ + "if bank_funding_amount > 0:\n", + " algorand.send.asset_transfer(\n", + " AssetTransferParams(\n", + " asset_id=currency.id,\n", + " amount=bank_funding_amount,\n", + " receiver=app.app_address,\n", + " sender=bank.address,\n", + " signer=bank.signer,\n", + " )\n", + " )\n", + "\n", + "algorand.send.asset_transfer(\n", + " AssetTransferParams(\n", + " asset_id=currency.id,\n", + " amount=normalized.terms.initial_exchange_amount,\n", + " receiver=investor.address,\n", + " sender=bank.address,\n", + " signer=bank.signer,\n", + " )\n", + ")\n", + "\n", + "investor_purchase_txn = algorand.create_transaction.asset_transfer(\n", + " AssetTransferParams(\n", + " asset_id=currency.id,\n", + " amount=normalized.terms.initial_exchange_amount,\n", + " receiver=app.app_address,\n", + " sender=investor.address,\n", + " signer=investor.signer,\n", + " )\n", + ")\n", + "(\n", + " app.raw_client.new_group()\n", + " .add_transaction(investor_purchase_txn, investor.signer)\n", + " .primary_distribution(\n", + " PrimaryDistributionArgs(\n", + " holding_address=investor.address,\n", + " units=normalized.terms.total_units,\n", + " ),\n", + " params=CommonAppCallParams(\n", + " sender=primary_dealer.address,\n", + " signer=primary_dealer.signer,\n", + " ),\n", + " )\n", + " .send()\n", + ")\n", + "\n", + "raw_position = app.account(investor).get_raw_position()\n", + "assert raw_position.reserved_units == normalized.terms.total_units\n", + "print(raw_position)\n", + "print(\n", + " \"Contract currency balance:\",\n", + " format_asset_amount(\n", + " algorand.asset.get_account_information(app.app_address, currency.id).balance,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + " ),\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b118ea5561624da68c537baed56e602f", + "metadata": {}, + "outputs": [], + "source": [ + "pending_state = app.contract.get_state()\n", + "assert pending_state.status == enums.STATUS_PENDING_IED\n", + "\n", + "ied_entry = normalized.schedule[0]\n", + "time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC, algorand=algorand)\n", + "arranger_role.execute_ied()\n", + "\n", + "active_state = app.contract.get_state()\n", + "actualized_position = app.account(investor).get_actualized_position()\n", + "assert active_state.status == enums.STATUS_ACTIVE\n", + "assert actualized_position.units == normalized.terms.total_units\n", + "\n", + "print(active_state)\n", + "print(actualized_position)\n", + "print(\"Next due event:\", app.contract.get_next_due_event())\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "938c804e27f84196a10c8828c723f798", + "metadata": {}, + "outputs": [], + "source": [ + "holding = app.account(investor)\n", + "cashflows = []\n", + "\n", + "for entry in normalized.schedule[1:]:\n", + " time_warp(entry.scheduled_time, algorand=algorand)\n", + " funding = arranger_role.fund_due_cashflows(max_event_count=1)\n", + " claim = holding.claim()\n", + "\n", + " assert funding.processed_events == 1\n", + " assert claim.total_amount == funding.total_funded\n", + "\n", + " cashflows.append(\n", + " {\n", + " \"event_id\": entry.event_id,\n", + " \"event_type\": entry.event_type,\n", + " \"scheduled_time\": entry.scheduled_time,\n", + " \"funded\": funding.total_funded,\n", + " \"interest_claimed\": claim.interest_amount,\n", + " \"principal_claimed\": claim.principal_amount,\n", + " \"total_claimed\": claim.total_amount,\n", + " \"claim_timestamp\": claim.timestamp,\n", + " }\n", + " )\n", + "\n", + "print(render_table(cashflow_rows(cashflows, currency=currency)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "504fb2a444614c0babb325280ed9130a", + "metadata": {}, + "outputs": [], + "source": [ + "final_state = app.contract.get_state()\n", + "final_position = holding.get_actualized_position()\n", + "total_interest_claimed = sum(int(item[\"interest_claimed\"]) for item in cashflows)\n", + "total_principal_claimed = sum(int(item[\"principal_claimed\"]) for item in cashflows)\n", + "\n", + "assert final_state.status == enums.STATUS_ENDED\n", + "assert final_state.event_cursor == len(normalized.schedule)\n", + "assert total_interest_claimed == 0\n", + "assert total_principal_claimed == normalized.terms.notional_principal\n", + "assert final_position.units == normalized.terms.total_units\n", + "\n", + "print(final_state)\n", + "print(final_position)\n", + "paid_label = format_asset_amount(\n", + " normalized.terms.initial_exchange_amount,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "received_label = format_asset_amount(\n", + " total_interest_claimed + total_principal_claimed,\n", + " decimals=currency.decimals,\n", + " unit_name=currency.unit_name,\n", + ")\n", + "print(f\"Investor paid {paid_label}\")\n", + "print(f\"Investor received {received_label}\")\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/modules/__init__.py b/modules/__init__.py index e69de29b..00f07cbd 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -0,0 +1,15 @@ +from .accounting import AccountingModule +from .actus_kernel import ActusKernelModule +from .payment_agent import PaymentAgent +from .rbac import RbacModule +from .transfer_agent import TransferAgent + +__all__ = [ + "AccountingModule", + "ActusKernelModule", + "PaymentAgent", + "RbacModule", + "TransferAgent", +] + +__version__ = "0.20.0" diff --git a/modules/accounting.py b/modules/accounting.py index 60cde60e..52dec657 100644 --- a/modules/accounting.py +++ b/modules/accounting.py @@ -1,116 +1,187 @@ -# pyright: reportMissingModuleSource=false - from algopy import Account, BoxMap, Global, Txn, UInt64, arc4 -from modules.rbac import RbacModule from smart_contracts import abi_types as typ from smart_contracts import constants as cst -from smart_contracts import enums as enm from smart_contracts import errors as err +from . import ActusKernelModule + + +class AccountingModule(ActusKernelModule): + """Contract Account ledger state and per-account settlement helpers.""" -class AccountingModule(RbacModule): def __init__(self) -> None: super().__init__() self.account = BoxMap( - Account, typ.AccountInfo, key_prefix=cst.PREFIX_ID_ACCOUNT + Account, + typ.AccountPosition, + key_prefix=cst.PREFIX_ID_ACCOUNT, ) - self.total_units = UInt64() - self.circulating_units = UInt64() - self.unit_value = UInt64() - self.status = UInt64(enm.STATUS_INACTIVE) - - def status_is_active(self) -> bool: - return self.status == enm.STATUS_ACTIVE - def status_is_ended(self) -> bool: - return self.status == enm.STATUS_ENDED - - def assert_valid_holding_address(self, holding_address: Account) -> None: + def _assert_valid_holding_address(self, holding_address: Account) -> None: + """Require the holding address to have an opened a contract account.""" assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - def assert_is_not_account_suspended(self, holding_address: Account) -> None: + def _assert_is_not_account_suspended(self, holding_address: Account) -> None: + """Require the account not to be suspended.""" assert not self.account[holding_address].suspended, err.SUSPENDED - def account_units_value(self, holding_address: Account, units: UInt64) -> UInt64: - return units * self.account[holding_address].unit_value + def _new_account_position(self, payment_address: Account) -> typ.AccountPosition: + """Create an empty contract account position.""" + return typ.AccountPosition( + payment_address=payment_address, + units=UInt64(0), + reserved_units=UInt64(0), + suspended=False, + settled_cursor=UInt64(0), + interest_checkpoint=UInt64(0), + principal_checkpoint=UInt64(0), + claimable_interest=UInt64(0), + claimable_principal=UInt64(0), + ) + + def _settle_position(self, holding_address: Account) -> tuple[UInt64, UInt64]: + """ + Settle an account to the latest funded global cashflow indices. + + Computes the per-unit fixed-point interest and principal index growth since the + account's last checkpoints, converts those deltas into absolute claimable + amounts using the account's active units, accrues them to the position, and + advances the account checkpoints to the current global indices and event cursor. + + Args: + holding_address: Account to settle. + + Returns: + Tuple of newly accrued `(claimable_interest, claimable_principal)` amounts. + """ - def account_total_units_value(self, holding_address: Account) -> UInt64: - return self.account_units_value( - holding_address, self.account[holding_address].units + self._assert_valid_holding_address(holding_address) + position = self.account[holding_address].copy() + + # Compute the incremental per-unit fixed-point interest and principal accrued + # since this account's last checkpoint. + interest_delta = self.cumulative_interest_index - position.interest_checkpoint + principal_delta = ( + self.cumulative_principal_index - position.principal_checkpoint ) - def outstanding_principal(self) -> UInt64: - return self.circulating_units * self.unit_value - - def end_if_no_circulating_units(self) -> None: - if self.circulating_units == UInt64(0): - self.status = UInt64(enm.STATUS_ENDED) - - def reset_position_if_empty(self, holding_address: Account) -> None: - if self.account[holding_address].units == UInt64(0): - self.account[holding_address].unit_value = UInt64(0) - self.account[holding_address].paid_coupons = UInt64(0) - - def assert_are_units_fungible(self, sender: Account, receiver: Account) -> None: - assert ( - self.account[sender].unit_value == self.account[receiver].unit_value - and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - ), err.NON_FUNGIBLE_UNITS - - def assert_fungible_transfer(self, sender: Account, receiver: Account) -> None: - sender_unit_value = self.account[sender].unit_value - if self.account[receiver].units > UInt64(0): - self.assert_are_units_fungible(sender, receiver) - else: - self.account[receiver].unit_value = sender_unit_value - self.account[receiver].paid_coupons = self.account[sender].paid_coupons - - def debit_units(self, holding_address: Account, units: UInt64) -> None: - assert units <= self.account[holding_address].units, err.OVER_TRANSFER - self.account[holding_address].units -= units - self.reset_position_if_empty(holding_address) + # Convert the per-unit fixed-point deltas into absolute claimable amounts + # using the account's active units. + claimable_interest = self._scaled_mul_div( + interest_delta, position.units, self.fixed_point_scale + ) + claimable_principal = self._scaled_mul_div( + principal_delta, position.units, self.fixed_point_scale + ) + + # Accrue the claimable amounts to the account position and make them available + # for withdrawal. + position.claimable_interest += claimable_interest + position.claimable_principal += claimable_principal + + # Advance the account's per-unit fixed-point checkpoints to the current global + # per-unit fixed-point global indices. + position.interest_checkpoint = self.cumulative_interest_index + position.principal_checkpoint = self.cumulative_principal_index + + # Advance the account's event cursor to the current global event cursor. + position.settled_cursor = self.event_cursor + + # Update the account position and return the newly accrued claimable amounts + # added to the total position's claimable amounts. + self.account[holding_address] = position.copy() + return claimable_interest, claimable_principal + + def _ensure_units_activated(self, holding_address: Account) -> None: + """Move reserved pre-IED units into active units once IED has executed.""" + self._assert_valid_holding_address(holding_address) + if self._status_is_pending_ied(): + return + + position = self.account[holding_address].copy() + if position.reserved_units == UInt64(0): + return + + activated_units = position.reserved_units + position.units += activated_units + position.reserved_units = UInt64(0) + self.account[holding_address] = position.copy() + assert self.reserved_units_total >= activated_units, err.OVER_DISTRIBUTION + self.reserved_units_total -= activated_units + + def _claimable_total(self, holding_address: Account) -> UInt64: + """Return the total currently claimable amount for an account.""" + return ( + self.account[holding_address].claimable_interest + + self.account[holding_address].claimable_principal + ) + + def _reset_claimable(self, holding_address: Account) -> tuple[UInt64, UInt64]: + """Clear claimable balances after a successful withdrawal.""" + position = self.account[holding_address].copy() + + # Get the claimable amounts before reset + interest_amount = position.claimable_interest + principal_amount = position.claimable_principal - def credit_units(self, holding_address: Account, units: UInt64) -> None: + # Reset the position's claimable amounts + position.claimable_interest = UInt64(0) + position.claimable_principal = UInt64(0) + self.account[holding_address] = position.copy() + + assert self.reserved_interest >= interest_amount, err.NOT_ENOUGH_FUNDS + assert self.reserved_principal >= principal_amount, err.NOT_ENOUGH_FUNDS + + # Update the global reserved interest and principal amounts + self.reserved_interest -= interest_amount + self.reserved_principal -= principal_amount + return interest_amount, principal_amount + + def _credit_units(self, holding_address: Account, units: UInt64) -> None: + """Increase an account's active unit balance.""" self.account[holding_address].units += units - def transfer_units( + def _credit_reserved_units(self, holding_address: Account, units: UInt64) -> None: + """Increase an account's reserved pre-IED unit balance.""" + self.account[holding_address].reserved_units += units + + def _debit_units(self, holding_address: Account, units: UInt64) -> None: + """Decrease an account's active unit balance.""" + assert units <= self.account[holding_address].units, err.OVER_TRANSFER + self.account[holding_address].units -= units + + def _apply_transfer( self, sender_holding_address: Account, receiver_holding_address: Account, units: UInt64, ) -> None: - self.debit_units(sender_holding_address, units) - self.credit_units(receiver_holding_address, units) - - def apply_principal_redemption(self, holding_address: Account) -> None: - redeemed_units = self.account[holding_address].units - self.circulating_units -= redeemed_units - self.account[holding_address].units = UInt64(0) - self.reset_position_if_empty(holding_address) - self.end_if_no_circulating_units() + """Move active units between two settled account positions.""" + self._debit_units(sender_holding_address, units) + self._credit_units(receiver_holding_address, units) @arc4.abimethod - def account_gov_suspension( + def account_suspension( self, *, holding_address: Account, suspended: bool ) -> UInt64: """ - Set account suspension status + Set the suspension status of one account. Args: - holding_address: Account Holding Address - suspended: Suspension status + holding_address: Account holding address. + suspended: Suspension status to apply. Returns: - Timestamp of the set account suspension status + UNIX timestamp of the suspension update. Raises: - UNAUTHORIZED: Not authorized - INVALID_HOLDING_ADDRESS: Invalid account holding address + UNAUTHORIZED: Caller is not an active authority. + INVALID_HOLDING_ADDRESS: Holding address does not exist. """ - self.assert_caller_is_authority() - self.assert_valid_holding_address(holding_address) + self._assert_caller_is_authority() + self._assert_valid_holding_address(holding_address) self.account[holding_address].suspended = suspended return Global.latest_timestamp @@ -119,104 +190,70 @@ def account_open( self, *, holding_address: Account, payment_address: Account ) -> UInt64: """ - Open D-ASA account + Open a contract account with a new position and register its payment address. Args: - holding_address: Account Holding Address - payment_address: Account Payment Address + holding_address: Account holding address. + payment_address: Account payment address. Returns: - Timestamp of the account opening + UNIX timestamp of the account opening. Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address + UNAUTHORIZED: Caller is not an active account manager or contract already ended. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + INVALID_HOLDING_ADDRESS: Holding address already exists. """ - self.assert_caller_is_account_manager() - assert not self.status_is_ended(), err.UNAUTHORIZED - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() + self._assert_caller_is_account_manager() + assert not self._status_is_ended(), err.UNAUTHORIZED + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS - - self.account[holding_address] = typ.AccountInfo( - payment_address=payment_address, - units=UInt64(0), - unit_value=UInt64(0), - paid_coupons=UInt64(0), - suspended=False, - ) + self.account[holding_address] = self._new_account_position(payment_address) return Global.latest_timestamp - @arc4.abimethod - def account_close(self, *, holding_address: Account) -> tuple[UInt64, UInt64]: - """ - Close D-ASA account - - Args: - holding_address: Account Holding Address - - Returns: - Closed units, Timestamp of the account closing - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - INVALID_HOLDING_ADDRESS: Invalid account holding address - """ - - self.assert_caller_is_account_manager() - self.assert_is_not_asset_defaulted() - self.assert_valid_holding_address(holding_address) - - closed_units = self.account[holding_address].units - del self.account[holding_address] - self.circulating_units -= closed_units - self.end_if_no_circulating_units() - return closed_units, Global.latest_timestamp - @arc4.abimethod def account_update_payment_address( self, *, holding_address: Account, payment_address: Account ) -> UInt64: """ - Update the Payment Address of an account + Update the payment address of an account. Args: - holding_address: Account Holding Address - payment_address: Account Payment Address + holding_address: Account holding address. + payment_address: New account payment address. Returns: - Timestamp of the account update + UNIX timestamp of the account update. Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address + UNAUTHORIZED: Caller is not the holding address owner. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + INVALID_HOLDING_ADDRESS: Holding address does not exist. """ + self._assert_valid_holding_address(holding_address) assert Txn.sender == holding_address, err.UNAUTHORIZED - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() - self.assert_valid_holding_address(holding_address) + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() self.account[holding_address].payment_address = payment_address return Global.latest_timestamp @arc4.abimethod(readonly=True) - def account_get_info(self, *, holding_address: Account) -> typ.AccountInfo: + def account_get_position(self, *, holding_address: Account) -> typ.AccountPosition: """ - Get account info + Get the full accounting position for one holder. Args: - holding_address: Account Holding Address + holding_address: Account holding address. Returns: - Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended + Account position record. Raises: - INVALID_HOLDING_ADDRESS: Invalid account holding address + INVALID_HOLDING_ADDRESS: Holding address does not exist. """ - self.assert_valid_holding_address(holding_address) + self._assert_valid_holding_address(holding_address) return self.account[holding_address] diff --git a/modules/actus/__init__.py b/modules/actus/__init__.py deleted file mode 100644 index 62cec6df..00000000 --- a/modules/actus/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from .pam import PAMCoreMixin -from .pbn import PBNCoreMixin - -__all__ = [ - "PAMCoreMixin", - "PBNCoreMixin", -] diff --git a/modules/actus/pam.py b/modules/actus/pam.py deleted file mode 100644 index c4db4fac..00000000 --- a/modules/actus/pam.py +++ /dev/null @@ -1,81 +0,0 @@ -# pyright: reportMissingModuleSource=false -from algopy import Account, Asset, Global, UInt64, arc4 - -from modules.core_financial.common import CoreFinancialCommonMixin -from smart_contracts import abi_types as typ -from smart_contracts import errors as err - - -class PAMCoreMixin(CoreFinancialCommonMixin): - """Principal at Maturity (PAM) core.""" - - def __init__(self) -> None: - super().__init__() - - def assert_pay_principal_authorization(self, holding_address: Account) -> None: - # The reference implementation does not restrict caller authorization - assert self.status_is_active(), err.UNAUTHORIZED - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() - self.assert_valid_holding_address(holding_address) - units = self.account[holding_address].units - assert units > 0, err.NO_UNITS - assert Global.latest_timestamp >= self.maturity_date, err.NOT_MATURE - # The reference implementation does not assert if there is enough liquidity to repay the principal to all - - @arc4.abimethod - def asset_config( - self, - *, - denomination_asset_id: Asset, - settlement_asset_id: Asset, - principal: UInt64, - principal_discount: UInt64, - minimum_denomination: UInt64, - day_count_convention: arc4.UInt8, - interest_rate: arc4.UInt16, - coupon_rates: typ.CouponRates, - time_events: typ.TimeEvents, - time_periods: typ.TimePeriods, - ) -> None: - """ - Configure the Debt Algorand Standard Application - - Args: - denomination_asset_id: Denomination asset identifier - settlement_asset_id: Settlement asset identifier - principal: Principal, expressed in denomination asset - principal_discount: Principal discount in bps - minimum_denomination: Minimum denomination, expressed in denomination asset - day_count_convention: Day-count convention for interests calculation - interest_rate: Interest rate in bps - coupon_rates: Coupon interest rates in bps - time_events: Time events (strictly ascending order) - time_periods: Time periods of recurring time events - - Raises: - UNAUTHORIZED: Not authorized - ALREADY_CONFIGURED: D-ASA already configured - INVALID_MINIMUM_DENOMINATION: Minimum denomination is not a divisor of principal - INVALID_DAY_COUNT_CONVENTION: Invalid day-count convention ID - INVALID_TIME_EVENTS_LENGTH: Time events length is invalid - INVALID_TIME: Time events must be set in the future - INVALID_SORTING: Time events are not sorted correctly - INVALID_TIME_PERIOD_DURATION: Time period durations must be greater than zero - INVALID_SETTLEMENT_ASSET: Different settlement asset not supported, must be equal to denomination asset - INVALID_TIME_PERIODS: Time periods not properly set - INVALID_TIME_PERIOD_REPETITIONS: Time period repetitions not properly set - INVALID_COUPON_RATES: Coupon rates not properly set - """ - self._configure_asset_terms( - denomination_asset_id=denomination_asset_id, - settlement_asset_id=settlement_asset_id, - principal=principal, - principal_discount=principal_discount, - minimum_denomination=minimum_denomination, - day_count_convention=day_count_convention, - interest_rate=interest_rate, - coupon_rates=coupon_rates, - time_events=time_events, - time_periods=time_periods, - ) diff --git a/modules/actus/pbn.py b/modules/actus/pbn.py deleted file mode 100644 index d808e17f..00000000 --- a/modules/actus/pbn.py +++ /dev/null @@ -1,114 +0,0 @@ -from algopy import Asset, Global, UInt64, arc4 - -from modules.core_financial.common import CoreFinancialCommonMixin -from smart_contracts import abi_types as typ -from smart_contracts import config as cfg -from smart_contracts import errors as err - - -class PBNCoreMixin(CoreFinancialCommonMixin): - """Perpetual Bond (PBN) core.""" - - def __init__(self) -> None: - super().__init__() - - def assert_time_schedule_limits(self, time_events: typ.TimeEvents) -> None: - # PBN has no maturity date in the static schedule - assert ( - time_events.length == self.total_coupons + 3 - ), err.INVALID_TIME_EVENTS_LENGTH - - def set_time_events(self, time_events: typ.TimeEvents) -> None: - self.time_events.value = time_events.copy() - self.primary_distribution_opening_date = time_events[ - cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - ] - self.primary_distribution_closure_date = time_events[ - cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - ] - self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX] - self.maturity_date = UInt64(0) - - @arc4.abimethod - def asset_config( - self, - *, - denomination_asset_id: Asset, - settlement_asset_id: Asset, - principal: UInt64, - principal_discount: UInt64, - minimum_denomination: UInt64, - day_count_convention: arc4.UInt8, - interest_rate: arc4.UInt16, - coupon_rates: typ.CouponRates, - time_events: typ.TimeEvents, - time_periods: typ.TimePeriods, - ) -> None: - """ - Configure the Debt Algorand Standard Application - - Args: - denomination_asset_id: Denomination asset identifier - settlement_asset_id: Settlement asset identifier - principal: Principal, expressed in denomination asset - principal_discount: Principal discount in bps - minimum_denomination: Minimum denomination, expressed in denomination asset - day_count_convention: Day-count convention for interests calculation - interest_rate: Interest rate in bps - coupon_rates: Coupon interest rates in bps - time_events: Time events (strictly ascending order) - time_periods: Time periods of recurring time events - - Raises: - UNAUTHORIZED: Not authorized - ALREADY_CONFIGURED: D-ASA already configured - INVALID_MINIMUM_DENOMINATION: Minimum denomination is not a divisor of principal - INVALID_DAY_COUNT_CONVENTION: Invalid day-count convention ID - INVALID_TIME_EVENTS_LENGTH: Time events length is invalid - INVALID_TIME: Time events must be set in the future - INVALID_SORTING: Time events are not sorted correctly - INVALID_TIME_PERIOD_DURATION: Time period durations must be greater than zero - INVALID_SETTLEMENT_ASSET: Different settlement asset not supported, must be equal to denomination asset - INVALID_TIME_PERIODS: Time periods not properly set - INVALID_TIME_PERIOD_REPETITIONS: Time period repetitions not properly set - INVALID_COUPON_RATES: Coupon rates not properly set - """ - self._configure_asset_terms( - denomination_asset_id=denomination_asset_id, - settlement_asset_id=settlement_asset_id, - principal=principal, - principal_discount=principal_discount, - minimum_denomination=minimum_denomination, - day_count_convention=day_count_convention, - interest_rate=interest_rate, - coupon_rates=coupon_rates, - time_events=time_events, - time_periods=time_periods, - ) - - @arc4.abimethod - def update_interest_rate(self, *, interest_rate: arc4.UInt16) -> UInt64: - """ - Update variable interest rates in bps - - Args: - interest_rate: Interest rate in bps - - Returns: - Timestamp of the update - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - PENDING_COUPON_PAYMENT: Pending due coupon payment - """ - self.assert_caller_is_interest_oracle() - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() - due_coupons = self.count_due_coupons() - assert self.all_due_coupons_paid(due_coupons), err.PENDING_COUPON_PAYMENT - - # Update interest rate - self.interest_rate = interest_rate.as_uint64() - return Global.latest_timestamp diff --git a/modules/actus_kernel.py b/modules/actus_kernel.py new file mode 100644 index 00000000..62e8a5d7 --- /dev/null +++ b/modules/actus_kernel.py @@ -0,0 +1,1316 @@ +""" +ACTUS Kernel + +This module contains the contract-type-independent part of the execution engine. +It validates normalized terms, classifies schedule entries, computes cashflow +magnitudes, advances the contract state machine, and exposes the generic ABI methods +shared by the D-ASA variants. + +Glossary used in this file: +- `IED`: initial exchange date. The contract moves from configured to active. +- `IP`: interest payment. +- `PR`: principal redemption. +- `PI`: principal increase or capitalization. +- `MD`: maturity. +- `RR` / `RRF`: rate reset from an observed rate or a pre-fixed rate. +- `IPCB`: interest calculation base reset. +- `PRF`: principal redemption fixing for dynamic annuities. + +The schedule is normalized off chain before it reaches the AVM. Each entry +therefore already carries the next contractual state, and the kernel mostly +needs to verify that the next entry is due, derive any payable amount, then +move on-chain state to the entry's `next_*` values. +""" + +from algopy import ( + Account, + Asset, + BoxMap, + Bytes, + Global, + String, + UInt64, + arc4, + ensure_budget, + itxn, + op, +) + +from smart_contracts import abi_types as typ +from smart_contracts import constants as cst +from smart_contracts import enums +from smart_contracts import errors as err +from smart_contracts.events import ExecutionEvent + +from .rbac import RbacModule + + +class ActusKernelModule(RbacModule): + """ + Implement the ACTUS schedule and state transitions. + """ + + def __init__(self) -> None: + super().__init__() + + # Contract + self.status = UInt64(enums.STATUS_INACTIVE) + self.contract_type = UInt64() + + # Prospectus (Informational) + self.prospectus_hash = Bytes() + self.prospectus_url = String() + + # Denomination + self.denomination_asset_id = Asset() + self.settlement_asset_id = Asset() + + # Time + self.initial_exchange_date = typ.TimeStamp() + self.maturity_date = typ.TimeStamp() + self.transfer_opening_date = typ.TimeStamp() + self.transfer_closure_date = typ.TimeStamp() + + # Day Count Convention + self.day_count_convention = UInt64() + + # Units + self.total_units = UInt64() + self.reserved_units_total = UInt64() + + # Principal + self.initial_exchange_amount = UInt64() + self.outstanding_principal = UInt64() + self.next_principal_redemption = UInt64() + self.dynamic_principal_redemption = False + + # Interest + self.interest_calculation_base = UInt64() + self.accrued_interest = UInt64() + + # Interest Rates + self.nominal_interest_rate = UInt64() + self.rate_reset_spread = UInt64() + self.rate_reset_multiplier = UInt64() + self.rate_reset_floor = UInt64() + self.rate_reset_cap = UInt64() + self.rate_reset_next = UInt64() + self.has_rate_reset_floor = False + self.has_rate_reset_cap = False + + # Primary Distribution + self.reserved_principal = UInt64() + self.reserved_interest = UInt64() + + # Cumulative Per-Unit Fixed-Point Indexes + self.cumulative_interest_index = UInt64() + self.cumulative_principal_index = UInt64() + + # Schedule + self.schedule_page = BoxMap( + UInt64, + typ.ExecutionSchedulePage, + key_prefix=cst.PREFIX_ID_SCHEDULE_PAGE, + ) + self.event_cursor = UInt64() + self.schedule_entry_count = UInt64() + + # Scaling + self.fixed_point_scale = UInt64() + + ############################################################################ + # AVM-specific Contract State + ############################################################################ + + def _status_is_inactive(self) -> bool: + """Return whether the contract is inactive.""" + return self.status == UInt64(enums.STATUS_INACTIVE) + + def _status_is_active(self) -> bool: + """Return whether the contract is active after IED.""" + return self.status == UInt64(enums.STATUS_ACTIVE) + + def _status_is_pending_ied(self) -> bool: + """Return whether the contract is configured but still awaiting IED.""" + return self.status == UInt64(enums.STATUS_PENDING_IED) + + def _status_is_ended(self) -> bool: + """Return whether the contract has reached its terminal state.""" + return self.status == UInt64(enums.STATUS_ENDED) + + def _assert_configured(self) -> None: + """Require the contract to have completed configuration.""" + assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + + def _assert_initial_exchange_executed(self) -> None: + """Require the initial exchange event to have been executed.""" + assert not self._status_is_pending_ied(), err.PENDING_IED + + ############################################################################ + # Math and Conversions + ############################################################################ + + def _scaled_mul_div( + self, multiplicand: UInt64, multiplier: UInt64, divisor: UInt64 + ) -> UInt64: + """Multiply and divide in fixed-point space using wide AVM math.""" + if multiplicand == UInt64(0) or multiplier == UInt64(0): + return UInt64(0) + high, low = op.mulw(multiplicand, multiplier) + return op.divw(high, low, divisor) + + def _amount_to_index_delta(self, amount: UInt64) -> UInt64: + """Convert a contract-wide amount into a per-unit cumulative index delta.""" + if amount == UInt64(0): + return UInt64(0) + assert self.total_units > UInt64(0), err.NO_UNITS + return self._scaled_mul_div(amount, self.fixed_point_scale, self.total_units) + + def _index_delta_to_amount(self, index_delta: UInt64) -> UInt64: + """ + Convert a per-unit index delta back into a contract-wide amount. + + This mirrors `_amount_to_index_delta()` and keeps funding amounts aligned + with what holders can later realize from the cumulative indices. + """ + if index_delta == UInt64(0): + return UInt64(0) + return self._scaled_mul_div( + self.total_units, + index_delta, + self.fixed_point_scale, + ) + + ############################################################################ + # Schedule + ############################################################################ + + def _schedule_page_index(self, event_id: UInt64) -> UInt64: + """Return the schedule page index containing the given event id.""" + return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) + + def _schedule_page_offset(self, event_id: UInt64) -> UInt64: + """Return the offset of an event within its schedule page.""" + return event_id % UInt64(cst.SCHEDULE_PAGE_SIZE) + + def _store_schedule_page( + self, page_index: UInt64, schedule_page: typ.ExecutionSchedulePage + ) -> None: + """Persist a normalized schedule page.""" + self.schedule_page[page_index] = schedule_page.copy() + + def _get_schedule_entry(self, event_id: UInt64) -> typ.ExecutionScheduleEntry: + """Load a normalized schedule entry by global event id.""" + assert event_id < self.schedule_entry_count, err.INVALID_EVENT_ID + page_index = self._schedule_page_index(event_id) + assert page_index in self.schedule_page, err.INVALID_SCHEDULE_PAGE + page = self.schedule_page[page_index].copy() + offset = self._schedule_page_offset(event_id) + assert offset < page.length, err.INVALID_SCHEDULE_PAGE + return page[offset].copy() + + ############################################################################ + # ACTUS Composition Validation + ############################################################################ + + def _is_supported_contract_type(self, contract_type: UInt64) -> bool: + """Return whether the contract type belongs to the supported ACTUS types.""" + return contract_type in ( + UInt64(enums.CT_PAM), + UInt64(enums.CT_ANN), + UInt64(enums.CT_NAM), + UInt64(enums.CT_LAM), + UInt64(enums.CT_LAX), + UInt64(enums.CT_CLM), + ) + + def _assert_supported_contract_type(self, contract_type: UInt64) -> None: + """Require the configured contract type to be supported by the kernel.""" + assert self._is_supported_contract_type(contract_type), err.INVALID_ACTUS_CONFIG + + def _supports_observed_events(self) -> bool: + """Return whether the configured type may append observed events.""" + return self.contract_type == UInt64(enums.CT_CLM) + + def _event_allowed_for_contract_type( + self, contract_type: UInt64, event_type: UInt64 + ) -> bool: + """ + Return whether `event_type` may appear in the normalized schedule. + + This is the kernel's compatibility matrix between contract families and + schedule events. It does not say whether the event is due now, only + whether it is a valid event kind for the chosen ACTUS contract type. + """ + # Common events supported by all contract types + common_events = ( + UInt64(enums.EVT_IED), + UInt64(enums.EVT_IP), + UInt64(enums.EVT_MD), + UInt64(enums.EVT_RR), + UInt64(enums.EVT_RRF), + ) + + # Check common events first + if event_type in common_events: + return True + + # Contract-specific additional events + if contract_type == UInt64(enums.CT_PAM): + # PAM only supports common events + return False + + if contract_type == UInt64(enums.CT_LAM) or contract_type == UInt64( + enums.CT_NAM + ): + # LAM/NAM add: PR, IPCB + return event_type in ( + UInt64(enums.EVT_PR), + UInt64(enums.EVT_IPCB), + ) + + if contract_type == UInt64(enums.CT_ANN): + # ANN adds: PR, IPCB, PRF + return event_type in ( + UInt64(enums.EVT_PR), + UInt64(enums.EVT_IPCB), + UInt64(enums.EVT_PRF), + ) + + if contract_type == UInt64(enums.CT_LAX): + # LAX adds: PR, PI, IPCB, PRF + return event_type in ( + UInt64(enums.EVT_PR), + UInt64(enums.EVT_PI), + UInt64(enums.EVT_IPCB), + UInt64(enums.EVT_PRF), + ) + + if contract_type == UInt64(enums.CT_CLM): + # CLM adds: PR + return event_type == UInt64(enums.EVT_PR) + + return False + + def _is_supported_day_count_convention(self, day_count_convention: UInt64) -> bool: + """Return whether the normalized day-count identifier is accepted in v1.""" + return day_count_convention in ( + UInt64(enums.DCC_AA), + UInt64(enums.DCC_A360), + UInt64(enums.DCC_A365), + UInt64(enums.DCC_30E360ISDA), + UInt64(enums.DCC_30E360), + ) + + def _assert_supported_day_count_convention( + self, day_count_convention: UInt64 + ) -> None: + """Require the normalized day-count identifier to be one the AVM accepts.""" + assert self._is_supported_day_count_convention( + day_count_convention + ), err.INVALID_DAY_COUNT_CONVENTION + + def _assert_event_allowed_for_contract_type( + self, contract_type: UInt64, event_type: UInt64 + ) -> None: + """Require a schedule event to be compatible with the stored contract type.""" + assert self._event_allowed_for_contract_type( + contract_type, event_type + ), err.INVALID_ACTUS_CONFIG + + def _validate_terms_for_contract_type( + self, contract_type: UInt64, terms: typ.NormalizedActusTerms + ) -> None: + """Validate normalized terms that depend on the selected contract type.""" + assert terms.initial_exchange_amount > UInt64(0), err.INVALID_ACTUS_CONFIG + self._assert_supported_day_count_convention( + terms.day_count_convention.as_uint64() + ) + if contract_type != UInt64(enums.CT_ANN): + assert not terms.dynamic_principal_redemption, err.INVALID_ACTUS_CONFIG + + def _is_dynamic_annuity(self) -> bool: + """Return whether the current contract uses ANN dynamic redemption.""" + return ( + self.contract_type == UInt64(enums.CT_ANN) + and self.dynamic_principal_redemption + ) + + ############################################################################ + # Event Classifiers + ############################################################################ + + def _event_is_cash(self, event_type: UInt64) -> bool: + """ + Return whether the event reserves settlement funds for holders. + + Cash events increase the global per-unit indices and ring-fence funds in + `reserved_interest` / `reserved_principal` for later holder claims. + """ + return event_type in ( + UInt64(enums.EVT_IP), + UInt64(enums.EVT_PR), + UInt64(enums.EVT_MD), + ) + + def _event_is_non_cash(self, event_type: UInt64) -> bool: + """ + Return whether the event only mutates contract state. + + Non-cash events still advance the schedule cursor, but they do not + reserve settlement assets in the holder claim ledger. + """ + return event_type in ( + UInt64(enums.EVT_IED), + UInt64(enums.EVT_PI), + UInt64(enums.EVT_RR), + UInt64(enums.EVT_RRF), + UInt64(enums.EVT_IPCB), + UInt64(enums.EVT_PRF), + ) + + def _event_is_rate_reset(self, event_type: UInt64) -> bool: + """Return whether the event updates the current contractual interest rate.""" + return event_type in (UInt64(enums.EVT_RR), UInt64(enums.EVT_RRF)) + + ############################################################################ + # Amounts Computation + ############################################################################ + + def _entry_interest_segment(self, entry: typ.ExecutionScheduleEntry) -> UInt64: + """ + Compute the interest accrued since the previous status date. + + The schedule already provides the accrual factor for the period. The + kernel multiplies that factor by the current interest base and nominal + rate to get the incremental carry attributable to this entry. + """ + if ( + entry.accrual_factor == UInt64(0) + or self.nominal_interest_rate == UInt64(0) + or self.interest_calculation_base == UInt64(0) + ): + return UInt64(0) + accrued = self._scaled_mul_div( + self.interest_calculation_base, + self.nominal_interest_rate, + self.fixed_point_scale, + ) + return self._scaled_mul_div( + accrued, + entry.accrual_factor, + self.fixed_point_scale, + ) + + def _entry_interest_amount(self, entry: typ.ExecutionScheduleEntry) -> UInt64: + """ + Return the contractual interest due for a cash event. + + `IP` and `MD` settle all currently accrued carry plus the period segment + produced by this entry. `PR` does not settle interest separately here. + """ + event_type = entry.event_type.as_uint64() + if event_type not in (UInt64(enums.EVT_IP), UInt64(enums.EVT_MD)): + return UInt64(0) + return self.accrued_interest + self._entry_interest_segment(entry) + + def _entry_principal_amount(self, entry: typ.ExecutionScheduleEntry) -> UInt64: + """ + Return the contractual principal due for a cash event. + + For standard schedules the entry directly tells the kernel the next + outstanding principal. Dynamic annuities are different: the scheduled + redemption is treated as a total payment target, so principal is the + residual left after interest is covered. + """ + event_type = entry.event_type.as_uint64() + if event_type not in (UInt64(enums.EVT_PR), UInt64(enums.EVT_MD)): + return UInt64(0) + if self._is_dynamic_annuity(): + if event_type == UInt64(enums.EVT_MD): + return self.outstanding_principal + interest_due = self.accrued_interest + self._entry_interest_segment(entry) + if self.next_principal_redemption <= interest_due: + return UInt64(0) + principal_amount = self.next_principal_redemption - interest_due + if principal_amount > self.outstanding_principal: + return self.outstanding_principal + return principal_amount + assert ( + entry.next_outstanding_principal <= self.outstanding_principal + ), err.INVALID_ACTUS_CONFIG + return self.outstanding_principal - entry.next_outstanding_principal + + def _entry_ied_amount(self, entry: typ.ExecutionScheduleEntry) -> UInt64: + """ + Return the contractual IED amount stored in normalized terms. + + `IED` is a lifecycle transition on chain, not a funded holder cashflow, + so the amount is emitted for traceability but not settled from escrow. + """ + assert entry.event_type.as_uint64() == UInt64(enums.EVT_IED), err.NOT_EVT_IED + return self.initial_exchange_amount + + def _reserved_total(self) -> UInt64: + """Return the settlement funds already ring-fenced for holders.""" + return self.reserved_interest + self.reserved_principal + + ############################################################################ + # Annuity (ANN) Specific Logic + ############################################################################ + + def _discount_annuity_factor( + self, + discount_factor: UInt64, + redemption_factor: UInt64, + ) -> UInt64: + """Advance an annuity discount factor by one redemption period.""" + if redemption_factor == UInt64(0): + return discount_factor + period_rate = self.fixed_point_scale + self._scaled_mul_div( + self.nominal_interest_rate, + redemption_factor, + self.fixed_point_scale, + ) + assert period_rate > UInt64(0), err.INVALID_ACTUS_CONFIG + return self._scaled_mul_div( + discount_factor, + self.fixed_point_scale, + period_rate, + ) + + def _recalculate_annuity_payment(self, entry: typ.ExecutionScheduleEntry) -> UInt64: + """ + Recompute the next annuity payment after a `PRF` event. + + The method walks the remaining redemption-bearing schedule entries, + discounts each future payment bucket, and solves for the flat payment + that amortizes the current outstanding state. + """ + discount_factor = self.fixed_point_scale + denominator = UInt64(0) + skip_first_redemption = False + + if entry.redemption_accrual_factor > UInt64(0): + # An initial PRF may describe the first redemption period directly. + discount_factor = self._discount_annuity_factor( + discount_factor, + entry.redemption_accrual_factor, + ) + denominator += discount_factor + skip_first_redemption = True + + future_event_id = self.event_cursor + UInt64(1) + while future_event_id < self.schedule_entry_count: + future_entry = self._get_schedule_entry(future_event_id) + future_event_type = future_entry.event_type.as_uint64() + # Only redemption-bearing events contribute to the annuity denominator. + is_redemption_event = future_event_type == UInt64(enums.EVT_PR) or ( + future_event_type == UInt64(enums.EVT_MD) + and future_entry.redemption_accrual_factor > UInt64(0) + ) + if is_redemption_event: + if skip_first_redemption: + skip_first_redemption = False + else: + discount_factor = self._discount_annuity_factor( + discount_factor, + future_entry.redemption_accrual_factor, + ) + denominator += discount_factor + future_event_id += UInt64(1) + + assert denominator > UInt64(0), err.INVALID_ACTUS_CONFIG + numerator = self.outstanding_principal + if entry.flags & UInt64(enums.FLAG_INITIAL_PRF) == UInt64(0): + # Subsequent PRF events amortize both principal and already accrued carry. + numerator += self.accrued_interest + return self._scaled_mul_div( + numerator, + self.fixed_point_scale, + denominator, + ) + + ############################################################################ + # Apply Schedule Entries + ############################################################################ + + def _apply_cash_entry( + self, entry: typ.ExecutionScheduleEntry + ) -> tuple[UInt64, UInt64]: + """ + Apply one due cash event and reserve its amount for later claims. + + The kernel derives the contract-wide interest and principal due, turns + those amounts into per-unit index deltas, reserves settlement funds, and + advances the global cursor to the next schedule entry. + """ + assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW + + interest_amount_due = self._entry_interest_amount(entry) + principal_amount_due = self._entry_principal_amount(entry) + next_outstanding_principal = entry.next_outstanding_principal + next_interest_base = entry.next_outstanding_principal + + if self._is_dynamic_annuity(): + event_type = entry.event_type.as_uint64() + # Dynamic annuities derive next state from the payment decomposition, + # not only from the precomputed `next_*` fields. + if event_type == UInt64(enums.EVT_PR): + next_outstanding_principal = ( + self.outstanding_principal - principal_amount_due + ) + next_interest_base = next_outstanding_principal + elif event_type == UInt64(enums.EVT_IP): + next_outstanding_principal = self.outstanding_principal + next_interest_base = self.interest_calculation_base + elif event_type == UInt64(enums.EVT_MD): + next_outstanding_principal = UInt64(0) + next_interest_base = UInt64(0) + + # Funding uses per-unit cumulative indices so each holder can settle + # independently from its current unit balance. + interest_index_delta = self._amount_to_index_delta(interest_amount_due) + principal_index_delta = self._amount_to_index_delta(principal_amount_due) + interest_amount = self._index_delta_to_amount(interest_index_delta) + principal_amount = self._index_delta_to_amount(principal_index_delta) + required_amount = interest_amount + principal_amount + assert ( + self._available_settlement_funds() >= required_amount + ), err.NOT_ENOUGH_FUNDS + + self.reserved_interest += interest_amount + self.reserved_principal += principal_amount + self.cumulative_interest_index += interest_index_delta + self.cumulative_principal_index += principal_index_delta + if entry.event_type.as_uint64() == UInt64(enums.EVT_PR): + # For PR, the period interest stays accrued until a later IP or MD. + self.accrued_interest += self._entry_interest_segment(entry) + else: + self.accrued_interest = UInt64(0) + if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( + enums.EVT_MD + ): + self.next_principal_redemption = entry.next_principal_redemption + self.outstanding_principal = next_outstanding_principal + self.interest_calculation_base = next_interest_base + self.event_cursor += UInt64(1) + + if entry.event_type == arc4.UInt8( + enums.EVT_MD + ) and self.outstanding_principal == UInt64(0): + self.status = UInt64(enums.STATUS_ENDED) + self.interest_calculation_base = UInt64(0) + + self._emit_execution_event( + entry=entry, + payoff=interest_amount + principal_amount, + settled_amount=interest_amount + principal_amount, + ) + return interest_amount, principal_amount + + def _apply_non_cash_schedule_entry( + self, entry: typ.ExecutionScheduleEntry, payload: typ.ObservedEventRequest + ) -> None: + """ + Apply one due non-cash event and advance the kernel state. + + Non-cash events do not reserve settlement assets, but they can activate + issuance, capitalize principal, change the running rate, or recalculate + future annuity payments. + """ + assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW + + event_type = entry.event_type.as_uint64() + if event_type == UInt64(enums.EVT_IED): + # IED finalizes issuance: reserved units become activatable and the + # schedule's initial contractual state becomes live. + assert self._status_is_pending_ied(), err.INVALID_ACTUS_CONFIG + assert ( + self.reserved_units_total == self.total_units + ), err.PRIMARY_DISTRIBUTION_INCOMPLETE + self.outstanding_principal = entry.next_outstanding_principal + self.interest_calculation_base = entry.next_outstanding_principal + self.nominal_interest_rate = entry.next_nominal_interest_rate + self.accrued_interest = UInt64(0) + self.next_principal_redemption = entry.next_principal_redemption + self.event_cursor += UInt64(1) + self.status = UInt64(enums.STATUS_ACTIVE) + self._emit_execution_event( + entry=entry, + payoff=self._entry_ied_amount(entry), + settled_amount=UInt64(0), + ) + return + + self._assert_initial_exchange_executed() + self.accrued_interest += self._entry_interest_segment(entry) + + if event_type == UInt64(enums.EVT_RR): + # RR derives the next rate from an observed oracle value plus the + # contract spread / multiplier terms, then enforces floor and cap. + observed_rate = self._scaled_mul_div( + payload.observed_rate, + self.rate_reset_multiplier, + self.fixed_point_scale, + ) + self.nominal_interest_rate = self._clamp_rate( + observed_rate + self.rate_reset_spread + ) + elif event_type == UInt64(enums.EVT_RRF): + next_rate = entry.next_nominal_interest_rate + if next_rate == UInt64(0): + next_rate = self.rate_reset_next + self.nominal_interest_rate = next_rate + else: + if entry.next_nominal_interest_rate != UInt64(0): + self.nominal_interest_rate = entry.next_nominal_interest_rate + + if event_type == UInt64(enums.EVT_PI): + self.outstanding_principal = entry.next_outstanding_principal + self.interest_calculation_base = entry.next_outstanding_principal + elif event_type == UInt64(enums.EVT_IPCB): + # IPCB keeps principal unchanged and only resets the interest base. + self.interest_calculation_base = self.outstanding_principal + + if self._is_dynamic_annuity(): + if event_type == UInt64(enums.EVT_PRF): + ensure_budget( + required_budget=( + UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) + + (self.schedule_entry_count - self.event_cursor) + * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + ), + ) + self.next_principal_redemption = self._recalculate_annuity_payment( + entry + ) + else: + self.next_principal_redemption = entry.next_principal_redemption + self.event_cursor += UInt64(1) + self._emit_execution_event( + entry=entry, + payoff=UInt64(0), + settled_amount=UInt64(0), + ) + + ############################################################################ + # Execution Events + ############################################################################ + + def _emit_execution_event( + self, + *, + entry: typ.ExecutionScheduleEntry, + payoff: UInt64, + settled_amount: UInt64, + ) -> None: + """Emit a non-normative ARC-28 receipt for one applied schedule entry.""" + arc4.emit( + ExecutionEvent( + contract_id=Global.current_application_id.id, + event_id=entry.event_id, + event_type=entry.event_type, + scheduled_time=entry.scheduled_time, + applied_at=Global.latest_timestamp, + payoff=payoff, + payoff_sign=arc4.UInt8( + self._payoff_sign(entry.event_type.as_uint64(), payoff) + ), + settled_amount=settled_amount, + currency_id=self.settlement_asset_id, + sequence=entry.event_id + UInt64(1), + ) + ) + + ############################################################################ + # Others + ############################################################################ + + def _available_settlement_funds(self) -> UInt64: + """Return the app's free settlement balance after reserved cashflows.""" + balance = self.settlement_asset_id.balance(Global.current_application_address) + reserved_total = self._reserved_total() + assert balance >= reserved_total, err.NOT_ENOUGH_FUNDS + return balance - reserved_total + + def _clamp_rate(self, rate: UInt64) -> UInt64: + """Apply optional floor and cap terms to a normalized rate.""" + if self.has_rate_reset_floor and rate < self.rate_reset_floor: + rate = self.rate_reset_floor + if self.has_rate_reset_cap and rate > self.rate_reset_cap: + rate = self.rate_reset_cap + return rate + + def _payoff_sign(self, event_type: UInt64, payoff: UInt64) -> UInt64: + """Resolve the contractual payoff sign from cashflow direction alone.""" + if payoff == UInt64(0): + return UInt64(enums.PAYOFF_SIGN_POSITIVE) + if event_type in (UInt64(enums.EVT_IED), UInt64(enums.EVT_PI)): + return UInt64(enums.PAYOFF_SIGN_POSITIVE) + return UInt64(enums.PAYOFF_SIGN_NEGATIVE) + + def _assert_no_due_event_pending(self) -> None: + """ + Require there to be no due schedule entry at the current cursor. + + Transfers settle holders against the current global indices. Allowing a + transfer while a due event is still unapplied would let positions move + before the shared contract state catches up. + """ + if self.event_cursor >= self.schedule_entry_count: + return + next_entry = self._get_schedule_entry(self.event_cursor) + assert ( + next_entry.scheduled_time > Global.latest_timestamp + ), err.PENDING_ACTUS_EVENT + + ############################################################################ + # Contract Configuration + ############################################################################ + + def _assert_denomination_asset(self, denomination_asset_id: Asset) -> None: + # The reference implementation has on-chain denomination with ASA + _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) + assert exists, err.INVALID_DENOMINATION + + def _set_denomination_asset(self, denomination_asset_id: Asset) -> None: + self.denomination_asset_id = denomination_asset_id + + def _assert_settlement_asset(self, settlement_asset_id: Asset) -> None: + # The reference implementation settlement asset is the denomination asset + assert ( + settlement_asset_id == self.denomination_asset_id + ), err.INVALID_SETTLEMENT_ASSET + + def _set_settlement_asset(self, settlement_asset_id: Asset) -> None: + self.settlement_asset_id = settlement_asset_id + # The reference implementation has on-chain settlement with ASA + itxn.AssetTransfer( + xfer_asset=self.settlement_asset_id, + asset_receiver=Global.current_application_address, + asset_amount=0, + fee=Global.min_txn_fee, + ).submit() + + def _store_contract_config( + self, + contract_type: UInt64, + terms: typ.NormalizedActusTerms, + initial_state: typ.InitialKernelState, + ) -> None: + """Persist normalized terms and initial kernel state once.""" + + self._validate_terms_for_contract_type(contract_type, terms) + assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED + assert self.initial_exchange_amount == UInt64(0), err.ALREADY_CONFIGURED + + # Set Denomination Asset + self._assert_denomination_asset(terms.denomination_asset_id) + self._set_denomination_asset(terms.denomination_asset_id) + + # Set Settlement Asset + self._assert_settlement_asset(terms.settlement_asset_id) + self._set_settlement_asset(terms.settlement_asset_id) + + # Units + self.total_units = terms.total_units + self.reserved_units_total = UInt64(0) + + # Day-Count Conventions + self.day_count_convention = terms.day_count_convention.as_uint64() + + # Time + self.initial_exchange_date = terms.initial_exchange_date + self.maturity_date = terms.maturity_date + self.next_principal_redemption = initial_state.next_principal_redemption + + # Principal + self.initial_exchange_amount = terms.initial_exchange_amount + self.dynamic_principal_redemption = terms.dynamic_principal_redemption + self.outstanding_principal = initial_state.outstanding_principal + + # Interest + self.accrued_interest = initial_state.accrued_interest + + # Interest Rate + self.nominal_interest_rate = initial_state.nominal_interest_rate + self.interest_calculation_base = initial_state.interest_calculation_base + self.rate_reset_spread = terms.rate_reset_spread + self.rate_reset_multiplier = terms.rate_reset_multiplier + self.rate_reset_floor = terms.rate_reset_floor + self.rate_reset_cap = terms.rate_reset_cap + self.rate_reset_next = terms.rate_reset_next + self.has_rate_reset_floor = terms.has_rate_reset_floor + self.has_rate_reset_cap = terms.has_rate_reset_cap + + # Scaling + self.fixed_point_scale = terms.fixed_point_scale + + # Schedule Processing + self.event_cursor = initial_state.event_cursor + + # Per-Unit Fixed-Point Indexes + self.cumulative_interest_index = initial_state.cumulative_interest_index + self.cumulative_principal_index = initial_state.cumulative_principal_index + + # Reserved Amount (for executed cashflows) + self.reserved_interest = UInt64(0) + self.reserved_principal = UInt64(0) + + assert terms.initial_exchange_date > Global.latest_timestamp, err.INVALID_IED + assert terms.initial_exchange_date > initial_state.status_date, err.INVALID_IED + assert terms.initial_exchange_date < terms.maturity_date, err.INVALID_IED + + ############################################################################ + # Update Schedule + ############################################################################ + + def _store_contract_schedule_page( + self, + *, + contract_type: UInt64, + schedule_page_index: UInt64, + is_last_page: bool, + schedule_page: typ.ExecutionSchedulePage, + ) -> None: + """Validate and persist one normalized schedule page.""" + + assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED + assert schedule_page.length <= UInt64( + cst.SCHEDULE_PAGE_SIZE + ), err.INVALID_SCHEDULE_PAGE + assert self.initial_exchange_amount > UInt64(0), err.TERMS_NOT_CONFIGURED + + page_cursor = schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length = schedule_page.length + # Validation cost grows with page length, so configuration explicitly + # buys extra opcode budget for larger uploads. + ensure_budget( + required_budget=( + UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) + + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) + ), + ) + index = UInt64(0) + while index < page_length: + entry = schedule_page[index].copy() + entry_event_type = entry.event_type.as_uint64() + assert entry.event_id == page_cursor + index, err.INVALID_EVENT_ID + self._assert_event_allowed_for_contract_type( + contract_type, entry_event_type + ) + assert entry.scheduled_time > UInt64(0), err.INVALID_ACTUS_CONFIG + if entry.event_id > UInt64(0): + if index > UInt64(0): + previous_entry = schedule_page[index - UInt64(1)].copy() + else: + # The first entry of a page must still be ordered after the + # last entry of the previous page. + assert schedule_page_index > UInt64(0), err.INVALID_EVENT_ID + previous_page_index = schedule_page_index - UInt64(1) + assert ( + previous_page_index in self.schedule_page + ), err.INVALID_SCHEDULE_PAGE + previous_page = self.schedule_page[previous_page_index].copy() + assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE + previous_entry = previous_page[ + previous_page.length - UInt64(1) + ].copy() + assert ( + previous_entry.scheduled_time <= entry.scheduled_time + ), err.INVALID_SORTING + if entry.event_id == UInt64(0): + assert entry_event_type == UInt64( + enums.EVT_IED + ), err.INVALID_ACTUS_CONFIG + index += UInt64(1) + + self._store_schedule_page(schedule_page_index, schedule_page) + if is_last_page: + self.schedule_entry_count = ( + schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length + ) + self.status = UInt64(enums.STATUS_PENDING_IED) + + def _append_observed_event(self, payload: typ.ObservedEventRequest) -> None: + """ + Append an authorized observed event to the schedule tail. + + Observed events are runtime schedule entries supplied by an authorized + caller. Supported only for CLM contracts. + """ + assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED + assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID + self._assert_event_allowed_for_contract_type( + self.contract_type, payload.event_type.as_uint64() + ) + + page_index = self._schedule_page_index(self.schedule_entry_count) + page = typ.ExecutionSchedulePage() + if page_index in self.schedule_page: + page = self.schedule_page[page_index].copy() + assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE + page.append( + typ.ExecutionScheduleEntry( + event_id=payload.event_id, + event_type=payload.event_type, + scheduled_time=payload.scheduled_time, + accrual_factor=payload.accrual_factor, + redemption_accrual_factor=payload.redemption_accrual_factor, + next_nominal_interest_rate=payload.next_nominal_interest_rate, + next_principal_redemption=payload.next_principal_redemption, + next_outstanding_principal=payload.next_outstanding_principal, + flags=payload.flags, + ) + ) + self.schedule_page[page_index] = page.copy() + self.schedule_entry_count += UInt64(1) + + def _append_observed_cash_event( + self, payload: typ.ObservedCashEventRequest + ) -> None: + """ + Append an authorized observed cash event to the schedule tail. + + This v1 path is intentionally narrow: only CLM observed `PR` events may + be appended, and they must preserve the append-only schedule ordering. + """ + assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED + assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID + assert payload.event_type == arc4.UInt8(enums.EVT_PR), err.INVALID_EVENT_TYPE + assert payload.flags & UInt64(enums.FLAG_CASH_EVENT), err.INVALID_ACTUS_CONFIG + + if self.schedule_entry_count > UInt64(0): + previous_entry = self._get_schedule_entry( + self.schedule_entry_count - UInt64(1) + ) + assert ( + previous_entry.scheduled_time <= payload.scheduled_time + ), err.INVALID_SORTING + + page_index = self._schedule_page_index(self.schedule_entry_count) + page = typ.ExecutionSchedulePage() + if page_index in self.schedule_page: + page = self.schedule_page[page_index].copy() + assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE + page.append( + typ.ExecutionScheduleEntry( + event_id=payload.event_id, + event_type=payload.event_type, + scheduled_time=payload.scheduled_time, + accrual_factor=payload.accrual_factor, + redemption_accrual_factor=payload.redemption_accrual_factor, + next_nominal_interest_rate=payload.next_nominal_interest_rate, + next_principal_redemption=payload.next_principal_redemption, + next_outstanding_principal=payload.next_outstanding_principal, + flags=payload.flags, + ) + ) + self.schedule_page[page_index] = page.copy() + self.schedule_entry_count += UInt64(1) + + ############################################################################ + # Public ABI + ############################################################################ + + @arc4.abimethod(create="require") + def contract_create(self, *, arranger: Account) -> typ.TimeStamp: + """ + Create a new D-ASA contract and set the arranger role. + + Args: + arranger: D-ASA arranger address. + + Returns: + UNIX timestamp of contract creation. + + Raises: + None: This method does not raise contract-specific errors. + """ + self.arranger.value = arranger + return Global.latest_timestamp + + @arc4.abimethod + def contract_config( + self, + *, + terms: typ.NormalizedActusTerms, + initial_state: typ.InitialKernelState, + prospectus: typ.Prospectus, + ) -> UInt64: + """ + Partial contract configuration with: normalized ACTUS terms, initial kernel + state (pre-IED), prospectus (informational only). The contract stays inactive + until all schedule pages are configured next. + + Args: + terms: Normalized ACTUS terms. + initial_state: Initial kernel state captured before `IED`. + prospectus: Prospectus metadata stored for reference only. + + Returns: + UNIX timestamp of contract configuration. + + Raises: + UNAUTHORIZED: Caller is not the arranger. + ALREADY_CONFIGURED: Contract configuration was already stored. + INVALID_ACTUS_CONFIG: Normalized terms are incompatible with the kernel. + INVALID_DAY_COUNT_CONVENTION: Day-count identifier is not supported on chain. + INVALID_DENOMINATION: Denomination asset is not valid for this implementation. + INVALID_SETTLEMENT_ASSET: Settlement asset does not match implementation rules. + INVALID_IED: Initial exchange date is not in a valid future position. + """ + self._assert_caller_is_arranger() + + # Configure Contract + self.contract_type = terms.contract_type.as_uint64() + self._assert_supported_contract_type(self.contract_type) + self._store_contract_config(self.contract_type, terms, initial_state) + + # Notarize prospectus (optional) + self.prospectus_hash = prospectus.hash.bytes + self.prospectus_url = prospectus.url + return Global.latest_timestamp + + @arc4.abimethod + def contract_schedule( + self, + *, + schedule_page_index: UInt64, + is_last_page: bool, + schedule_page: typ.ExecutionSchedulePage, + ) -> UInt64: + """ + Upload one normalized schedule page. + + The configuration operation is considered complete only when the last + page is stored. At that point `schedule_entry_count` is finalized and + the contract moves to `STATUS_PENDING_IED`. + + Args: + schedule_page_index: Zero-based page index within the boxed schedule. + is_last_page: Whether this page finalizes the schedule upload. + schedule_page: Normalized schedule entries for the requested page. + + Returns: + UNIX timestamp of the schedule upload. + + Raises: + UNAUTHORIZED: Caller is not the arranger. + ALREADY_CONFIGURED: Schedule upload already finalized or contract is active. + TERMS_NOT_CONFIGURED: Terms were not stored before schedule upload. + INVALID_SCHEDULE_PAGE: Page size or page continuity is invalid. + INVALID_EVENT_ID: Event identifiers do not match the expected page offsets. + INVALID_ACTUS_CONFIG: Event type or entry payload is incompatible with the contract type. + INVALID_SORTING: Schedule entries are not chronologically ordered. + """ + self._assert_caller_is_arranger() + + self._store_contract_schedule_page( + contract_type=self.contract_type, + schedule_page_index=schedule_page_index, + is_last_page=is_last_page, + schedule_page=schedule_page, + ) + return Global.latest_timestamp + + @arc4.abimethod + def contract_execute_ied(self) -> UInt64: + """ + Execute the first due `IED` entry and activate the contract. + + `IED` is the one non-cash event that moves the app from + `STATUS_PENDING_IED` to `STATUS_ACTIVE`. + + Returns: + UNIX timestamp of the `IED` execution. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + UNAUTHORIZED: Caller is not the arranger. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + INVALID_EVENT_CURSOR: Current cursor does not point to the first schedule entry. + INVALID_EVENT_TYPE: Next due event is not `IED`. + NO_DUE_CASHFLOW: The `IED` entry is not yet due. + INVALID_ACTUS_CONFIG: Contract is not in the expected pre-IED state. + PRIMARY_DISTRIBUTION_INCOMPLETE: Not all units were allocated before issuance. + """ + self._assert_configured() + self._assert_caller_is_arranger() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() + + assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR + entry = self._get_schedule_entry(self.event_cursor) + assert entry.event_type == arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE + self._apply_non_cash_schedule_entry( + entry, + typ.ObservedEventRequest( + event_id=entry.event_id, + event_type=entry.event_type, + scheduled_time=entry.scheduled_time, + accrual_factor=entry.accrual_factor, + redemption_accrual_factor=entry.redemption_accrual_factor, + observed_rate=UInt64(0), + next_nominal_interest_rate=entry.next_nominal_interest_rate, + next_principal_redemption=entry.next_principal_redemption, + next_outstanding_principal=entry.next_outstanding_principal, + flags=entry.flags, + ), + ) + return Global.latest_timestamp + + @arc4.abimethod + def apply_non_cash_event( + self, + *, + event_id: UInt64, + payload: typ.ObservedEventRequest, + ) -> UInt64: + """ + Apply the next due non-cash event, optionally appending one first. + + Observed payloads are appended before execution when flagged. Rate reset + events require the interest oracle because they can change the running + nominal rate; other non-cash events stay arranger-controlled. + + Args: + event_id: Expected global schedule event identifier at the current cursor. + payload: Observed payload used for append-on-execute and/or rate resets. + + Returns: + UNIX timestamp of the non-cash event application. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + OBSERVED_EVENT_REQUIRED: Observed-event append is not supported for this contract. + UNAUTHORIZED: Caller is not authorized for the selected non-cash event. + INVALID_EVENT_ID: Observed append payload does not target the schedule tail. + INVALID_EVENT_CURSOR: Requested event is not the next due cursor position. + INVALID_EVENT_TYPE: Requested event is not a supported non-cash event. + INVALID_SCHEDULE_PAGE: Observed append cannot be stored in the tail page. + INVALID_ACTUS_CONFIG: Event payload is incompatible with kernel state. + INVALID_SORTING: Observed append would break schedule ordering. + NO_DUE_CASHFLOW: The targeted non-cash event is not yet due. + PENDING_IED: Initial exchange has not executed yet for post-IED events. + """ + self._assert_configured() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() + + if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): + assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED + self._assert_caller_is_arranger() + self._append_observed_event(payload) + + assert event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + entry = self._get_schedule_entry(event_id) + assert self._event_is_non_cash( + entry.event_type.as_uint64() + ), err.INVALID_EVENT_TYPE + assert entry.event_type != arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE + if self._event_is_rate_reset(entry.event_type.as_uint64()): + self._assert_caller_is_observer() + else: + self._assert_caller_is_arranger() + self._apply_non_cash_schedule_entry(entry, payload) + return Global.latest_timestamp + + @arc4.abimethod + def append_observed_cash_event( + self, + *, + payload: typ.ObservedCashEventRequest, + ) -> UInt64: + """ + Append an arranger-authorized observed cash event to the schedule tail. + + Args: + payload: Observed cash-event payload to append after the current tail. + + Returns: + UNIX timestamp of the append operation. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + UNAUTHORIZED: Caller is not the arranger. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + PENDING_IED: Initial exchange has not executed yet. + OBSERVED_EVENT_REQUIRED: Observed cash events are not supported for this contract. + INVALID_EVENT_ID: Payload event id does not match the schedule tail. + INVALID_EVENT_TYPE: Payload event type is not the supported observed cash type. + INVALID_SCHEDULE_PAGE: Tail page cannot accept another schedule entry. + INVALID_ACTUS_CONFIG: Payload flags or values are inconsistent with the contract. + INVALID_SORTING: Payload time is earlier than the current schedule tail. + """ + self._assert_configured() + self._assert_caller_is_arranger() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() + self._assert_initial_exchange_executed() + + self._append_observed_cash_event(payload) + return Global.latest_timestamp + + @arc4.abimethod(readonly=True) + def contract_get_state(self) -> typ.KernelState: + """ + Return a readonly snapshot of the generic ACTUS kernel state. + + Returns: + Current kernel state snapshot. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + """ + self._assert_configured() + return typ.KernelState( + contract_type=arc4.UInt8(self.contract_type), + status=self.status, + total_units=self.total_units, + reserved_units_total=self.reserved_units_total, + initial_exchange_amount=self.initial_exchange_amount, + event_cursor=self.event_cursor, + schedule_entry_count=self.schedule_entry_count, + outstanding_principal=self.outstanding_principal, + interest_calculation_base=self.interest_calculation_base, + nominal_interest_rate=self.nominal_interest_rate, + accrued_interest=self.accrued_interest, + cumulative_interest_index=self.cumulative_interest_index, + cumulative_principal_index=self.cumulative_principal_index, + reserved_interest=self.reserved_interest, + reserved_principal=self.reserved_principal, + ) + + @arc4.abimethod(readonly=True) + def contract_get_next_due_event(self) -> typ.ExecutionScheduleEntry: + """ + Return the next boxed schedule entry, or a zeroed sentinel if ended. + + Returns: + Next due schedule entry, or an all-zero sentinel if the contract ended. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + """ + self._assert_configured() + if self.event_cursor >= self.schedule_entry_count: + return typ.ExecutionScheduleEntry( + event_id=self.event_cursor, + event_type=arc4.UInt8(0), + scheduled_time=UInt64(0), + accrual_factor=UInt64(0), + redemption_accrual_factor=UInt64(0), + next_nominal_interest_rate=UInt64(0), + next_principal_redemption=UInt64(0), + next_outstanding_principal=UInt64(0), + flags=UInt64(0), + ) + return self._get_schedule_entry(self.event_cursor) diff --git a/modules/core_financial/__init__.py b/modules/core_financial/__init__.py deleted file mode 100644 index 801fc5c3..00000000 --- a/modules/core_financial/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from .common import CoreFinancialCommonMixin -from .coupon import ( - CouponCashflowMixin, - FixedCouponCashflowMixin, - PerpetualCouponCashflowMixin, -) -from .no_coupon import NoCouponCashflowMixin - -__all__ = [ - "CoreFinancialCommonMixin", - "CouponCashflowMixin", - "FixedCouponCashflowMixin", - "NoCouponCashflowMixin", - "PerpetualCouponCashflowMixin", -] diff --git a/modules/core_financial/common.py b/modules/core_financial/common.py deleted file mode 100644 index 230a7064..00000000 --- a/modules/core_financial/common.py +++ /dev/null @@ -1,462 +0,0 @@ -from algopy import ( - Account, - Asset, - Box, - Bytes, - Global, - OpUpFeeSource, - Txn, - UInt64, - arc4, - ensure_budget, - itxn, - op, - urange, -) - -from modules.accounting import AccountingModule -from smart_contracts import abi_types as typ -from smart_contracts import config as cfg -from smart_contracts import constants as cst -from smart_contracts import enums -from smart_contracts import errors as err - - -class CoreFinancialCommonMixin(AccountingModule): - """Common financial core shared by Maturities and Non-Maturities variants.""" - - def __init__(self) -> None: - super().__init__() - - # Asset Configuration - self.denomination_asset_id = Asset() - self.settlement_asset_id = Asset() - self.unit_value = UInt64() - self.day_count_convention = UInt64() - - # Metadata - self.metadata = Bytes() - - # Principal / Rates - self.principal_discount = UInt64() - self.interest_rate = UInt64() - self.total_coupons = UInt64() - - # Time Schedule - self.time_events = Box(typ.TimeEvents, key=cst.BOX_ID_TIME_EVENTS) - self.primary_distribution_opening_date = UInt64() - self.primary_distribution_closure_date = UInt64() - self.issuance_date = UInt64() - self.secondary_market_opening_date = UInt64() - self.secondary_market_closure_date = UInt64() - self.maturity_date = UInt64() - - def assert_denomination_asset(self, denomination_asset_id: Asset) -> None: - # The reference implementation has on-chain denomination with ASA - _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) - assert exists, err.INVALID_DENOMINATION - - def set_denomination_asset(self, denomination_asset_id: Asset) -> None: - self.denomination_asset_id = denomination_asset_id - - def assert_settlement_asset(self, settlement_asset_id: Asset) -> None: - # The reference implementation settlement asset is the denomination asset - assert ( - settlement_asset_id == self.denomination_asset_id - ), err.INVALID_SETTLEMENT_ASSET - - def set_settlement_asset(self, settlement_asset_id: Asset) -> None: - self.settlement_asset_id = settlement_asset_id - # The reference implementation has on-chain settlement with ASA - itxn.AssetTransfer( - xfer_asset=self.settlement_asset_id, - asset_receiver=Global.current_application_address, - asset_amount=0, - fee=Global.min_txn_fee, - ).submit() - - def assert_day_count_convention(self, day_count_convention: UInt64) -> None: - # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - assert day_count_convention in ( - UInt64(cst.DCC_A_A), - UInt64(cst.DCC_CONT), - ), err.INVALID_DAY_COUNT_CONVENTION - - def set_day_count_convention(self, day_count_convention: UInt64) -> None: - self.day_count_convention = day_count_convention - - def assert_interest_rate(self, interest_rate: UInt64) -> None: - # This subroutine must be used after the principal discount has been set - if not self.principal_discount: - assert interest_rate > UInt64(0), err.INVALID_INTEREST_RATE - - def set_interest_rate(self, interest_rate: UInt64) -> None: - self.interest_rate = interest_rate - - def assert_coupon_rates(self, coupon_rates: typ.CouponRates) -> None: - assert not coupon_rates.length, err.INVALID_COUPON_RATES - - def set_coupon_rates(self, coupon_rates: typ.CouponRates) -> None: - self.total_coupons = coupon_rates.length - - def assert_time_schedule_limits(self, time_events: typ.TimeEvents) -> None: - assert ( - time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS - ), err.INVALID_TIME_EVENTS_LENGTH - - def assert_time_events_sorted(self, time_events: typ.TimeEvents) -> None: - assert ( - time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - > Global.latest_timestamp - ), err.INVALID_TIME - for idx in urange(time_events.length - 1): - ensure_budget( - required_budget=UInt64(cfg.OP_UP_TIME_EVENT_SORTING), - fee_source=OpUpFeeSource.AppAccount, - ) - time_i = time_events[idx] - time_f = time_events[idx + 1] - assert time_f > time_i, err.INVALID_SORTING - if self.day_count_convention != UInt64(cst.DCC_CONT): - # The reference implementation requires time periods expressed in days for regular day-count conventions - assert (time_f - time_i) % UInt64( - cst.DAY_2_SEC - ) == 0, err.INVALID_TIME_PERIOD - - def set_time_events(self, time_events: typ.TimeEvents) -> None: - self.time_events.value = time_events.copy() - self.primary_distribution_opening_date = time_events[ - cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - ] - self.primary_distribution_closure_date = time_events[ - cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - ] - self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX] - self.maturity_date = time_events[cfg.MATURITY_DATE_IDX] - - def assert_time_periods(self, time_periods: typ.TimePeriods) -> None: - assert not time_periods.length, err.INVALID_TIME_PERIODS - - def set_time_periods(self, time_periods: typ.TimePeriods) -> None: - pass - - def assert_is_primary_distribution_open(self) -> None: - assert ( - self.status_is_active() - and self.primary_distribution_opening_date - <= Global.latest_timestamp - < self.primary_distribution_closure_date - ), err.PRIMARY_DISTRIBUTION_CLOSED - - def assert_is_secondary_market_open(self) -> None: - assert ( - self.status_is_active() - and self.secondary_market_opening_date <= Global.latest_timestamp - and ( - not self.secondary_market_closure_date - or Global.latest_timestamp < self.secondary_market_closure_date - ) - ), err.SECONDARY_MARKET_CLOSED - - def days_in(self, time_period: UInt64) -> UInt64: - return time_period // UInt64(cst.DAY_2_SEC) - - def assert_asset_transfer_authorization( - self, - sender_holding_address: Account, - receiver_holding_address: Account, - ) -> None: - # The reference implementation grants transfer right to D-ASA owners. Other implementations may relay on other - # roles, external Apps through C2C calls (e.g., an order book), or off-chain transfer agents. - assert Txn.sender == sender_holding_address, err.UNAUTHORIZED - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() - self.assert_valid_holding_address(sender_holding_address) - self.assert_valid_holding_address(receiver_holding_address) - self.assert_is_not_account_suspended(sender_holding_address) - self.assert_is_not_account_suspended(receiver_holding_address) - - def assert_asset_transfer_preconditions( - self, - sender_holding_address: Account, - receiver_holding_address: Account, - units: UInt64, - ) -> None: - self.assert_is_secondary_market_open() - self.assert_asset_transfer_authorization( - sender_holding_address, - receiver_holding_address, - ) - assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER - assert units > 0, err.NULL_TRANSFER - assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER - self.assert_fungible_transfer( - sender_holding_address, - receiver_holding_address, - ) - - def update_supply_after_principal_payment(self, holding_address: Account) -> None: - self.circulating_units -= self.account[holding_address].units - self.account[holding_address].units = UInt64() - self.end_if_no_circulating_units() - - # Hook defaults for feature-specialized mixins. - def count_due_coupons(self) -> UInt64: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def all_due_coupons_paid(self, _due_coupons: UInt64) -> bool: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def assert_pay_principal_authorization(self, _holding_address: Account) -> None: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def _configure_asset_terms( - self, - *, - denomination_asset_id: Asset, - settlement_asset_id: Asset, - principal: UInt64, - principal_discount: UInt64, - minimum_denomination: UInt64, - day_count_convention: arc4.UInt8, - interest_rate: arc4.UInt16, - coupon_rates: typ.CouponRates, - time_events: typ.TimeEvents, - time_periods: typ.TimePeriods, - ) -> None: - self.assert_caller_is_arranger() - assert self.status == enums.STATUS_INACTIVE, err.ALREADY_CONFIGURED - - # Set Denomination Asset - self.assert_denomination_asset(denomination_asset_id) - self.set_denomination_asset(denomination_asset_id) - - # Set Settlement Asset - self.assert_settlement_asset(settlement_asset_id) - self.set_settlement_asset(settlement_asset_id) - - # Set Principal and Minimum Denomination - assert principal % minimum_denomination == 0, err.INVALID_MINIMUM_DENOMINATION - self.unit_value = minimum_denomination - self.total_units = principal // minimum_denomination - self.principal_discount = principal_discount - - # Set Day-Count Convention - self.assert_day_count_convention(day_count_convention.as_uint64()) - self.set_day_count_convention(day_count_convention.as_uint64()) - - # Set Interest Rate - self.assert_interest_rate(interest_rate.as_uint64()) - self.set_interest_rate(interest_rate.as_uint64()) - - # Set Coupons - self.assert_coupon_rates(coupon_rates) - self.set_coupon_rates(coupon_rates) - - # Set Time Events - self.assert_time_schedule_limits(time_events) - self.assert_time_events_sorted(time_events) - self.set_time_events(time_events) - - # Set Time Periods - self.assert_time_periods(time_periods) - self.set_time_periods(time_periods) - - self.status = UInt64(enums.STATUS_ACTIVE) - - @arc4.abimethod(create="require") - def asset_create(self, *, arranger: Account, metadata: typ.AssetMetadata) -> None: - """ - Create a new D-ASA - - Args: - arranger: D-ASA Arranger Address - metadata: D-ASA metadata - """ - self.arranger.value = arranger - self.metadata = metadata.bytes - - @arc4.abimethod(allow_actions=["UpdateApplication"]) - def asset_update(self, *, metadata: typ.AssetMetadata) -> None: - """ - Update D-ASA application. - """ - # The reference implementation grants the update permissions to the Arranger. - # Other implementations may disable D-ASA application updatability or change its authorizations. - # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. - self.assert_caller_is_arranger() - self.metadata = metadata.bytes - - @arc4.abimethod - def set_secondary_time_events( - self, *, secondary_market_time_events: typ.TimeEvents - ) -> typ.SecondaryMarketSchedule: - """ - Set secondary market time schedule - - Args: - secondary_market_time_events: Secondary market time events (strictly ascending order) - - Returns: - Secondary Market Opening Date, Secondary Market Closure Date - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - INVALID_TIME_EVENTS_LENGTH: Time events length is invalid - INVALID_SORTING: Time events are not sorted correctly - INVALID_SECONDARY_OPENING_DATE: Invalid secondary market opening date - INVALID_SECONDARY_CLOSURE_DATE: Invalid secondary market closure date - """ - self.assert_caller_is_arranger() - assert not self.status_is_ended(), err.UNAUTHORIZED - self.assert_is_not_asset_defaulted() - - assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH - if secondary_market_time_events.length > 1: - self.assert_time_events_sorted(secondary_market_time_events) - - assert ( - self.issuance_date - <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - ), err.INVALID_SECONDARY_OPENING_DATE - self.secondary_market_opening_date = secondary_market_time_events[ - cfg.SECONDARY_MARKET_OPENING_DATE_IDX - ] - if self.maturity_date: - assert ( - self.maturity_date - >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - ), err.INVALID_SECONDARY_CLOSURE_DATE - self.secondary_market_closure_date = secondary_market_time_events[ - cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - ] - return typ.SecondaryMarketSchedule( - secondary_market_opening_date=self.secondary_market_opening_date, - secondary_market_closure_date=self.secondary_market_closure_date, - ) - - @arc4.abimethod - def set_default_status(self, *, defaulted: bool) -> UInt64: - """ - Set D-ASA default status - - Args: - defaulted: Default status - - Raises: - UNAUTHORIZED: Not authorized - """ - - self.assert_caller_is_trustee() - self.asset_defaulted = defaulted - return Global.latest_timestamp - - @arc4.abimethod - def primary_distribution( - self, *, holding_address: Account, units: UInt64 - ) -> UInt64: - """ - Distribute D-ASA units to accounts according the primary market - - Args: - holding_address: Account Holding Address - units: Amount of D-ASA units to distribute - - Returns: - Remaining D-ASA units to be distributed - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address - ZERO_UNITS: Cannot distribute zero units - OVER_DISTRIBUTION: Insufficient remaining D-ASA units - PRIMARY_DISTRIBUTION_CLOSED: Primary distribution is closed - """ - self.assert_is_primary_distribution_open() - # The reference implementation grants primary distribution permissions to the Primary Dealer role. Other - # implementations may relay on other roles or external Apps through C2C calls (e.g., an auction). - self.assert_caller_is_primary_dealer() - self.assert_valid_holding_address(holding_address) - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() - assert units > 0, err.ZERO_UNITS - assert self.circulating_units + units <= self.total_units, err.OVER_DISTRIBUTION - - self.circulating_units += units - self.account[holding_address].units += units - self.account[holding_address].unit_value = self.unit_value - return self.total_units - self.circulating_units - - @arc4.abimethod(readonly=True) - def get_asset_info(self) -> typ.AssetInfo: - """ - Get D-ASA info - - Returns: - Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, - Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution - closure date, Issuance date, Maturity date, Suspended, Performance - """ - performance = UInt64(cst.PRF_PERFORMANT) - if Global.latest_timestamp > self.maturity_date > 0: - performance = UInt64(cst.PRF_MATURED) - # The reference implementation has no grace or delinquency periods - if self.asset_defaulted: - performance = UInt64(cst.PRF_DEFAULTED) - - return typ.AssetInfo( - denomination_asset_id=self.denomination_asset_id.id, - settlement_asset_id=self.settlement_asset_id.id, - outstanding_principal=self.outstanding_principal(), - unit_value=self.unit_value, - day_count_convention=arc4.UInt8(self.day_count_convention), - principal_discount=arc4.UInt16(self.principal_discount), - interest_rate=arc4.UInt16(self.interest_rate), - total_supply=self.total_units, - circulating_supply=self.circulating_units, - primary_distribution_opening_date=self.primary_distribution_opening_date, - primary_distribution_closure_date=self.primary_distribution_closure_date, - issuance_date=self.issuance_date, - maturity_date=self.maturity_date, - suspended=self.asset_suspended, - performance=arc4.UInt8(performance), - ) - - @arc4.abimethod(readonly=True) - def get_time_events(self) -> typ.TimeEvents: - """ - Get D-ASA time events - - Returns: - Time events - """ - time_events = typ.TimeEvents() - if self.status_is_active(): - time_events = self.time_events.value.copy() - return time_events - - @arc4.abimethod(readonly=True) - def get_secondary_market_schedule(self) -> typ.TimeEvents: - """ - Get secondary market schedule - - Returns: - Secondary market schedule - """ - return typ.TimeEvents( - (self.secondary_market_opening_date, self.secondary_market_closure_date) - ) - - @arc4.abimethod(readonly=True) - def get_asset_metadata(self) -> typ.AssetMetadata: - """ - Get D-ASA metadata - - Returns: - Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early - repayment penalty type, Prospectus hash, Prospectus URL - """ - return typ.AssetMetadata.from_bytes(self.metadata) diff --git a/modules/core_financial/coupon.py b/modules/core_financial/coupon.py deleted file mode 100644 index 281adca7..00000000 --- a/modules/core_financial/coupon.py +++ /dev/null @@ -1,536 +0,0 @@ -from algopy import ( - Account, - Box, - Global, - OpUpFeeSource, - UInt64, - arc4, - ensure_budget, -) - -from smart_contracts import abi_types as typ -from smart_contracts import config as fixed_cfg -from smart_contracts import constants as cst -from smart_contracts import errors as err - -from .common import CoreFinancialCommonMixin - - -class CouponCashflowMixin(CoreFinancialCommonMixin): - """Coupon cashflow primitives shared by PAM+coupon and PBN+coupon products.""" - - def __init__(self) -> None: - super().__init__() - self.paid_coupon_units = UInt64() - - def all_due_coupons_paid(self, due_coupons: UInt64) -> bool: - return self.paid_coupon_units >= self.circulating_units * due_coupons - - def assert_no_pending_coupon_payment( - self, holding_address: Account, due_coupons: UInt64 - ) -> None: - assert ( - self.account[holding_address].paid_coupons == due_coupons - ), err.PENDING_COUPON_PAYMENT - - def core_prepare_coupon_payment( - self, holding_address: Account - ) -> tuple[UInt64, UInt64]: - assert self.status_is_active(), err.UNAUTHORIZED - self.assert_is_not_asset_defaulted() - self.assert_is_not_asset_suspended() - self.assert_valid_holding_address(holding_address) - - units = self.account[holding_address].units - assert units > 0, err.NO_UNITS - - due_coupons = self.count_due_coupons() - account_paid_coupons = self.account[holding_address].paid_coupons - assert due_coupons > account_paid_coupons, err.NO_DUE_COUPON - # The following conditions verify if other accounts are still waiting for the payment of previous coupons - assert self.all_due_coupons_paid( - account_paid_coupons - ), err.PENDING_COUPON_PAYMENT - - payment_amount = self._compute_coupon_payment_amount( - holding_address, account_paid_coupons - ) - return payment_amount, units - - def core_apply_coupon_payment( - self, holding_address: Account, units: UInt64 - ) -> None: - self.account[holding_address].paid_coupons += 1 - self.paid_coupon_units += units - - def core_prepare_transfer_with_coupon( - self, sender_holding_address: Account, units: UInt64 - ) -> UInt64: - # Transfer is forbidden in case of pending coupon payments - due_coupons = self.count_due_coupons() - self.assert_no_pending_coupon_payment(sender_holding_address, due_coupons) - return self.accrued_interest_amount(sender_holding_address, units, due_coupons) - - def core_prepare_principal_payment(self, holding_address: Account) -> UInt64: - self.assert_pay_principal_authorization(holding_address) - # Principal payment is forbidden in case of pending coupon payments - assert self.all_due_coupons_paid( - self.count_due_coupons() - ), err.PENDING_COUPON_PAYMENT - return self.account_total_units_value(holding_address) - - def core_apply_principal_payment(self, holding_address: Account) -> None: - self.update_supply_after_principal_payment(holding_address) - - def _compute_coupon_payment_amount( - self, _holding_address: Account, _account_paid_coupons: UInt64 - ) -> UInt64: - return UInt64() - - def accrued_interest_amount( - self, _holding_address: Account, _units: UInt64, _due_coupons: UInt64 - ) -> UInt64: - return UInt64() - - -class FixedCouponCashflowMixin(CouponCashflowMixin): - """Coupon cashflow formulas and getters for PAM+coupon (fixed coupon bond).""" - - def __init__(self) -> None: - super().__init__() - self.coupon_rates = Box(typ.CouponRates, key=cst.BOX_ID_COUPON_RATES) - self.due_coupons_watermark = UInt64() - - def assert_coupon_rates(self, coupon_rates: typ.CouponRates) -> None: - assert coupon_rates.length, err.INVALID_COUPON_RATES - - def set_coupon_rates(self, coupon_rates: typ.CouponRates) -> None: - self.total_coupons = coupon_rates.length - self.coupon_rates.value = coupon_rates.copy() - - def count_due_coupons(self) -> UInt64: - current_ts = Global.latest_timestamp - due_coupons = self.due_coupons_watermark - if current_ts >= self.maturity_date: - due_coupons = self.total_coupons - elif current_ts > self.issuance_date: - coupon_idx = ( - UInt64(fixed_cfg.FIRST_COUPON_DATE_IDX) + self.due_coupons_watermark - ) - coupon_due_date = self.time_events.value[coupon_idx] - while current_ts >= coupon_due_date: - ensure_budget( - required_budget=UInt64(fixed_cfg.OP_UP_COUPON_DUE_COUNTING), - fee_source=OpUpFeeSource.GroupCredit, - ) - coupon_idx += 1 - coupon_due_date = self.time_events.value[coupon_idx] - due_coupons = coupon_idx - fixed_cfg.FIRST_COUPON_DATE_IDX - self.due_coupons_watermark = due_coupons - return due_coupons - - def coupon_due_date(self, coupon: UInt64) -> UInt64: - return self.time_events.value[fixed_cfg.FIRST_COUPON_DATE_IDX + coupon - 1] - - def latest_coupon_due_date(self, due_coupons: UInt64) -> UInt64: - coupon_due_date = UInt64() - if due_coupons >= UInt64(1): - coupon_due_date = self.coupon_due_date(due_coupons) - return coupon_due_date - - def next_coupon_due_date(self, due_coupons: UInt64) -> UInt64: - coupon_due_date = UInt64() - if due_coupons < self.total_coupons: - coupon_due_date = self.coupon_due_date(due_coupons + 1) - return coupon_due_date - - def coupon_interest_amount( - self, principal_amount: UInt64, coupon: UInt64 - ) -> UInt64: - coupon_rate_bps = self.coupon_rates.value[coupon - 1].as_uint64() - return principal_amount * coupon_rate_bps // cst.BPS - - def day_count_factor(self, due_coupons: UInt64) -> typ.DayCountFactor: - # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - if not due_coupons: - accruing_start_time = self.issuance_date - else: - accruing_start_time = self.latest_coupon_due_date(due_coupons) - coupon_accrued_period = Global.latest_timestamp - accruing_start_time - coupon_period = self.next_coupon_due_date(due_coupons) - accruing_start_time - if self.day_count_convention == UInt64(cst.DCC_A_A): - coupon_accrued_period = self.days_in(coupon_accrued_period) - coupon_period = self.days_in(coupon_period) - return typ.DayCountFactor( - numerator=coupon_accrued_period, - denominator=coupon_period, - ) - - def is_accruing_interest(self, due_coupons: UInt64) -> bool: - return ( - self.issuance_date != 0 - and Global.latest_timestamp >= self.issuance_date - and due_coupons < self.total_coupons - ) - - def accrued_interest_amount( - self, holding_address: Account, units: UInt64, due_coupons: UInt64 - ) -> UInt64: - # The following assert safeguards the subroutine from forbidden invocations - self.assert_no_pending_coupon_payment(holding_address, due_coupons) - day_count_factor = self.day_count_factor(due_coupons) - coupon_accrued_period = day_count_factor.numerator - coupon_period = day_count_factor.denominator - next_coupon_rate_bps = self.coupon_rates.value[due_coupons].as_uint64() - # due_coupons is equal to the 0-base idx of next coupon - return ( - self.account_units_value(holding_address, units) - * next_coupon_rate_bps - * coupon_accrued_period - // (cst.BPS * coupon_period) - ) # div-by-zero: coupon_period != 0 due to assert_time_events_sorted checks - - def _compute_coupon_payment_amount( - self, holding_address: Account, account_paid_coupons: UInt64 - ) -> UInt64: - return self.coupon_interest_amount( - self.account_total_units_value(holding_address), - account_paid_coupons + 1, - ) - - @arc4.abimethod(readonly=True) - def get_account_units_current_value( - self, *, holding_address: Account, units: UInt64 - ) -> typ.CurrentUnitsValue: - """ - Get account's units current value and accrued interest - - Args: - holding_address: Account Holding Address - units: Account's units for the current value calculation - - Returns: - Units current value in denomination asset, Accrued interest in denomination asset - - Raises: - NO_PRIMARY_DISTRIBUTION: Primary distribution not yet executed - INVALID_HOLDING_ADDRESS: Invalid account holding address - INVALID_UNITS: Invalid amount of units for the account - PENDING_COUPON_PAYMENT: Pending due coupon payment for the account - """ - assert ( - self.primary_distribution_opening_date - and Global.latest_timestamp >= self.primary_distribution_opening_date - ), err.NO_PRIMARY_DISTRIBUTION - self.assert_valid_holding_address(holding_address) - assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - - # Value during primary distribution and at maturity - account_units_nominal_value = self.account_units_value(holding_address, units) - # Accruing interest during primary distribution and at maturity - accrued_interest = UInt64() - numerator = UInt64() - denominator = UInt64() - - # Accruing interest - due_coupons = self.count_due_coupons() - self.assert_no_pending_coupon_payment(holding_address, due_coupons) - if self.is_accruing_interest(due_coupons): - day_count_factor = self.day_count_factor(due_coupons) - accrued_interest = self.accrued_interest_amount( - holding_address, units, due_coupons - ) - numerator = day_count_factor.numerator - denominator = day_count_factor.denominator - - return typ.CurrentUnitsValue( - units_value=account_units_nominal_value, - accrued_interest=accrued_interest, - day_count_factor=typ.DayCountFactor( - numerator=numerator, - denominator=denominator, - ), - ) - - @arc4.abimethod(readonly=True) - def get_coupon_rates(self) -> typ.CouponRates: - """ - Get D-ASA coupon rates - - Returns: - Coupon rates - """ - coupon_rates = typ.CouponRates() - if self.status_is_active(): - coupon_rates = self.coupon_rates.value.copy() - return coupon_rates - - @arc4.abimethod(readonly=True) - def get_payment_amount(self, *, holding_address: Account) -> typ.PaymentAmounts: - """ - Get the next payment amount - - Args: - holding_address: Account Holding Address - - Returns: - Interest amount in denomination asset, Principal amount in denomination asset - - Raises: - INVALID_HOLDING_ADDRESS: Invalid account holding address - """ - self.assert_valid_holding_address(holding_address) - interest_amount = UInt64() - principal_amount = UInt64() - if self.status_is_active(): - paid_coupons = self.account[holding_address].paid_coupons - if paid_coupons < self.total_coupons: - # Coupon Payment - interest_amount = self.coupon_interest_amount( - self.account_total_units_value(holding_address), - paid_coupons + 1, - ) - else: - # Principal Payment - principal_amount = self.account_total_units_value(holding_address) - return typ.PaymentAmounts( - interest=interest_amount, - principal=principal_amount, - ) - - @arc4.abimethod(readonly=True) - def get_coupons_status(self) -> typ.CouponsInfo: - """ - Get D-ASA coupons status - - Returns: - Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, - Day count factor denominator), All due coupons paid - """ - due_coupons = self.count_due_coupons() - next_coupon_due_date = self.next_coupon_due_date(due_coupons) - all_due_coupons_paid = self.all_due_coupons_paid(due_coupons) - numerator = UInt64() - denominator = UInt64() - if self.is_accruing_interest(due_coupons): - day_count_factor = self.day_count_factor(due_coupons) - numerator = day_count_factor.numerator - denominator = day_count_factor.denominator - return typ.CouponsInfo( - total_coupons=self.total_coupons, - due_coupons=due_coupons, - next_coupon_due_date=next_coupon_due_date, - day_count_factor=typ.DayCountFactor( - numerator=numerator, - denominator=denominator, - ), - all_due_coupons_paid=all_due_coupons_paid, - ) - - -class PerpetualCouponCashflowMixin(CouponCashflowMixin): - """Coupon cashflow formulas and getters for PBN+coupon (perpetual bond).""" - - def __init__(self) -> None: - super().__init__() - self.time_periods = Box(typ.TimePeriods, key=cst.BOX_ID_TIME_PERIODS) - self.coupon_period = UInt64() - - def assert_time_periods(self, time_periods: typ.TimePeriods) -> None: - # The perpetual bond defines a single time period for the coupon duration with unlimited repetitions - assert time_periods.length == UInt64(1), err.INVALID_TIME_PERIODS - coupon_period_duration = time_periods[0][0] - repetitions = time_periods[0][1] - assert coupon_period_duration > UInt64(0), err.INVALID_TIME_PERIOD_DURATION - assert repetitions == UInt64(0), err.INVALID_TIME_PERIOD_REPETITIONS - - def set_time_periods(self, time_periods: typ.TimePeriods) -> None: - self.time_periods.value = time_periods.copy() - self.coupon_period = self.time_periods.value[0][0] - - def count_due_coupons(self) -> UInt64: - due_coupons = UInt64(0) - current_ts = Global.latest_timestamp - if current_ts > self.issuance_date: - due_coupons = (current_ts - self.issuance_date) // self.coupon_period - # div-by-zero: coupon_period != 0 due to assert_time_periods checks - return due_coupons - - def coupon_due_date(self, coupon: UInt64) -> UInt64: - return self.issuance_date + coupon * self.coupon_period - - def latest_coupon_due_date(self, due_coupons: UInt64) -> UInt64: - coupon_due_date = UInt64() - if due_coupons >= UInt64(1): - coupon_due_date = self.coupon_due_date(due_coupons) - return coupon_due_date - - def next_coupon_due_date(self, due_coupons: UInt64) -> UInt64: - return self.coupon_due_date(due_coupons + 1) - - def coupon_interest_amount( - self, principal_amount: UInt64, _coupon: UInt64 - ) -> UInt64: - return principal_amount * self.interest_rate // cst.BPS - - def day_count_factor(self, due_coupons: UInt64) -> typ.DayCountFactor: - # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - if not due_coupons: - accruing_start_time = self.issuance_date - else: - accruing_start_time = self.latest_coupon_due_date(due_coupons) - coupon_accrued_period = Global.latest_timestamp - accruing_start_time - coupon_period = self.coupon_period - if self.day_count_convention == UInt64(cst.DCC_A_A): - coupon_accrued_period = self.days_in(coupon_accrued_period) - coupon_period = self.days_in(coupon_period) - return typ.DayCountFactor( - numerator=coupon_accrued_period, - denominator=coupon_period, - ) - - def is_accruing_interest(self, _due_coupons: UInt64) -> bool: - return self.issuance_date != 0 and Global.latest_timestamp > self.issuance_date - - def accrued_interest_amount( - self, holding_address: Account, units: UInt64, due_coupons: UInt64 - ) -> UInt64: - # The following assert safeguards the subroutine from forbidden invocations - self.assert_no_pending_coupon_payment(holding_address, due_coupons) - day_count_factor = self.day_count_factor(due_coupons) - coupon_accrued_period = day_count_factor.numerator - coupon_period = day_count_factor.denominator - return ( - self.account_units_value(holding_address, units) - * self.interest_rate - * coupon_accrued_period - // (cst.BPS * coupon_period) - ) # div-by-zero: coupon_period != 0 due to assert_time_periods checks - - def _compute_coupon_payment_amount( - self, holding_address: Account, _account_paid_coupons: UInt64 - ) -> UInt64: - return self.coupon_interest_amount( - self.account_total_units_value(holding_address), UInt64(1) - ) - - @arc4.abimethod(readonly=True) - def get_account_units_current_value( - self, *, holding_address: Account, units: UInt64 - ) -> typ.CurrentUnitsValue: - """ - Get account's units current value and accrued interest - - Args: - holding_address: Account Holding Address - units: Account's units for the current value calculation - - Returns: - Units current value in denomination asset, Accrued interest in denomination asset - - Raises: - NO_PRIMARY_DISTRIBUTION: Primary distribution not yet executed - INVALID_HOLDING_ADDRESS: Invalid account holding address - INVALID_UNITS: Invalid amount of units for the account - PENDING_COUPON_PAYMENT: Pending due coupon payment for the account - """ - assert ( - self.primary_distribution_opening_date - and Global.latest_timestamp >= self.primary_distribution_opening_date - ), err.NO_PRIMARY_DISTRIBUTION - self.assert_valid_holding_address(holding_address) - assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - - # Value during primary distribution - account_units_nominal_value = self.account_units_value(holding_address, units) - # Accruing interest during primary distribution - accrued_interest = UInt64() - numerator = UInt64() - denominator = UInt64() - - # Accruing interest - due_coupons = self.count_due_coupons() - self.assert_no_pending_coupon_payment(holding_address, due_coupons) - if self.is_accruing_interest(due_coupons): - day_count_factor = self.day_count_factor(due_coupons) - accrued_interest = self.accrued_interest_amount( - holding_address, units, due_coupons - ) - numerator = day_count_factor.numerator - denominator = day_count_factor.denominator - - return typ.CurrentUnitsValue( - units_value=account_units_nominal_value, - accrued_interest=accrued_interest, - day_count_factor=typ.DayCountFactor( - numerator=numerator, - denominator=denominator, - ), - ) - - @arc4.abimethod(readonly=True) - def get_payment_amount(self, *, holding_address: Account) -> typ.PaymentAmounts: - """ - Get the next payment amount - - Args: - holding_address: Account Holding Address - - Returns: - Interest amount in denomination asset, Principal amount in denomination asset - - Raises: - INVALID_HOLDING_ADDRESS: Invalid account holding address - """ - self.assert_valid_holding_address(holding_address) - interest_amount = ( - self.account_total_units_value(holding_address) - * self.interest_rate - // cst.BPS - ) - return typ.PaymentAmounts( - interest=interest_amount, - principal=UInt64(0), - ) - - @arc4.abimethod(readonly=True) - def get_coupons_status(self) -> typ.CouponsInfo: - """ - Get D-ASA coupons status - - Returns: - Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, - Day count factor denominator), All due coupons paid - """ - due_coupons = self.count_due_coupons() if self.status_is_active() else UInt64() - next_coupon_due_date = self.next_coupon_due_date(due_coupons) - all_due_coupons_paid = self.all_due_coupons_paid(due_coupons) - numerator = UInt64() - denominator = UInt64() - if self.is_accruing_interest(due_coupons): - day_count_factor = self.day_count_factor(due_coupons) - numerator = day_count_factor.numerator - denominator = day_count_factor.denominator - return typ.CouponsInfo( - total_coupons=self.total_coupons, - due_coupons=due_coupons, - next_coupon_due_date=next_coupon_due_date, - day_count_factor=typ.DayCountFactor( - numerator=numerator, - denominator=denominator, - ), - all_due_coupons_paid=all_due_coupons_paid, - ) - - @arc4.abimethod(readonly=True) - def get_time_periods(self) -> typ.TimePeriods: - """ - Get D-ASA time periods - - Returns: - Time periods - """ - time_periods = typ.TimePeriods() - if self.status_is_active(): - time_periods = self.time_periods.value.copy() - return time_periods diff --git a/modules/core_financial/no_coupon.py b/modules/core_financial/no_coupon.py deleted file mode 100644 index 3453fb28..00000000 --- a/modules/core_financial/no_coupon.py +++ /dev/null @@ -1,137 +0,0 @@ -from algopy import Account, Global, UInt64, arc4 - -from smart_contracts import abi_types as typ -from smart_contracts import constants as cst -from smart_contracts import errors as err - -from .common import CoreFinancialCommonMixin - - -class NoCouponCashflowMixin(CoreFinancialCommonMixin): - """Cashflow computation for products without coupons.""" - - def assert_interest_rate(self, interest_rate: UInt64) -> None: - # This subroutine must be used after the principal discount has been set - assert interest_rate == UInt64(0), err.INVALID_INTEREST_RATE - - def day_count_factor(self) -> typ.DayCountFactor: - # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - accrued_period = Global.latest_timestamp - self.issuance_date - principal_period = self.maturity_date - self.issuance_date - if self.day_count_convention == UInt64(cst.DCC_A_A): - accrued_period = self.days_in(accrued_period) - principal_period = self.days_in(principal_period) - return typ.DayCountFactor( - numerator=accrued_period, - denominator=principal_period, - ) - - def is_accruing_interest(self) -> bool: - # The check on maturity date ensures D-ASA has been configured as block timestamp cannot be less than 0 (init). - return self.issuance_date <= Global.latest_timestamp < self.maturity_date - - def accrued_interest_amount( - self, holding_address: Account, units: UInt64 - ) -> UInt64: - day_count_factor = self.day_count_factor() - accrued_period = day_count_factor.numerator - principal_period = day_count_factor.denominator - return ( - self.account_units_value(holding_address, units) - * self.principal_discount - * accrued_period - // (cst.BPS * principal_period) - ) # div-by-zero: principal_period != 0 due to assert_time_events_sorted checks - - def core_prepare_transfer_no_coupon( - self, sender_holding_address: Account, units: UInt64 - ) -> UInt64: - return self.accrued_interest_amount(sender_holding_address, units) - - def core_prepare_principal_payment(self, holding_address: Account) -> UInt64: - self.assert_pay_principal_authorization(holding_address) - return self.account_total_units_value(holding_address) - - def core_apply_principal_payment(self, holding_address: Account) -> None: - self.update_supply_after_principal_payment(holding_address) - - @arc4.abimethod(readonly=True) - def get_account_units_current_value( - self, *, holding_address: Account, units: UInt64 - ) -> typ.CurrentUnitsValue: - """ - Get account's units current value and accrued interest - - Args: - holding_address: Account Holding Address - units: Account's units for the current value calculation - - Returns: - Units current value in denomination asset, Accrued interest in denomination asset - - Raises: - NO_PRIMARY_DISTRIBUTION: Primary distribution not yet executed - INVALID_HOLDING_ADDRESS: Invalid account holding address - INVALID_UNITS: Invalid amount of units for the account - """ - assert ( - self.primary_distribution_opening_date - and Global.latest_timestamp >= self.primary_distribution_opening_date - ), err.NO_PRIMARY_DISTRIBUTION - self.assert_valid_holding_address(holding_address) - assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - - account_units_nominal_value = self.account_units_value(holding_address, units) - account_units_discount = ( - account_units_nominal_value * self.principal_discount // cst.BPS - ) - # Value during primary distribution - account_units_current_value = ( - account_units_nominal_value - account_units_discount - ) - - # Accruing interest during primary distribution and at maturity - accrued_interest = UInt64() - numerator = UInt64() - denominator = UInt64() - - # Accruing interest - if self.is_accruing_interest(): - day_count_factor = self.day_count_factor() - accrued_interest = self.accrued_interest_amount(holding_address, units) - numerator = day_count_factor.numerator - denominator = day_count_factor.denominator - - # Value at maturity - if Global.latest_timestamp >= self.maturity_date: - account_units_current_value = account_units_nominal_value - - return typ.CurrentUnitsValue( - units_value=account_units_current_value, - accrued_interest=accrued_interest, - day_count_factor=typ.DayCountFactor( - numerator=numerator, - denominator=denominator, - ), - ) - - @arc4.abimethod(readonly=True) - def get_payment_amount(self, *, holding_address: Account) -> typ.PaymentAmounts: - """ - Get the next payment amount - - Args: - holding_address: Account Holding Address - - Returns: - Interest amount in denomination asset, Principal amount in denomination asset - - Raises: - INVALID_HOLDING_ADDRESS: Invalid account holding address - INVALID_PAYMENT_INDEX: Invalid 1-based payment index - """ - self.assert_valid_holding_address(holding_address) - principal_amount = UInt64() - if self.status_is_active(): - principal_amount = self.account_total_units_value(holding_address) - return typ.PaymentAmounts(interest=UInt64(0), principal=principal_amount) diff --git a/modules/payment_agent.py b/modules/payment_agent.py new file mode 100644 index 00000000..cada6edc --- /dev/null +++ b/modules/payment_agent.py @@ -0,0 +1,162 @@ +from algopy import Account, Bytes, Global, Txn, UInt64, arc4, ensure_budget, itxn + +from smart_contracts import abi_types as typ +from smart_contracts import constants as cst +from smart_contracts import errors as err + +from .accounting import AccountingModule + + +class PaymentAgent(AccountingModule): + """Provide ACTUS cashflow funding and holder withdrawal behavior.""" + + def _assert_payment_authorization(self, holding_address: Account) -> None: + """Require the caller to be allowed to trigger a holder payment.""" + if self.op_daemon.value != Global.zero_address: + assert ( + Txn.sender == self.op_daemon.value + or Txn.sender == holding_address + or Txn.sender == self.account[holding_address].payment_address + ), err.UNAUTHORIZED + + def _is_payment_executable(self, holding_address: Account) -> bool: + """Return whether a holder can currently receive an on-chain asset transfer.""" + return ( + self.account[holding_address].payment_address.is_opted_in( + self.settlement_asset_id + ) + and not self.account[holding_address].suspended + ) + + def _assert_enough_funds(self, payment_amount: UInt64) -> None: + """Require the contract to hold at least the requested settlement amount.""" + assert ( + self.settlement_asset_id.balance(Global.current_application_address) + >= payment_amount + ), err.NOT_ENOUGH_FUNDS + + def _pay(self, receiver: Account, amount: UInt64) -> None: + """Send settlement ASA from the app account to a receiver.""" + itxn.AssetTransfer( + xfer_asset=self.settlement_asset_id, + asset_receiver=receiver, + asset_amount=amount, + fee=Global.min_txn_fee, + ).submit() + + @arc4.abimethod + def fund_due_cashflows(self, *, max_event_count: UInt64) -> typ.CashFundingResult: + """ + Reserve due ACTUS cash events into the escrow-style claim ledger. + + Args: + max_event_count: Maximum number of due cash events to process in this call. + + Returns: + Funding result with reserved interest, reserved principal, and event count. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + UNAUTHORIZED: Caller is not the arranger. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + PENDING_IED: Initial exchange has not executed yet. + NO_DUE_CASHFLOW: No due cash event is currently available for funding. + NOT_ENOUGH_FUNDS: Contract account does not hold enough free settlement funds. + """ + self._assert_configured() + self._assert_caller_is_arranger() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() + self._assert_initial_exchange_executed() + if self._is_dynamic_annuity(): + ensure_budget( + required_budget=( + UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET) + + max_event_count + * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + ), + ) + + processed_events = UInt64(0) + funded_interest = UInt64(0) + funded_principal = UInt64(0) + + while ( + processed_events < max_event_count + and self.event_cursor < self.schedule_entry_count + ): + entry = self._get_schedule_entry(self.event_cursor) + if entry.scheduled_time > Global.latest_timestamp: + break + if not self._event_is_cash(entry.event_type.as_uint64()): + break + + interest_amount, principal_amount = self._apply_cash_entry(entry) + funded_interest += interest_amount + funded_principal += principal_amount + processed_events += UInt64(1) + + assert processed_events > UInt64(0), err.NO_DUE_CASHFLOW + return typ.CashFundingResult( + funded_interest=funded_interest, + funded_principal=funded_principal, + total_funded=funded_interest + funded_principal, + processed_events=processed_events, + timestamp=Global.latest_timestamp, + ) + + @arc4.abimethod + def claim_due_cashflows( + self, + *, + holding_address: Account, + payment_info: Bytes, + ) -> typ.CashClaimResult: + """ + Withdraw the holder's already funded ACTUS cash entitlements. + + Args: + holding_address: Holder whose position should be settled and claimed. + payment_info: Opaque settlement context returned in the result. + + Returns: + Claim result with realized interest, principal, and passthrough context. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + INVALID_HOLDING_ADDRESS: Holding address has no opened account. + UNAUTHORIZED: Caller is not authorized to trigger the claim. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset operations are suspended. + PENDING_IED: Initial exchange has not executed yet. + NO_DUE_CASHFLOW: The account has no claimable funded cashflow. + NOT_ENOUGH_FUNDS: Contract account lacks settlement funds for an executable payment. + """ + self._assert_configured() + self._assert_valid_holding_address(holding_address) + self._assert_payment_authorization(holding_address) + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() + self._assert_initial_exchange_executed() + + self._ensure_units_activated(holding_address) + self._settle_position(holding_address) + total_amount = self._claimable_total(holding_address) + assert total_amount > UInt64(0), err.NO_DUE_CASHFLOW + + interest_amount = self.account[holding_address].claimable_interest + principal_amount = self.account[holding_address].claimable_principal + + if self._is_payment_executable(holding_address): + self._assert_enough_funds(total_amount) + self._pay(self.account[holding_address].payment_address, total_amount) + interest_amount, principal_amount = self._reset_claimable(holding_address) + + return typ.CashClaimResult( + interest_amount=interest_amount, + principal_amount=principal_amount, + total_amount=interest_amount + principal_amount, + timestamp=Global.latest_timestamp, + context=payment_info, + ) diff --git a/modules/payment_agent/__init__.py b/modules/payment_agent/__init__.py deleted file mode 100644 index d620a1f6..00000000 --- a/modules/payment_agent/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from .common import PaymentAgentCommonMixin -from .coupon import CouponPaymentAgentMixin -from .no_principal import NoPrincipalPaymentMixin -from .principal import PrincipalPaymentAgentMixin - -__all__ = [ - "CouponPaymentAgentMixin", - "NoPrincipalPaymentMixin", - "PaymentAgentCommonMixin", - "PrincipalPaymentAgentMixin", -] diff --git a/modules/payment_agent/common.py b/modules/payment_agent/common.py deleted file mode 100644 index cd47e1f4..00000000 --- a/modules/payment_agent/common.py +++ /dev/null @@ -1,57 +0,0 @@ -from algopy import Account, Global, Txn, UInt64, itxn, op - -from modules.core_financial.common import ( - CoreFinancialCommonMixin, -) -from smart_contracts import errors as err - - -class PaymentAgentCommonMixin(CoreFinancialCommonMixin): - """Settlement execution helpers used by payment methods.""" - - def assert_payment_authorization(self, holding_address: Account) -> None: - if self.op_daemon.value != Global.zero_address: - assert ( - Txn.sender == self.op_daemon.value - or Txn.sender == holding_address - or Txn.sender == self.account[holding_address].payment_address - ), err.UNAUTHORIZED - - def is_payment_executable(self, holding_address: Account) -> bool: - return ( - self.account[holding_address].payment_address.is_opted_in( - self.settlement_asset_id - ) - and not self.account[holding_address].suspended - ) - - def assert_enough_funds(self, payment_amount: UInt64) -> None: - assert ( - self.settlement_asset_id.balance(Global.current_application_address) - >= payment_amount - ), err.NOT_ENOUGH_FUNDS - - def pay(self, receiver: Account, amount: UInt64) -> None: - itxn.AssetTransfer( - xfer_asset=self.settlement_asset_id, - asset_receiver=receiver, - asset_amount=amount, - fee=Global.min_txn_fee, - ).submit() - - # Hook defaults, implemented by core cashflow mixins. - def core_prepare_coupon_payment( - self, _holding_address: Account - ) -> tuple[UInt64, UInt64]: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def core_apply_coupon_payment( - self, _holding_address: Account, _units: UInt64 - ) -> None: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def core_prepare_principal_payment(self, _holding_address: Account) -> UInt64: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def core_apply_principal_payment(self, _holding_address: Account) -> None: - op.err(err.INVALID_MIXIN_COMPOSITION) diff --git a/modules/payment_agent/coupon.py b/modules/payment_agent/coupon.py deleted file mode 100644 index 0304739f..00000000 --- a/modules/payment_agent/coupon.py +++ /dev/null @@ -1,72 +0,0 @@ -from algopy import Account, Bytes, Global, String, UInt64, arc4 - -from smart_contracts import abi_types as typ -from smart_contracts import enums -from smart_contracts.events import Event - -from .common import PaymentAgentCommonMixin - - -class CouponPaymentAgentMixin(PaymentAgentCommonMixin): - """Executes coupon cashflows computed by the core financial module.""" - - def _emit_ip(self, *, payoff: UInt64) -> None: - """Emit Interest Payment (IP) event.""" - arc4.emit( - Event( - contract_id=Global.current_application_id.id, - type=arc4.UInt8(enums.EVT_TYPE_IP), - type_name=String("IP"), - time=Global.latest_timestamp, - payoff=payoff, - currency_id=self.denomination_asset_id.id, - currency_unit=self.denomination_asset_id.unit_name, - nominal_value=self.circulating_units * self.unit_value, - nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - nominal_accrued=UInt64(0), - ) - ) - - @arc4.abimethod - def pay_coupon( - self, *, holding_address: Account, payment_info: Bytes - ) -> typ.PaymentResult: - """ - Pay due coupon to an account - - Args: - holding_address: Account Holding Address - payment_info: Additional payment information (Optional) - - Returns: - Paid coupon amount in denomination asset, Payment timestamp, Payment context - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address - NO_UNITS: No D-ASA units - NO_DUE_COUPON: No due coupon to pay - PENDING_COUPON_PAYMENT: Pending due coupon payment - """ - payment_amount, units = self.core_prepare_coupon_payment(holding_address) - self.assert_payment_authorization(holding_address) - # The reference implementation does not assert if there is enough liquidity to pay current due coupon to all - - if self.is_payment_executable(holding_address): - # The reference implementation has on-chain payment agent - self.assert_enough_funds(payment_amount) - # The reference implementation has the same asset for denomination and settlement, no conversion needed - self.pay(self.account[holding_address].payment_address, payment_amount) - else: - # Accounts suspended or not opted in at the time of payments must not stall the D-ASA - payment_amount = UInt64() - - self.core_apply_coupon_payment(holding_address, units) - self._emit_ip(payoff=payment_amount) - return typ.PaymentResult( - amount=payment_amount, - timestamp=Global.latest_timestamp, - context=payment_info, # TODO: Add info on failed payment - ) diff --git a/modules/payment_agent/no_principal.py b/modules/payment_agent/no_principal.py deleted file mode 100644 index e2c0f4a3..00000000 --- a/modules/payment_agent/no_principal.py +++ /dev/null @@ -1,9 +0,0 @@ -from modules.core_financial.common import ( - CoreFinancialCommonMixin, -) - - -class NoPrincipalPaymentMixin(CoreFinancialCommonMixin): - """Marker mixin for non-redeemable products (no pay_principal ABI).""" - - pass diff --git a/modules/payment_agent/principal.py b/modules/payment_agent/principal.py deleted file mode 100644 index d1430e8b..00000000 --- a/modules/payment_agent/principal.py +++ /dev/null @@ -1,71 +0,0 @@ -from algopy import Account, Bytes, Global, String, UInt64, arc4 - -from smart_contracts import abi_types as typ -from smart_contracts import enums -from smart_contracts.events import Event - -from .common import PaymentAgentCommonMixin - - -class PrincipalPaymentAgentMixin(PaymentAgentCommonMixin): - """Executes principal cashflows computed by the core financial module.""" - - def _emit_pr(self, *, payoff: UInt64) -> None: - """Emit Principal Redemption (PR) event.""" - arc4.emit( - Event( - contract_id=Global.current_application_id.id, - type=arc4.UInt8(enums.EVT_TYPE_PR), - type_name=String("PR"), - time=Global.latest_timestamp, - payoff=payoff, - currency_id=self.denomination_asset_id.id, - currency_unit=self.denomination_asset_id.unit_name, - nominal_value=self.circulating_units * self.unit_value, - nominal_rate_bps=arc4.UInt16(0), - nominal_accrued=UInt64(0), - ) - ) - - @arc4.abimethod - def pay_principal( - self, *, holding_address: Account, payment_info: Bytes - ) -> typ.PaymentResult: - """ - Pay the outstanding principal to an account - - Args: - holding_address: Account Holding Address - payment_info: Additional payment information (Optional) - - Returns: - Paid principal amount in denomination asset, Payment timestamp, Payment context - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address - NO_UNITS: No D-ASA units - NOT_MATURE: Not mature - """ - payment_amount = self.core_prepare_principal_payment(holding_address) - self.assert_payment_authorization(holding_address) - # The reference implementation does not assert if there is enough liquidity to pay the principal to all - - if self.is_payment_executable(holding_address): - # The reference implementation has on-chain payment agent - self.assert_enough_funds(payment_amount) - # The reference implementation has the same asset for denomination and settlement, no conversion needed - self.pay(self.account[holding_address].payment_address, payment_amount) - else: - # Accounts suspended or not opted in at the time of payments must not stall the D-ASA - payment_amount = UInt64() - - self.core_apply_principal_payment(holding_address) - self._emit_pr(payoff=payment_amount) - return typ.PaymentResult( - amount=payment_amount, - timestamp=Global.latest_timestamp, - context=payment_info, # TODO: Add info on failed payment - ) diff --git a/modules/rbac.py b/modules/rbac.py index 300c23be..df581d4e 100644 --- a/modules/rbac.py +++ b/modules/rbac.py @@ -1,10 +1,7 @@ -# pyright: reportMissingModuleSource=false - from algopy import ( Account, ARC4Contract, BoxMap, - Bytes, Global, GlobalState, Txn, @@ -15,6 +12,7 @@ from smart_contracts import abi_types as typ from smart_contracts import constants as cst +from smart_contracts import enums from smart_contracts import errors as err @@ -31,22 +29,26 @@ def __init__(self) -> None: self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) self.account_manager = BoxMap( - Account, typ.RoleConfig, key_prefix=cst.PREFIX_ID_ACCOUNT_MANAGER + Account, typ.RoleValidity, key_prefix=cst.PREFIX_ID_ACCOUNT_MANAGER ) self.primary_dealer = BoxMap( - Account, typ.RoleConfig, key_prefix=cst.PREFIX_ID_PRIMARY_DEALER + Account, typ.RoleValidity, key_prefix=cst.PREFIX_ID_PRIMARY_DEALER + ) + self.trustee = BoxMap( + Account, typ.RoleValidity, key_prefix=cst.PREFIX_ID_TRUSTEE ) - self.trustee = BoxMap(Account, typ.RoleConfig, key_prefix=cst.PREFIX_ID_TRUSTEE) self.authority = BoxMap( - Account, typ.RoleConfig, key_prefix=cst.PREFIX_ID_AUTHORITY + Account, typ.RoleValidity, key_prefix=cst.PREFIX_ID_AUTHORITY ) - self.interest_oracle = BoxMap( - Account, typ.RoleConfig, key_prefix=cst.PREFIX_ID_INTEREST_ORACLE + self.observer = BoxMap( + Account, typ.RoleValidity, key_prefix=cst.PREFIX_ID_OBSERVER ) - # D-ASA Governance - self.asset_suspended = False - self.asset_defaulted = False + # Contract Governance + self.contract_suspended = False + + # Contract Performance + self.defaulted = False def _is_arranger(self, role_address: Account) -> bool: return role_address == self.arranger.value @@ -61,198 +63,240 @@ def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool <= role_map[role_address].role_validity_end ) - def assert_caller_is_arranger(self) -> None: + def _assert_caller_is_arranger(self) -> None: assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - def assert_caller_is_account_manager(self) -> None: + def _assert_caller_is_account_manager(self) -> None: assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - def assert_caller_is_primary_dealer(self) -> None: + def _assert_caller_is_primary_dealer(self) -> None: assert self._role_is_active(self.primary_dealer, Txn.sender), err.UNAUTHORIZED - def assert_caller_is_trustee(self) -> None: + def _assert_caller_is_trustee(self) -> None: assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED - def assert_caller_is_authority(self) -> None: + def _assert_caller_is_authority(self) -> None: assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - def assert_caller_is_interest_oracle(self) -> None: - assert self._role_is_active(self.interest_oracle, Txn.sender), err.UNAUTHORIZED + def _assert_caller_is_observer(self) -> None: + assert self._role_is_active(self.observer, Txn.sender), err.UNAUTHORIZED - def assert_is_not_asset_defaulted(self) -> None: - assert not self.asset_defaulted, err.DEFAULTED + def _assert_is_not_contract_defaulted(self) -> None: + assert not self.defaulted, err.DEFAULTED - def assert_is_not_asset_suspended(self) -> None: - assert not self.asset_suspended, err.SUSPENDED + def _assert_is_not_contract_suspended(self) -> None: + assert not self.contract_suspended, err.SUSPENDED def _assert_valid_role(self, role_id: UInt64) -> None: assert role_id in ( - UInt64(cst.ROLE_ARRANGER), - UInt64(cst.ROLE_ACCOUNT_MANAGER), - UInt64(cst.ROLE_PRIMARY_DEALER), - UInt64(cst.ROLE_TRUSTEE), - UInt64(cst.ROLE_AUTHORITY), - UInt64(cst.ROLE_INTEREST_ORACLE), + UInt64(enums.ROLE_ARRANGER), + UInt64(enums.ROLE_OP_DAEMON), + UInt64(enums.ROLE_ACCOUNT_MANAGER), + UInt64(enums.ROLE_PRIMARY_DEALER), + UInt64(enums.ROLE_TRUSTEE), + UInt64(enums.ROLE_AUTHORITY), + UInt64(enums.ROLE_OBSERVER), ), err.INVALID_ROLE - def _upsert_role( - self, role_id: UInt64, role_address: Account, config: Bytes + def _set_role( + self, role_id: UInt64, role_address: Account, validity: typ.RoleValidity ) -> None: - if role_id == UInt64(cst.ROLE_ARRANGER): + if role_id == UInt64(enums.ROLE_ARRANGER): self.arranger.value = role_address return - if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): + if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - self.account_manager[role_address] = typ.RoleConfig.from_bytes(config) + self.account_manager[role_address] = validity.copy() return - if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): + if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - self.primary_dealer[role_address] = typ.RoleConfig.from_bytes(config) + self.primary_dealer[role_address] = validity.copy() return - if role_id == UInt64(cst.ROLE_TRUSTEE): + if role_id == UInt64(enums.ROLE_TRUSTEE): assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - self.trustee[role_address] = typ.RoleConfig.from_bytes(config) + self.trustee[role_address] = validity.copy() return - if role_id == UInt64(cst.ROLE_AUTHORITY): + if role_id == UInt64(enums.ROLE_AUTHORITY): assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - self.authority[role_address] = typ.RoleConfig.from_bytes(config) + self.authority[role_address] = validity.copy() return - if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - assert role_address not in self.interest_oracle, err.INVALID_ROLE_ADDRESS - self.interest_oracle[role_address] = typ.RoleConfig.from_bytes(config) + if role_id == UInt64(enums.ROLE_OBSERVER): + assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS + self.observer[role_address] = validity.copy() def _delete_role(self, role_id: UInt64, role_address: Account) -> None: - assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE - if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): + assert role_id != UInt64(enums.ROLE_ARRANGER), err.INVALID_ROLE + if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS del self.account_manager[role_address] return - if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): + if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS del self.primary_dealer[role_address] return - if role_id == UInt64(cst.ROLE_TRUSTEE): + if role_id == UInt64(enums.ROLE_TRUSTEE): assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS del self.trustee[role_address] return - if role_id == UInt64(cst.ROLE_AUTHORITY): + if role_id == UInt64(enums.ROLE_AUTHORITY): assert role_address in self.authority, err.INVALID_ROLE_ADDRESS del self.authority[role_address] return - if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - del self.interest_oracle[role_address] + if role_id == UInt64(enums.ROLE_OBSERVER): + assert role_address in self.observer, err.INVALID_ROLE_ADDRESS + del self.observer[role_address] + + @arc4.abimethod(allow_actions=["UpdateApplication"]) + def contract_update(self) -> None: + """ + Update D-ASA application. + + Returns: + None. + + Raises: + UNAUTHORIZED: Caller is not the arranger. + """ + # The reference implementation grants the update permissions to the Arranger. + # ⚠️ WARNING: Application updates must be executed VERY carefully, as they + # might introduce breaking changes. + self._assert_caller_is_arranger() @arc4.abimethod def rbac_rotate_arranger(self, *, new_arranger: Account) -> UInt64: """ - Rotate the Arranger address + Rotate the arranger address. Args: - new_arranger: New Arranger address + new_arranger: New arranger address. Returns: - Timestamp of the role assignment + UNIX timestamp of the role assignment. + + Raises: + UNAUTHORIZED: Caller is not the current arranger. """ - self.assert_caller_is_arranger() + self._assert_caller_is_arranger() self.arranger.value = new_arranger return Global.latest_timestamp @arc4.abimethod def rbac_set_op_daemon(self, *, address: Account) -> UInt64: """ - Non-Normative: Set the Operation Daemon address + Non-normative helper to set the operation daemon address. Args: - address: Operation Daemon address + address: Operation daemon address. Returns: - Timestamp of the role assignment + UNIX timestamp of the role assignment. + + Raises: + UNAUTHORIZED: Caller is not the arranger. """ - self.assert_caller_is_arranger() + self._assert_caller_is_arranger() self.op_daemon.value = address return Global.latest_timestamp @arc4.abimethod def rbac_assign_role( - self, *, role_id: arc4.UInt8, role_address: Account, config: Bytes + self, *, role_id: arc4.UInt8, role_address: Account, validity: typ.RoleValidity ) -> UInt64: """ - Assign a role to an address + Assign a role to an address. Args: - role_id: Role Identifier - role_address: Account Role Address - config: Role configuration (Optional) + role_id: Role identifier. + role_address: Account role address. + validity: Inclusive validity interval for the assignment. Returns: - Timestamp of the role assignment + UNIX timestamp of the role assignment. Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - INVALID_ROLE: Invalid role identifier - INVALID_ROLE_ADDRESS: Invalid account role address + UNAUTHORIZED: Caller is not the arranger. + DEFAULTED: Asset is defaulted. + INVALID_ROLE: Role identifier is not supported. + INVALID_ROLE_ADDRESS: Address is invalid for the requested role. """ - self.assert_caller_is_arranger() - self.assert_is_not_asset_defaulted() + self._assert_caller_is_arranger() + self._assert_is_not_contract_defaulted() self._assert_valid_role(role_id.as_uint64()) - self._upsert_role(role_id.as_uint64(), role_address, config) + self._set_role(role_id.as_uint64(), role_address, validity) return Global.latest_timestamp @arc4.abimethod def rbac_revoke_role(self, *, role_id: arc4.UInt8, role_address: Account) -> UInt64: """ - Revoke a role from an address + Revoke a role from an address. Args: - role_id: Role Identifier - role_address: Account Role Address + role_id: Role identifier. + role_address: Account role address. Returns: - Timestamp of the role revocation + UNIX timestamp of the role revocation. Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - INVALID_ROLE: Invalid role identifier - INVALID_ROLE_ADDRESS: Invalid account role address + UNAUTHORIZED: Caller is not the arranger. + DEFAULTED: Asset is defaulted. + INVALID_ROLE: Role identifier is not supported. + INVALID_ROLE_ADDRESS: Address is not currently assigned to that role. """ - self.assert_caller_is_arranger() - self.assert_is_not_asset_defaulted() + self._assert_caller_is_arranger() + self._assert_is_not_contract_defaulted() self._assert_valid_role(role_id.as_uint64()) self._delete_role(role_id.as_uint64(), role_address) return Global.latest_timestamp - @arc4.abimethod # TODO: Update specs and add test - def rbac_gov_asset_suspension(self, *, suspended: bool) -> UInt64: + @arc4.abimethod + def rbac_contract_suspension(self, *, suspended: bool) -> UInt64: """ - Set asset suspension status + Set the asset-wide suspension status. Args: - suspended: Suspension status + suspended: Suspension status to apply. Returns: - Timestamp of the set asset suspension status + UNIX timestamp of the suspension update. + + Raises: + UNAUTHORIZED: Caller is not an active authority. + """ + + self._assert_caller_is_authority() + self.contract_suspended = suspended + return Global.latest_timestamp + + @arc4.abimethod + def rbac_contract_default(self, *, defaulted: bool) -> UInt64: + """ + Set D-ASA default status + + Args: + defaulted: Default status Raises: UNAUTHORIZED: Not authorized """ - self.assert_caller_is_authority() - self.asset_suspended = suspended + self._assert_caller_is_trustee() + self.defaulted = defaulted return Global.latest_timestamp @arc4.abimethod(readonly=True) def rbac_get_arranger(self) -> Account: """ - Get Arranger address + Get the arranger address. Returns: - Arranger address + Current arranger address. + + Raises: + None: This method does not raise contract-specific errors. """ return self.arranger.value @@ -261,67 +305,75 @@ def rbac_get_address_roles( self, address: Account ) -> tuple[bool, bool, bool, bool, bool]: """ - Non-normative - Get roles assigned to an address + Non-normative helper to get the active roles assigned to an address. Args: - address: Address to get roles for + address: Address to query. Returns: - Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle) + Roles mask in the order: account manager, primary dealer, trustee, + authority, observer. + + Raises: + None: This method does not raise contract-specific errors. """ return ( self._role_is_active(self.account_manager, address), self._role_is_active(self.primary_dealer, address), self._role_is_active(self.trustee, address), self._role_is_active(self.authority, address), - self._role_is_active(self.interest_oracle, address), + self._role_is_active(self.observer, address), ) @arc4.abimethod(readonly=True) - def rbac_get_role_config( + def rbac_get_role_validity( self, *, role_id: arc4.UInt8, role_address: Account - ) -> typ.RoleConfig: + ) -> typ.RoleValidity: """ - Get role configuration + Get the stored validity interval for a role assignment. Args: - role_id: Role Identifier - role_address: Account Role Address + role_id: Role identifier. + role_address: Account role address. Returns: - Role configuration + Stored role validity interval. + + Raises: + INVALID_ROLE: Role identifier is not supported. + INVALID_ROLE_ADDRESS: Address is not assigned to that role. """ role = role_id.as_uint64() self._assert_valid_role(role) match role: - case UInt64(cst.ROLE_ARRANGER): - return typ.RoleConfig( + case UInt64(enums.ROLE_ARRANGER): + return typ.RoleValidity( role_validity_start=UInt64(0), role_validity_end=UInt64(0) ) - case UInt64(cst.ROLE_ACCOUNT_MANAGER): + case UInt64(enums.ROLE_ACCOUNT_MANAGER): assert self._has_role( self.account_manager, role_address ), err.INVALID_ROLE_ADDRESS return self.account_manager[role_address] - case UInt64(cst.ROLE_PRIMARY_DEALER): + case UInt64(enums.ROLE_PRIMARY_DEALER): assert self._has_role( self.primary_dealer, role_address ), err.INVALID_ROLE_ADDRESS return self.primary_dealer[role_address] - case UInt64(cst.ROLE_TRUSTEE): + case UInt64(enums.ROLE_TRUSTEE): assert self._has_role( self.trustee, role_address ), err.INVALID_ROLE_ADDRESS return self.trustee[role_address] - case UInt64(cst.ROLE_AUTHORITY): + case UInt64(enums.ROLE_AUTHORITY): assert self._has_role( self.authority, role_address ), err.INVALID_ROLE_ADDRESS return self.authority[role_address] - case UInt64(cst.ROLE_INTEREST_ORACLE): + case UInt64(enums.ROLE_OBSERVER): assert self._has_role( - self.interest_oracle, role_address + self.observer, role_address ), err.INVALID_ROLE_ADDRESS - return self.interest_oracle[role_address] + return self.observer[role_address] case _: op.err(err.INVALID_ROLE) diff --git a/modules/transfer_agent.py b/modules/transfer_agent.py new file mode 100644 index 00000000..a8687d79 --- /dev/null +++ b/modules/transfer_agent.py @@ -0,0 +1,154 @@ +from algopy import Account, Global, Txn, UInt64, arc4 + +from smart_contracts import errors as err + +from .accounting import AccountingModule + + +class TransferAgent(AccountingModule): + """Provide primary distribution and secondary transfer mechanics.""" + + def _assert_transfer_is_open(self) -> None: + """Require transfers to happen within the configured secondary market window.""" + if self.transfer_opening_date: + assert ( + self.transfer_opening_date <= Global.latest_timestamp + ), err.CLOSED_TRANSFER + if self.transfer_closure_date: + assert ( + Global.latest_timestamp < self.transfer_closure_date + ), err.CLOSED_TRANSFER + + @arc4.abimethod + def transfer_set_schedule( + self, *, open_date: UInt64, closure_date: UInt64 + ) -> UInt64: + """ + Configure the secondary-market transfer window. + + Args: + open_date: Inclusive UNIX timestamp at which transfers may start. + closure_date: Exclusive UNIX timestamp at which transfers stop. + + Returns: + UNIX timestamp of the schedule update. + + Raises: + UNAUTHORIZED: Caller is not the arranger. + INVALID_SORTING: The opening date is not earlier than the closure date. + """ + self._assert_caller_is_arranger() + assert open_date < closure_date, err.INVALID_SORTING + + self.transfer_opening_date = open_date + self.transfer_closure_date = closure_date + return Global.latest_timestamp + + @arc4.abimethod + def primary_distribution( + self, + *, + holding_address: Account, + units: UInt64, + ) -> UInt64: + """ + Reserve units for a holder before the initial exchange activates issuance. + + Args: + holding_address: Account receiving the reserved units. + units: Number of units to reserve. + + Returns: + Remaining undistributed unit balance. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + UNAUTHORIZED: Caller is not an active primary dealer. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset or account operations are suspended. + PRIMARY_DISTRIBUTION_CLOSED: Issuance is no longer accepting allocations. + INVALID_HOLDING_ADDRESS: Holding address has no opened account. + ZERO_UNITS: Requested distribution amount is zero. + OVER_DISTRIBUTION: Requested units exceed the remaining supply. + """ + self._assert_configured() + self._assert_caller_is_primary_dealer() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() + assert self._status_is_pending_ied(), err.PRIMARY_DISTRIBUTION_CLOSED + self._assert_valid_holding_address(holding_address) + self._assert_is_not_account_suspended(holding_address) + assert units > UInt64(0), err.ZERO_UNITS + assert ( + self.reserved_units_total + units <= self.total_units + ), err.OVER_DISTRIBUTION + if self.initial_exchange_date: + assert ( + Global.latest_timestamp <= self.initial_exchange_date + ), err.PRIMARY_DISTRIBUTION_CLOSED + + self._credit_reserved_units(holding_address, units) + self.reserved_units_total += units + return self.total_units - self.reserved_units_total + + @arc4.abimethod + def transfer( + self, + *, + sender_holding_address: Account, + receiver_holding_address: Account, + units: UInt64, + ) -> UInt64: + """ + Transfer active units after settling both counterparties to the current cursor. + + Returns the number of units moved. The ACTUS kernel no longer persists a + nominal per-unit value on-chain, so transfer results are unit-based. + + Args: + sender_holding_address: Account debited for the transfer. + receiver_holding_address: Account credited for the transfer. + units: Number of active units to move. + + Returns: + Number of units transferred. + + Raises: + NOT_CONFIGURED: Contract terms and schedule are not fully configured. + DEFAULTED: Asset is defaulted. + SUSPENDED: Asset or account operations are suspended. + PENDING_IED: Initial exchange has not executed yet. + CLOSED_TRANSFER: Transfer window is closed. + UNAUTHORIZED: Caller is not the sender holding address. + INVALID_HOLDING_ADDRESS: Sender or receiver account does not exist. + SELF_TRANSFER: Sender and receiver are the same address. + NULL_TRANSFER: Requested transfer amount is zero. + OVER_TRANSFER: Sender does not hold enough active units. + PENDING_ACTUS_EVENT: A due ACTUS event must be processed before transfer. + """ + self._assert_configured() + self._assert_is_not_contract_defaulted() + self._assert_is_not_contract_suspended() + self._assert_initial_exchange_executed() + self._assert_transfer_is_open() + + assert Txn.sender == sender_holding_address, err.UNAUTHORIZED + self._assert_valid_holding_address(sender_holding_address) + self._assert_valid_holding_address(receiver_holding_address) + self._assert_is_not_account_suspended(sender_holding_address) + self._assert_is_not_account_suspended(receiver_holding_address) + assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER + assert units > UInt64(0), err.NULL_TRANSFER + assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER + + self._assert_no_due_event_pending() + self._ensure_units_activated(sender_holding_address) + self._ensure_units_activated(receiver_holding_address) + self._settle_position(sender_holding_address) + self._settle_position(receiver_holding_address) + self._apply_transfer( + sender_holding_address, + receiver_holding_address, + units, + ) + return units diff --git a/modules/transfer_agent/__init__.py b/modules/transfer_agent/__init__.py deleted file mode 100644 index 7158d668..00000000 --- a/modules/transfer_agent/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from .common import TransferAgentCommonMixin -from .coupon import CouponTransferAgentMixin -from .no_coupon import NoCouponTransferAgentMixin - -__all__ = [ - "CouponTransferAgentMixin", - "NoCouponTransferAgentMixin", - "TransferAgentCommonMixin", -] diff --git a/modules/transfer_agent/common.py b/modules/transfer_agent/common.py deleted file mode 100644 index 77988c53..00000000 --- a/modules/transfer_agent/common.py +++ /dev/null @@ -1,21 +0,0 @@ -from algopy import Account, UInt64, op - -from modules.core_financial.common import ( - CoreFinancialCommonMixin, -) -from smart_contracts import errors as err - - -class TransferAgentCommonMixin(CoreFinancialCommonMixin): - """Ownership transfer helpers shared across transfer-agent variants.""" - - # Hook defaults, implemented by core cashflow mixins. - def core_prepare_transfer_no_coupon( - self, _sender_holding_address: Account, _units: UInt64 - ) -> UInt64: - op.err(err.INVALID_MIXIN_COMPOSITION) - - def core_prepare_transfer_with_coupon( - self, _sender_holding_address: Account, _units: UInt64 - ) -> UInt64: - op.err(err.INVALID_MIXIN_COMPOSITION) diff --git a/modules/transfer_agent/coupon.py b/modules/transfer_agent/coupon.py deleted file mode 100644 index e0052faa..00000000 --- a/modules/transfer_agent/coupon.py +++ /dev/null @@ -1,53 +0,0 @@ -from algopy import Account, UInt64, arc4 - -from .common import TransferAgentCommonMixin - - -class CouponTransferAgentMixin(TransferAgentCommonMixin): - """Transfers ownership for products with coupon payment ordering constraints.""" - - @arc4.abimethod - def asset_transfer( - self, - *, - sender_holding_address: Account, - receiver_holding_address: Account, - units: UInt64, - ) -> UInt64: - """ - Transfer D-ASA units between accounts - - Args: - sender_holding_address: Sender Account Holding Address - receiver_holding_address: Receiver Account Holding Address - units: Amount of D-ASA units to transfer - - Returns: - Transferred actualized value in denomination asset - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address - SECONDARY_MARKET_CLOSED: Secondary market is closed - SELF_TRANSFER: Sender and receiver must be different - NULL_TRANSFER: Transfer units must be greater than zero - OVER_TRANSFER: Insufficient sender units to transfer - NON_FUNGIBLE_UNITS: Sender and receiver units are not fungible - PENDING_COUPON_PAYMENT: Pending due coupon payment - """ - self.assert_asset_transfer_preconditions( - sender_holding_address, - receiver_holding_address, - units, - ) - - # Transferred units value (must be computed before the transfer) - sender_unit_value = self.account[sender_holding_address].unit_value - accrued_interest = self.core_prepare_transfer_with_coupon( - sender_holding_address, units - ) - - self.transfer_units(sender_holding_address, receiver_holding_address, units) - return units * sender_unit_value + accrued_interest diff --git a/modules/transfer_agent/no_coupon.py b/modules/transfer_agent/no_coupon.py deleted file mode 100644 index 8b7213c7..00000000 --- a/modules/transfer_agent/no_coupon.py +++ /dev/null @@ -1,52 +0,0 @@ -from algopy import Account, UInt64, arc4 - -from .common import TransferAgentCommonMixin - - -class NoCouponTransferAgentMixin(TransferAgentCommonMixin): - """Transfers ownership for products without coupon gating.""" - - @arc4.abimethod - def asset_transfer( - self, - *, - sender_holding_address: Account, - receiver_holding_address: Account, - units: UInt64, - ) -> UInt64: - """ - Transfer D-ASA units between accounts - - Args: - sender_holding_address: Sender Account Holding Address - receiver_holding_address: Receiver Account Holding Address - units: Amount of D-ASA units to transfer - - Returns: - Transferred actualized value in denomination asset - - Raises: - UNAUTHORIZED: Not authorized - DEFAULTED: Defaulted - SUSPENDED: Suspended operations - INVALID_HOLDING_ADDRESS: Invalid account holding address - SECONDARY_MARKET_CLOSED: Secondary market is closed - SELF_TRANSFER: Sender and receiver must be different - NULL_TRANSFER: Transfer units must be greater than zero - OVER_TRANSFER: Insufficient sender units to transfer - NON_FUNGIBLE_UNITS: Sender and receiver units are not fungible - """ - self.assert_asset_transfer_preconditions( - sender_holding_address, - receiver_holding_address, - units, - ) - - # Transferred units value (must be computed before the transfer) - sender_unit_value = self.account[sender_holding_address].unit_value - accrued_interest = self.core_prepare_transfer_no_coupon( - sender_holding_address, units - ) - - self.transfer_units(sender_holding_address, receiver_holding_address, units) - return units * sender_unit_value + accrued_interest diff --git a/poetry.lock b/poetry.lock index 97f2ea4f..c45e8287 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -205,7 +205,7 @@ version = "3.4.0" description = "API for writing Algorand Python Smart contracts" optional = false python-versions = "<4,>=3.12.0" -groups = ["main"] +groups = ["dev"] files = [ {file = "algorand_python-3.4.0-py3-none-any.whl", hash = "sha256:5cede1c1b2bc7fae237fb3ba251f6a6a919d39de7b8de1f817973d45ced5bdf8"}, ] @@ -216,7 +216,7 @@ version = "4.12.1" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, @@ -228,53 +228,209 @@ idna = ">=2.8" [package.extras] trio = ["trio (>=0.31.0) ; python_version < \"3.10\"", "trio (>=0.32.0) ; python_version >= \"3.10\""] +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +groups = ["notebooks"] +markers = "platform_system == \"Darwin\"" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "argon2-cffi" +version = "25.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741"}, + {file = "argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6dca33a9859abf613e22733131fc9194091c1fa7cb3e131c143056b4856aa47e"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:21378b40e1b8d1655dd5310c84a40fc19a9aa5e6366e835ceb8576bf0fea716d"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d588dec224e2a83edbdc785a5e6f3c6cd736f46bfd4b441bbb5aa1f5085e584"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5acb4e41090d53f17ca1110c3427f0a130f944b896fc8c83973219c97f57b690"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:da0c79c23a63723aa5d782250fbf51b768abca630285262fb5144ba5ae01e520"}, + {file = "argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d"}, +] + +[package.dependencies] +cffi = [ + {version = ">=1.0.1", markers = "python_version < \"3.14\""}, + {version = ">=2.0.0b1", markers = "python_version >= \"3.14\""}, +] + +[[package]] +name = "arrow" +version = "1.4.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205"}, + {file = "arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +tzdata = {version = "*", markers = "python_version >= \"3.9\""} + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2025.2)", "simplejson (==3.*)"] + +[[package]] +name = "asttokens" +version = "3.0.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a"}, + {file = "asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7"}, +] + +[package.extras] +astroid = ["astroid (>=2,<5)"] +test = ["astroid (>=2,<5)", "pytest (<9.0)", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "async-lru" +version = "2.2.0" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.10" +groups = ["notebooks"] +files = [ + {file = "async_lru-2.2.0-py3-none-any.whl", hash = "sha256:e2c1cf731eba202b59c5feedaef14ffd9d02ad0037fcda64938699f2c380eafe"}, + {file = "async_lru-2.2.0.tar.gz", hash = "sha256:80abae2a237dbc6c60861d621619af39f0d920aea306de34cb992c879e01370c"}, +] + [[package]] name = "attrs" version = "25.4.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, ] +[[package]] +name = "babel" +version = "2.18.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35"}, + {file = "babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d"}, +] + +[package.extras] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] + +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.7.0" +groups = ["notebooks"] +files = [ + {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"}, + {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"}, +] + +[package.dependencies] +soupsieve = ">=1.6.1" +typing-extensions = ">=4.0.0" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "black" -version = "26.1.0" +version = "26.3.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "black-26.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ca699710dece84e3ebf6e92ee15f5b8f72870ef984bf944a57a777a48357c168"}, - {file = "black-26.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e8e75dabb6eb83d064b0db46392b25cabb6e784ea624219736e8985a6b3675d"}, - {file = "black-26.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb07665d9a907a1a645ee41a0df8a25ffac8ad9c26cdb557b7b88eeeeec934e0"}, - {file = "black-26.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:7ed300200918147c963c87700ccf9966dceaefbbb7277450a8d646fc5646bf24"}, - {file = "black-26.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:c5b7713daea9bf943f79f8c3b46f361cc5229e0e604dcef6a8bb6d1c37d9df89"}, - {file = "black-26.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3cee1487a9e4c640dc7467aaa543d6c0097c391dc8ac74eb313f2fbf9d7a7cb5"}, - {file = "black-26.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d62d14ca31c92adf561ebb2e5f2741bf8dea28aef6deb400d49cca011d186c68"}, - {file = "black-26.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb1dafbbaa3b1ee8b4550a84425aac8874e5f390200f5502cf3aee4a2acb2f14"}, - {file = "black-26.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:101540cb2a77c680f4f80e628ae98bd2bd8812fb9d72ade4f8995c5ff019e82c"}, - {file = "black-26.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:6f3977a16e347f1b115662be07daa93137259c711e526402aa444d7a88fdc9d4"}, - {file = "black-26.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6eeca41e70b5f5c84f2f913af857cf2ce17410847e1d54642e658e078da6544f"}, - {file = "black-26.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd39eef053e58e60204f2cdf059e2442e2eb08f15989eefe259870f89614c8b6"}, - {file = "black-26.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9459ad0d6cd483eacad4c6566b0f8e42af5e8b583cee917d90ffaa3778420a0a"}, - {file = "black-26.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a19915ec61f3a8746e8b10adbac4a577c6ba9851fa4a9e9fbfbcf319887a5791"}, - {file = "black-26.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:643d27fb5facc167c0b1b59d0315f2674a6e950341aed0fc05cf307d22bf4954"}, - {file = "black-26.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ba1d768fbfb6930fc93b0ecc32a43d8861ded16f47a40f14afa9bb04ab93d304"}, - {file = "black-26.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2b807c240b64609cb0e80d2200a35b23c7df82259f80bef1b2c96eb422b4aac9"}, - {file = "black-26.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1de0f7d01cc894066a1153b738145b194414cc6eeaad8ef4397ac9abacf40f6b"}, - {file = "black-26.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:91a68ae46bf07868963671e4d05611b179c2313301bd756a89ad4e3b3db2325b"}, - {file = "black-26.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:be5e2fe860b9bd9edbf676d5b60a9282994c03fbbd40fe8f5e75d194f96064ca"}, - {file = "black-26.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9dc8c71656a79ca49b8d3e2ce8103210c9481c57798b48deeb3a8bb02db5f115"}, - {file = "black-26.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b22b3810451abe359a964cc88121d57f7bce482b53a066de0f1584988ca36e79"}, - {file = "black-26.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:53c62883b3f999f14e5d30b5a79bd437236658ad45b2f853906c7cbe79de00af"}, - {file = "black-26.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:f016baaadc423dc960cdddf9acae679e71ee02c4c341f78f3179d7e4819c095f"}, - {file = "black-26.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:66912475200b67ef5a0ab665011964bf924745103f51977a78b4fb92a9fc1bf0"}, - {file = "black-26.1.0-py3-none-any.whl", hash = "sha256:1054e8e47ebd686e078c0bb0eaf31e6ce69c966058d122f2c0c950311f9f3ede"}, - {file = "black-26.1.0.tar.gz", hash = "sha256:d294ac3340eef9c9eb5d29288e96dc719ff269a88e27b396340459dd85da4c58"}, + {file = "black-26.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:86a8b5035fce64f5dcd1b794cf8ec4d31fe458cf6ce3986a30deb434df82a1d2"}, + {file = "black-26.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5602bdb96d52d2d0672f24f6ffe5218795736dd34807fd0fd55ccd6bf206168b"}, + {file = "black-26.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c54a4a82e291a1fee5137371ab488866b7c86a3305af4026bdd4dc78642e1ac"}, + {file = "black-26.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:6e131579c243c98f35bce64a7e08e87fb2d610544754675d4a0e73a070a5aa3a"}, + {file = "black-26.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:5ed0ca58586c8d9a487352a96b15272b7fa55d139fc8496b519e78023a8dab0a"}, + {file = "black-26.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:28ef38aee69e4b12fda8dba75e21f9b4f979b490c8ac0baa7cb505369ac9e1ff"}, + {file = "black-26.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bf162ed91a26f1adba8efda0b573bc6924ec1408a52cc6f82cb73ec2b142c"}, + {file = "black-26.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:474c27574d6d7037c1bc875a81d9be0a9a4f9ee95e62800dab3cfaadbf75acd5"}, + {file = "black-26.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e9d0d86df21f2e1677cc4bd090cd0e446278bcbbe49bf3659c308c3e402843e"}, + {file = "black-26.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:9a5e9f45e5d5e1c5b5c29b3bd4265dcc90e8b92cf4534520896ed77f791f4da5"}, + {file = "black-26.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e6f89631eb88a7302d416594a32faeee9fb8fb848290da9d0a5f2903519fc1"}, + {file = "black-26.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f"}, + {file = "black-26.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7"}, + {file = "black-26.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ddb113db38838eb9f043623ba274cfaf7d51d5b0c22ecb30afe58b1bb8322983"}, + {file = "black-26.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:dfdd51fc3e64ea4f35873d1b3fb25326773d55d2329ff8449139ebaad7357efb"}, + {file = "black-26.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:855822d90f884905362f602880ed8b5df1b7e3ee7d0db2502d4388a954cc8c54"}, + {file = "black-26.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f"}, + {file = "black-26.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56"}, + {file = "black-26.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:c7e72339f841b5a237ff14f7d3880ddd0fc7f98a1199e8c4327f9a4f478c1839"}, + {file = "black-26.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc622538b430aa4c8c853f7f63bc582b3b8030fd8c80b70fb5fa5b834e575c2"}, + {file = "black-26.3.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2d6bfaf7fd0993b420bed691f20f9492d53ce9a2bcccea4b797d34e947318a78"}, + {file = "black-26.3.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f89f2ab047c76a9c03f78d0d66ca519e389519902fa27e7a91117ef7611c0568"}, + {file = "black-26.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b07fc0dab849d24a80a29cfab8d8a19187d1c4685d8a5e6385a5ce323c1f015f"}, + {file = "black-26.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:0126ae5b7c09957da2bdbd91a9ba1207453feada9e9fe51992848658c6c8e01c"}, + {file = "black-26.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:92c0ec1f2cc149551a2b7b47efc32c866406b6891b0ee4625e95967c8f4acfb1"}, + {file = "black-26.3.1-py3-none-any.whl", hash = "sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b"}, + {file = "black-26.3.1.tar.gz", hash = "sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07"}, ] [package.dependencies] @@ -284,13 +440,32 @@ mypy-extensions = ">=0.4.3" packaging = ">=22.0" pathspec = ">=1.0.0" platformdirs = ">=2" -pytokens = ">=0.3.0" +pytokens = ">=0.4.0,<0.5.0" [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] +uvloop = ["uvloop (>=0.15.2) ; sys_platform != \"win32\"", "winloop (>=0.5.0) ; sys_platform == \"win32\""] + +[[package]] +name = "bleach" +version = "6.3.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.10" +groups = ["notebooks"] +files = [ + {file = "bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6"}, + {file = "bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22"}, +] + +[package.dependencies] +tinycss2 = {version = ">=1.1.0,<1.5", optional = true, markers = "extra == \"css\""} +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.5)"] [[package]] name = "boolean-py" @@ -360,14 +535,14 @@ ujson = ["ujson (>=5.10.0)"] [[package]] name = "certifi" -version = "2026.1.4" +version = "2026.2.25" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ - {file = "certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c"}, - {file = "certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120"}, + {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, + {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, ] [[package]] @@ -376,8 +551,7 @@ version = "2.0.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] -markers = "platform_python_implementation != \"PyPy\"" +groups = ["main", "dev", "notebooks"] files = [ {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, @@ -464,6 +638,7 @@ files = [ {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] +markers = {main = "platform_python_implementation != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} @@ -482,125 +657,125 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.4" +version = "3.4.5" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ - {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, - {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, - {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4167a621a9a1a986c73777dbc15d4b5eac8ac5c10393374109a343d4013ec765"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f64c6bf8f32f9133b668c7f7a7cbdbc453412bc95ecdbd157f3b1e377a92990"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:568e3c34b58422075a1b49575a6abc616d9751b4d61b23f712e12ebb78fe47b2"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:036c079aa08a6a592b82487f97c60b439428320ed1b2ea0b3912e99d30c77765"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:340810d34ef83af92148e96e3e44cb2d3f910d2bf95e5618a5c467d9f102231d"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cd2d0f0ec9aa977a27731a3209ebbcacebebaf41f902bd453a928bfd281cf7f8"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0b362bcd27819f9c07cbf23db4e0e8cd4b44c5ecd900c2ff907b2b92274a7412"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:77be992288f720306ab4108fe5c74797de327f3248368dfc7e1a916d6ed9e5a2"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:8b78d8a609a4b82c273257ee9d631ded7fac0d875bdcdccc109f3ee8328cfcb1"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ba20bdf69bd127f66d0174d6f2a93e69045e0b4036dc1ca78e091bcc765830c4"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:76a9d0de4d0eab387822e7b35d8f89367dd237c72e82ab42b9f7bf5e15ada00f"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8fff79bf5978c693c9b1a4d71e4a94fddfb5fe744eb062a318e15f4a2f63a550"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c7e84e0c0005e3bdc1a9211cd4e62c78ba80bc37b2365ef4410cd2007a9047f2"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-win32.whl", hash = "sha256:58ad8270cfa5d4bef1bc85bd387217e14ff154d6630e976c6f56f9a040757475"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:02a9d1b01c1e12c27883b0c9349e0bcd9ae92e727ff1a277207e1a262b1cbf05"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-win_arm64.whl", hash = "sha256:039215608ac7b358c4da0191d10fc76868567fbf276d54c14721bdedeb6de064"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:610f72c0ee565dfb8ae1241b666119582fdbfe7c0975c175be719f940e110694"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60d68e820af339df4ae8358c7a2e7596badeb61e544438e489035f9fbf3246a5"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b473fc8dca1c3ad8559985794815f06ca3fc71942c969129070f2c3cdf7281"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d4eb8ac7469b2a5d64b5b8c04f84d8bf3ad340f4514b98523805cbf46e3b3923"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bcb3227c3d9aaf73eaaab1db7ccd80a8995c509ee9941e2aae060ca6e4e5d81"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:75ee9c1cce2911581a70a3c0919d8bccf5b1cbc9b0e5171400ec736b4b569497"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d1401945cb77787dbd3af2446ff2d75912327c4c3a1526ab7955ecf8600687c"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a45e504f5e1be0bd385935a8e1507c442349ca36f511a47057a71c9d1d6ea9e"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e09f671a54ce70b79a1fc1dc6da3072b7ef7251fadb894ed92d9aa8218465a5f"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d01de5e768328646e6a3fa9e562706f8f6641708c115c62588aef2b941a4f88e"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:131716d6786ad5e3dc542f5cc6f397ba3339dc0fb87f87ac30e550e8987756af"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a374cc0b88aa710e8865dc1bd6edb3743c59f27830f0293ab101e4cf3ce9f85"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d31f0d1671e1534e395f9eb84a68e0fb670e1edb1fe819a9d7f564ae3bc4e53f"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-win32.whl", hash = "sha256:cace89841c0599d736d3d74a27bc5821288bb47c5441923277afc6059d7fbcb4"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:f8102ae93c0bc863b1d41ea0f4499c20a83229f52ed870850892df555187154a"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-win_arm64.whl", hash = "sha256:ed98364e1c262cf5f9363c3eca8c2df37024f52a8fa1180a3610014f26eac51c"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed97c282ee4f994ef814042423a529df9497e3c666dca19be1d4cd1129dc7ade"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0294916d6ccf2d069727d65973c3a1ca477d68708db25fd758dd28b0827cff54"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dc57a0baa3eeedd99fafaef7511b5a6ef4581494e8168ee086031744e2679467"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ed1a9a204f317ef879b32f9af507d47e49cd5e7f8e8d5d96358c98373314fc60"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad83b8f9379176c841f8865884f3514d905bcd2a9a3b210eaa446e7d2223e4d"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:a118e2e0b5ae6b0120d5efa5f866e58f2bb826067a646431da4d6a2bdae7950e"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:754f96058e61a5e22e91483f823e07df16416ce76afa4ebf306f8e1d1296d43f"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c300cefd9b0970381a46394902cd18eaf2aa00163f999590ace991989dcd0fc"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c108f8619e504140569ee7de3f97d234f0fbae338a7f9f360455071ef9855a95"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d1028de43596a315e2720a9849ee79007ab742c06ad8b45a50db8cdb7ed4a82a"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:19092dde50335accf365cce21998a1c6dd8eafd42c7b226eb54b2747cdce2fac"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4354e401eb6dab9aed3c7b4030514328a6c748d05e1c3e19175008ca7de84fb1"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a68766a3c58fde7f9aaa22b3786276f62ab2f594efb02d0a1421b6282e852e98"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-win32.whl", hash = "sha256:1827734a5b308b65ac54e86a618de66f935a4f63a8a462ff1e19a6788d6c2262"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:728c6a963dfab66ef865f49286e45239384249672cd598576765acc2a640a636"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:75dfd1afe0b1647449e852f4fb428195a7ed0588947218f7ba929f6538487f02"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ac59c15e3f1465f722607800c68713f9fbc2f672b9eb649fe831da4019ae9b23"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:165c7b21d19365464e8f70e5ce5e12524c58b48c78c1f5a57524603c1ab003f8"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:28269983f25a4da0425743d0d257a2d6921ea7d9b83599d4039486ec5b9f911d"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d27ce22ec453564770d29d03a9506d449efbb9fa13c00842262b2f6801c48cce"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0625665e4ebdddb553ab185de5db7054393af8879fb0c87bd5690d14379d6819"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:c23eb3263356d94858655b3e63f85ac5d50970c6e8febcdde7830209139cc37d"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e6302ca4ae283deb0af68d2fbf467474b8b6aedcd3dab4db187e07f94c109763"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e51ae7d81c825761d941962450f50d041db028b7278e7b08930b4541b3e45cb9"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:597d10dec876923e5c59e48dbd366e852eacb2b806029491d307daea6b917d7c"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5cffde4032a197bd3b42fd0b9509ec60fb70918d6970e4cc773f20fc9180ca67"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2da4eedcb6338e2321e831a0165759c0c620e37f8cd044a263ff67493be8ffb3"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:65a126fb4b070d05340a84fc709dd9e7c75d9b063b610ece8a60197a291d0adf"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7a80a9242963416bd81f99349d5f3fce1843c303bd404f204918b6d75a75fd6"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-win32.whl", hash = "sha256:f1d725b754e967e648046f00c4facc42d414840f5ccc670c5670f59f83693e4f"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-win_amd64.whl", hash = "sha256:e37bd100d2c5d3ba35db9c7c5ba5a9228cbcffe5c4778dc824b164e5257813d7"}, + {file = "charset_normalizer-3.4.5-cp313-cp313-win_arm64.whl", hash = "sha256:93b3b2cc5cf1b8743660ce77a4f45f3f6d1172068207c1defc779a36eea6bb36"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8197abe5ca1ffb7d91e78360f915eef5addff270f8a71c1fc5be24a56f3e4873"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2aecdb364b8a1802afdc7f9327d55dad5366bc97d8502d0f5854e50712dbc5f"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a66aa5022bf81ab4b1bebfb009db4fd68e0c6d4307a1ce5ef6a26e5878dfc9e4"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d77f97e515688bd615c1d1f795d540f32542d514242067adcb8ef532504cb9ee"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01a1ed54b953303ca7e310fafe0fe347aab348bd81834a0bcd602eb538f89d66"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:b2d37d78297b39a9eb9eb92c0f6df98c706467282055419df141389b23f93362"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e71bbb595973622b817c042bd943c3f3667e9c9983ce3d205f973f486fec98a7"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cd966c2559f501c6fd69294d082c2934c8dd4719deb32c22961a5ac6db0df1d"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d5e52d127045d6ae01a1e821acfad2f3a1866c54d0e837828538fabe8d9d1bd6"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:30a2b1a48478c3428d047ed9690d57c23038dac838a87ad624c85c0a78ebeb39"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d8ed79b8f6372ca4254955005830fd61c1ccdd8c0fac6603e2c145c61dd95db6"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:c5af897b45fa606b12464ccbe0014bbf8c09191e0a66aab6aa9d5cf6e77e0c94"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1088345bcc93c58d8d8f3d783eca4a6e7a7752bbff26c3eee7e73c597c191c2e"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-win32.whl", hash = "sha256:ee57b926940ba00bca7ba7041e665cc956e55ef482f851b9b65acb20d867e7a2"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-win_amd64.whl", hash = "sha256:4481e6da1830c8a1cc0b746b47f603b653dadb690bcd851d039ffaefe70533aa"}, + {file = "charset_normalizer-3.4.5-cp314-cp314-win_arm64.whl", hash = "sha256:97ab7787092eb9b50fb47fa04f24c75b768a606af1bcba1957f07f128a7219e4"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e22d1059b951e7ae7c20ef6b06afd10fb95e3c41bf3c4fbc874dba113321c193"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:afca7f78067dd27c2b848f1b234623d26b87529296c6c5652168cc1954f2f3b2"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ec56a2266f32bc06ed3c3e2a8f58417ce02f7e0356edc89786e52db13c593c98"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b970382e4a36bed897c19f310f31d7d13489c11b4f468ddfba42d41cddfb918"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:573ef5814c4b7c0d59a7710aa920eaaaef383bd71626aa420fba27b5cab92e8d"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux_2_31_armv7l.whl", hash = "sha256:50bcbca6603c06a1dcc7b056ed45c37715fb5d2768feb3bcd37d2313c587a5b9"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1f2da5cbb9becfcd607757a169e38fb82aa5fd86fae6653dea716e7b613fe2cf"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc1c64934b8faf7584924143eb9db4770bbdb16659626e1a1a4d9efbcb68d947"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:ae8b03427410731469c4033934cf473426faff3e04b69d2dfb64a4281a3719f8"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b3e71afc578b98512bfe7bdb822dd6bc57d4b0093b4b6e5487c1e96ad4ace242"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:4b8551b6e6531e156db71193771c93bda78ffc4d1e6372517fe58ad3b91e4659"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:65b3c403a5b6b8034b655e7385de4f72b7b244869a22b32d4030b99a60593eca"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8ce11cd4d62d11166f2b441e30ace226c19a3899a7cf0796f668fba49a9fb123"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-win32.whl", hash = "sha256:66dee73039277eb35380d1b82cccc69cc82b13a66f9f4a18da32d573acf02b7c"}, + {file = "charset_normalizer-3.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:d29dd9c016f2078b43d0c357511e87eee5b05108f3dd603423cb389b89813969"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:259cd1ca995ad525f638e131dbcc2353a586564c038fc548a3fe450a91882139"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a28afb04baa55abf26df544e3e5c6534245d3daa5178bc4a8eeb48202060d0e"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ff95a9283de8a457e6b12989de3f9f5193430f375d64297d323a615ea52cbdb3"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:708c7acde173eedd4bfa4028484426ba689d2103b28588c513b9db2cd5ecde9c"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa92ec1102eaff840ccd1021478af176a831f1bccb08e526ce844b7ddda85c22"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:5fea359734b140d0d6741189fea5478c6091b54ffc69d7ce119e0a05637d8c99"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e545b51da9f9af5c67815ca0eb40676c0f016d0b0381c86f20451e35696c5f95"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:30987f4a8ed169983f93e1be8ffeea5214a779e27ed0b059835c7afe96550ad7"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:149ec69866c3d6c2fb6f758dbc014ecb09f30b35a5ca90b6a8a2d4e54e18fdfe"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:530beedcec9b6e027e7a4b6ce26eed36678aa39e17da85e6e03d7bd9e8e9d7c9"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:14498a429321de554b140013142abe7608f9d8ccc04d7baf2ad60498374aefa2"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2820a98460c83663dd8ec015d9ddfd1e4879f12e06bb7d0500f044fb477d2770"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:aa2f963b4da26daf46231d9b9e0e2c9408a751f8f0d0f44d2de56d3caf51d294"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-win32.whl", hash = "sha256:82cc7c2ad42faec8b574351f8bc2a0c049043893853317bd9bb309f5aba6cb5a"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:92263f7eca2f4af326cd20de8d16728d2602f7cfea02e790dcde9d83c365d7cc"}, + {file = "charset_normalizer-3.4.5-cp39-cp39-win_arm64.whl", hash = "sha256:014837af6fabf57121b6254fa8ade10dceabc3528b27b721a64bbc7b8b1d4eb4"}, + {file = "charset_normalizer-3.4.5-py3-none-any.whl", hash = "sha256:9db5e3fcdcee89a78c04dffb3fe33c79f77bd741a624946db2591c81b2fc85b0"}, + {file = "charset_normalizer-3.4.5.tar.gz", hash = "sha256:95adae7b6c42a6c5b5b559b1a99149f090a57128155daeea91732c8d970d8644"}, ] [[package]] @@ -624,12 +799,27 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["dev"] -markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" +groups = ["dev", "notebooks"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", notebooks = "sys_platform == \"win32\""} + +[[package]] +name = "comm" +version = "0.2.3" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417"}, + {file = "comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971"}, +] + +[package.extras] +test = ["pytest"] [[package]] name = "coverage" @@ -775,14 +965,14 @@ xml-validation = ["lxml (>=4,<7)"] [[package]] name = "cyclopts" -version = "4.5.3" +version = "4.9.0" description = "Intuitive, easy CLIs based on type hints." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "cyclopts-4.5.3-py3-none-any.whl", hash = "sha256:50af3085bb15d4a6f2582dd383dad5e4ba6a0d4d4c64ee63326d881a752a6919"}, - {file = "cyclopts-4.5.3.tar.gz", hash = "sha256:35fa70971204c450d9668646a6ca372eb5fa3070fbe8dd51c5b4b31e65198f2d"}, + {file = "cyclopts-4.9.0-py3-none-any.whl", hash = "sha256:583ea4090a040c92f9303bc0da26bca7b681c81bcea34097ace279e1acef22c1"}, + {file = "cyclopts-4.9.0.tar.gz", hash = "sha256:f292868e4be33a3e622d8cf95d89f49222e987b1ccdbf40caf6514e19dd99a63"}, ] [package.dependencies] @@ -800,13 +990,65 @@ toml = ["tomli (>=2.0.0) ; python_version < \"3.11\""] trio = ["trio (>=0.10.0)"] yaml = ["pyyaml (>=6.0.1)"] +[[package]] +name = "debugpy" +version = "1.8.20" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "debugpy-1.8.20-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:157e96ffb7f80b3ad36d808646198c90acb46fdcfd8bb1999838f0b6f2b59c64"}, + {file = "debugpy-1.8.20-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:c1178ae571aff42e61801a38b007af504ec8e05fde1c5c12e5a7efef21009642"}, + {file = "debugpy-1.8.20-cp310-cp310-win32.whl", hash = "sha256:c29dd9d656c0fbd77906a6e6a82ae4881514aa3294b94c903ff99303e789b4a2"}, + {file = "debugpy-1.8.20-cp310-cp310-win_amd64.whl", hash = "sha256:3ca85463f63b5dd0aa7aaa933d97cbc47c174896dcae8431695872969f981893"}, + {file = "debugpy-1.8.20-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:eada6042ad88fa1571b74bd5402ee8b86eded7a8f7b827849761700aff171f1b"}, + {file = "debugpy-1.8.20-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:7de0b7dfeedc504421032afba845ae2a7bcc32ddfb07dae2c3ca5442f821c344"}, + {file = "debugpy-1.8.20-cp311-cp311-win32.whl", hash = "sha256:773e839380cf459caf73cc533ea45ec2737a5cc184cf1b3b796cd4fd98504fec"}, + {file = "debugpy-1.8.20-cp311-cp311-win_amd64.whl", hash = "sha256:1f7650546e0eded1902d0f6af28f787fa1f1dbdbc97ddabaf1cd963a405930cb"}, + {file = "debugpy-1.8.20-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:4ae3135e2089905a916909ef31922b2d733d756f66d87345b3e5e52b7a55f13d"}, + {file = "debugpy-1.8.20-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:88f47850a4284b88bd2bfee1f26132147d5d504e4e86c22485dfa44b97e19b4b"}, + {file = "debugpy-1.8.20-cp312-cp312-win32.whl", hash = "sha256:4057ac68f892064e5f98209ab582abfee3b543fb55d2e87610ddc133a954d390"}, + {file = "debugpy-1.8.20-cp312-cp312-win_amd64.whl", hash = "sha256:a1a8f851e7cf171330679ef6997e9c579ef6dd33c9098458bd9986a0f4ca52e3"}, + {file = "debugpy-1.8.20-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:5dff4bb27027821fdfcc9e8f87309a28988231165147c31730128b1c983e282a"}, + {file = "debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:84562982dd7cf5ebebfdea667ca20a064e096099997b175fe204e86817f64eaf"}, + {file = "debugpy-1.8.20-cp313-cp313-win32.whl", hash = "sha256:da11dea6447b2cadbf8ce2bec59ecea87cc18d2c574980f643f2d2dfe4862393"}, + {file = "debugpy-1.8.20-cp313-cp313-win_amd64.whl", hash = "sha256:eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7"}, + {file = "debugpy-1.8.20-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9c74df62fc064cd5e5eaca1353a3ef5a5d50da5eb8058fcef63106f7bebe6173"}, + {file = "debugpy-1.8.20-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:077a7447589ee9bc1ff0cdf443566d0ecf540ac8aa7333b775ebcb8ce9f4ecad"}, + {file = "debugpy-1.8.20-cp314-cp314-win32.whl", hash = "sha256:352036a99dd35053b37b7803f748efc456076f929c6a895556932eaf2d23b07f"}, + {file = "debugpy-1.8.20-cp314-cp314-win_amd64.whl", hash = "sha256:a98eec61135465b062846112e5ecf2eebb855305acc1dfbae43b72903b8ab5be"}, + {file = "debugpy-1.8.20-cp38-cp38-macosx_15_0_x86_64.whl", hash = "sha256:b773eb026a043e4d9c76265742bc846f2f347da7e27edf7fe97716ea19d6bfc5"}, + {file = "debugpy-1.8.20-cp38-cp38-manylinux_2_34_x86_64.whl", hash = "sha256:20d6e64ea177ab6732bffd3ce8fc6fb8879c60484ce14c3b3fe183b1761459ca"}, + {file = "debugpy-1.8.20-cp38-cp38-win32.whl", hash = "sha256:0dfd9adb4b3c7005e9c33df430bcdd4e4ebba70be533e0066e3a34d210041b66"}, + {file = "debugpy-1.8.20-cp38-cp38-win_amd64.whl", hash = "sha256:60f89411a6c6afb89f18e72e9091c3dfbcfe3edc1066b2043a1f80a3bbb3e11f"}, + {file = "debugpy-1.8.20-cp39-cp39-macosx_15_0_x86_64.whl", hash = "sha256:bff8990f040dacb4c314864da95f7168c5a58a30a66e0eea0fb85e2586a92cd6"}, + {file = "debugpy-1.8.20-cp39-cp39-manylinux_2_34_x86_64.whl", hash = "sha256:70ad9ae09b98ac307b82c16c151d27ee9d68ae007a2e7843ba621b5ce65333b5"}, + {file = "debugpy-1.8.20-cp39-cp39-win32.whl", hash = "sha256:9eeed9f953f9a23850c85d440bf51e3c56ed5d25f8560eeb29add815bd32f7ee"}, + {file = "debugpy-1.8.20-cp39-cp39-win_amd64.whl", hash = "sha256:760813b4fff517c75bfe7923033c107104e76acfef7bda011ffea8736e9a66f8"}, + {file = "debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7"}, + {file = "debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33"}, +] + +[[package]] +name = "decorator" +version = "5.2.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, + {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, +] + [[package]] name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -853,16 +1095,58 @@ files = [ {file = "docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968"}, ] +[[package]] +name = "executing" +version = "2.2.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017"}, + {file = "executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +groups = ["notebooks"] +files = [ + {file = "fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463"}, + {file = "fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + [[package]] name = "filelock" -version = "3.24.3" +version = "3.25.2" description = "A platform independent file lock." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "filelock-3.24.3-py3-none-any.whl", hash = "sha256:426e9a4660391f7f8a810d71b0555bce9008b0a1cc342ab1f6947d37639e002d"}, - {file = "filelock-3.24.3.tar.gz", hash = "sha256:011a5644dc937c22699943ebbfc46e969cdde3e171470a6e40b9533e5a72affa"}, + {file = "filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70"}, + {file = "filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694"}, +] + +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +groups = ["notebooks"] +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, ] [[package]] @@ -1011,7 +1295,7 @@ version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, @@ -1023,7 +1307,7 @@ version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, @@ -1045,7 +1329,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1066,14 +1350,14 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "identify" -version = "2.6.16" +version = "2.6.17" description = "File identification library for Python" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "identify-2.6.16-py2.py3-none-any.whl", hash = "sha256:391ee4d77741d994189522896270b787aed8670389bfd60f326d677d64a6dfb0"}, - {file = "identify-2.6.16.tar.gz", hash = "sha256:846857203b5511bbe94d5a352a48ef2359532bc8f6727b5544077a0dcfb24980"}, + {file = "identify-2.6.17-py2.py3-none-any.whl", hash = "sha256:be5f8412d5ed4b20f2bd41a65f920990bdccaa6a4a18a08f1eefdcd0bdd885f0"}, + {file = "identify-2.6.17.tar.gz", hash = "sha256:f816b0b596b204c9fdf076ded172322f2723cf958d02f9c3587504834c8ff04d"}, ] [package.extras] @@ -1085,7 +1369,7 @@ version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, @@ -1118,6 +1402,442 @@ files = [ {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, ] +[[package]] +name = "ipykernel" +version = "7.2.0" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.10" +groups = ["notebooks"] +files = [ + {file = "ipykernel-7.2.0-py3-none-any.whl", hash = "sha256:3bbd4420d2b3cc105cbdf3756bfc04500b1e52f090a90716851f3916c62e1661"}, + {file = "ipykernel-7.2.0.tar.gz", hash = "sha256:18ed160b6dee2cbb16e5f3575858bc19d8f1fe6046a9a680c708494ce31d909e"}, +] + +[package.dependencies] +appnope = {version = ">=0.1.2", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=8.8.0" +jupyter-core = ">=5.1,<6.0.dev0 || >=6.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = ">=1.4" +packaging = ">=22" +psutil = ">=5.7" +pyzmq = ">=25" +tornado = ">=6.4.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "matplotlib", "pytest-cov", "trio"] +docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx (<8.2.0)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0,<10)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "9.11.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.12" +groups = ["notebooks"] +files = [ + {file = "ipython-9.11.0-py3-none-any.whl", hash = "sha256:6922d5bcf944c6e525a76a0a304451b60a2b6f875e86656d8bc2dfda5d710e19"}, + {file = "ipython-9.11.0.tar.gz", hash = "sha256:2a94bc4406b22ecc7e4cb95b98450f3ea493a76bec8896cda11b78d7752a6667"}, +] + +[package.dependencies] +colorama = {version = ">=0.4.4", markers = "sys_platform == \"win32\""} +decorator = ">=5.1.0" +ipython-pygments-lexers = ">=1.0.0" +jedi = ">=0.18.2" +matplotlib-inline = ">=0.1.6" +pexpect = {version = ">4.6", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt_toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.14.0" +stack_data = ">=0.6.0" +traitlets = ">=5.13.0" + +[package.extras] +all = ["argcomplete (>=3.0)", "ipython[doc,matplotlib,terminal,test,test-extra]", "types-decorator"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[matplotlib,test]", "setuptools (>=80.0)", "sphinx (>=8.0)", "sphinx-rtd-theme (>=0.1.8)", "sphinx_toml (==0.0.4)", "typing_extensions"] +matplotlib = ["matplotlib (>3.9)"] +test = ["packaging (>=23.0.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=1.0.0)", "setuptools (>=80.0)", "testpath (>=0.2)"] +test-extra = ["curio", "ipykernel (>6.30)", "ipython[matplotlib]", "ipython[test]", "jupyter_ai", "nbclient", "nbformat", "numpy (>=2.0)", "pandas (>2.1)", "trio (>=0.22.0)"] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +description = "Defines a variety of Pygments lexers for highlighting IPython code." +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"}, + {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"}, +] + +[package.dependencies] +pygments = "*" + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +groups = ["notebooks"] +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + +[[package]] +name = "jedi" +version = "0.19.2" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +groups = ["notebooks"] +files = [ + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, +] + +[package.dependencies] +parso = ">=0.8.4,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.6" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +groups = ["notebooks"] +files = [ + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "json5" +version = "0.13.0" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = ">=3.8.0" +groups = ["notebooks"] +files = [ + {file = "json5-0.13.0-py3-none-any.whl", hash = "sha256:9a08e1dd65f6a4d4c6fa82d216cf2477349ec2346a38fd70cc11d2557499fbcc"}, + {file = "json5-0.13.0.tar.gz", hash = "sha256:b1edf8d487721c0bf64d83c28e91280781f6e21f4a797d3261c7c828d4c165bf"}, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +groups = ["notebooks"] +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.10" +groups = ["notebooks"] +files = [ + {file = "jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce"}, + {file = "jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +jsonschema-specifications = ">=2023.3.6" +referencing = ">=0.28.4" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rfc3987-syntax = {version = ">=1.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rpds-py = ">=0.25.0" +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=24.6.0", optional = true, markers = "extra == \"format-nongpl\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, + {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-client" +version = "8.8.0" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.10" +groups = ["notebooks"] +files = [ + {file = "jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a"}, + {file = "jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e"}, +] + +[package.dependencies] +jupyter-core = ">=5.1" +python-dateutil = ">=2.8.2" +pyzmq = ">=25.0" +tornado = ">=6.4.1" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +orjson = ["orjson"] +test = ["anyio", "coverage", "ipykernel (>=6.14)", "msgpack", "mypy ; platform_python_implementation != \"PyPy\"", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.6.2)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.10" +groups = ["notebooks"] +files = [ + {file = "jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407"}, + {file = "jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +traitlets = ">=5.3" + +[package.extras] +docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<9)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-events" +version = "0.12.0" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb"}, + {file = "jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b"}, +] + +[package.dependencies] +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} +packaging = "*" +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +referencing = "*" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8)", "sphinxcontrib-spelling"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] + +[[package]] +name = "jupyter-lsp" +version = "2.3.0" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "jupyter_lsp-2.3.0-py3-none-any.whl", hash = "sha256:e914a3cb2addf48b1c7710914771aaf1819d46b2e5a79b0f917b5478ec93f34f"}, + {file = "jupyter_lsp-2.3.0.tar.gz", hash = "sha256:458aa59339dc868fb784d73364f17dbce8836e906cd75fd471a325cba02e0245"}, +] + +[package.dependencies] +jupyter_server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.17.0" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f"}, + {file = "jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = ">=21.1" +jinja2 = ">=3.0.3" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-events = ">=0.11.0" +jupyter-server-terminals = ">=0.4.4" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +packaging = ">=22.0" +prometheus-client = ">=0.9" +pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = ">=1.8.2" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = ">=1.7" + +[package.extras] +docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.4" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "jupyter_server_terminals-0.5.4-py3-none-any.whl", hash = "sha256:55be353fc74a80bc7f3b20e6be50a55a61cd525626f578dcb66a5708e2007d14"}, + {file = "jupyter_server_terminals-0.5.4.tar.gz", hash = "sha256:bbda128ed41d0be9020349f9f1f2a4ab9952a73ed5f5ac9f1419794761fb87f5"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab" +version = "4.5.6" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "jupyterlab-4.5.6-py3-none-any.whl", hash = "sha256:d6b3dac883aa4d9993348e0f8e95b24624f75099aed64eab6a4351a9cdd1e580"}, + {file = "jupyterlab-4.5.6.tar.gz", hash = "sha256:642fe2cfe7f0f5922a8a558ba7a0d246c7bc133b708dfe43f7b3a826d163cf42"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +httpx = ">=0.25.0,<1" +ipykernel = ">=6.5.0,<6.30.0 || >6.30.0" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.28.0,<3" +notebook-shim = ">=0.2" +packaging = "*" +setuptools = ">=41.1.0" +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.11.12)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<8.2.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==6.0.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.3.post1)", "matplotlib (==3.10.0)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.15.1)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] +upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +description = "Pygments theme using JupyterLab CSS variables" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.28.0" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968"}, + {file = "jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c"}, +] + +[package.dependencies] +babel = ">=2.10" +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.18.0" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.31" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "lark" +version = "1.3.1" +description = "a modern parsing library" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12"}, + {file = "lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905"}, +] + +[package.extras] +atomic-cache = ["atomicwrites"] +interegular = ["interegular (>=0.3.1,<0.4.0)"] +nearley = ["js2py"] +regex = ["regex"] + [[package]] name = "librt" version = "0.8.1" @@ -1277,6 +1997,123 @@ profiling = ["gprof2dot"] rtd = ["ipykernel", "jupyter_sphinx", "mdit-py-plugins (>=0.5.0)", "myst-parser", "pyyaml", "sphinx", "sphinx-book-theme (>=1.0,<2.0)", "sphinx-copybutton", "sphinx-design"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "requests"] +[[package]] +name = "markupsafe" +version = "3.0.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, + {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"}, + {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"}, + {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"}, + {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"}, + {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"}, + {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"}, + {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, + {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76"}, + {file = "matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe"}, +] + +[package.dependencies] +traitlets = "*" + +[package.extras] +test = ["flake8", "nbdime", "nbval", "notebook", "pytest"] + [[package]] name = "mdurl" version = "0.1.2" @@ -1289,6 +2126,18 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "mistune" +version = "3.2.0" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1"}, + {file = "mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a"}, +] + [[package]] name = "msgpack" version = "1.1.2" @@ -1590,6 +2439,100 @@ files = [ {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, ] +[[package]] +name = "nbclient" +version = "0.10.4" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.10.0" +groups = ["notebooks"] +files = [ + {file = "nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440"}, + {file = "nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1.3" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.1.0)", "pytest (>=9.0.1,<10)", "pytest-asyncio (>=1.3.0)", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.1.0)", "pytest (>=9.0.1,<10)", "pytest-asyncio (>=1.3.0)", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.17.0" +description = "Convert Jupyter Notebooks (.ipynb files) to other formats." +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "nbconvert-7.17.0-py3-none-any.whl", hash = "sha256:4f99a63b337b9a23504347afdab24a11faa7d86b405e5c8f9881cd313336d518"}, + {file = "nbconvert-7.17.0.tar.gz", hash = "sha256:1b2696f1b5be12309f6c7d707c24af604b87dfaf6d950794c7b07acab96dda78"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = {version = "!=5.0.0", extras = ["css"]} +defusedxml = "*" +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +traitlets = ">=5.1" + +[package.extras] +all = ["flaky", "intersphinx-registry", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (>=5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] +docs = ["intersphinx-registry", "ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (>=5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["pyqtwebengine (>=5.15)"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.10.4" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, +] + +[package.dependencies] +fastjsonschema = ">=2.15" +jsonschema = ">=2.6" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +groups = ["notebooks"] +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + [[package]] name = "networkx" version = "3.6" @@ -1597,6 +2540,7 @@ description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.11" groups = ["dev"] +markers = "python_version >= \"3.14\"" files = [ {file = "networkx-3.6-py3-none-any.whl", hash = "sha256:cdb395b105806062473d3be36458d8f1459a4e4b98e236a66c3a48996e07684f"}, {file = "networkx-3.6.tar.gz", hash = "sha256:285276002ad1f7f7da0f7b42f004bcba70d381e936559166363707fdad3d72ad"}, @@ -1613,6 +2557,30 @@ release = ["build (>=0.10)", "changelist (==0.5)", "twine (>=4.0)", "wheel (>=0. test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"] test-extras = ["pytest-mpl", "pytest-randomly"] +[[package]] +name = "networkx" +version = "3.6.1" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = "!=3.14.1,>=3.11" +groups = ["dev"] +markers = "python_version == \"3.13\"" +files = [ + {file = "networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762"}, + {file = "networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509"}, +] + +[package.extras] +benchmarking = ["asv", "virtualenv"] +default = ["matplotlib (>=3.8)", "numpy (>=1.25)", "pandas (>=2.0)", "scipy (>=1.11.2)"] +developer = ["mypy (>=1.15)", "pre-commit (>=4.1)"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=10)", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8.0)", "sphinx-gallery (>=0.18)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "iplotx (>=0.9.0)", "momepy (>=0.7.2)", "osmnx (>=2.0.0)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] +release = ["build (>=0.10)", "changelist (==0.5)", "twine (>=4.0)", "wheel (>=0.40)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"] +test-extras = ["pytest-mpl", "pytest-randomly"] + [[package]] name = "nodeenv" version = "1.10.0" @@ -1625,6 +2593,24 @@ files = [ {file = "nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb"}, ] +[[package]] +name = "notebook-shim" +version = "0.2.4" +description = "A shim layer for notebook traits and config" +optional = false +python-versions = ">=3.7" +groups = ["notebooks"] +files = [ + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] + [[package]] name = "packageurl-python" version = "0.17.6" @@ -1644,17 +2630,45 @@ sqlalchemy = ["sqlalchemy (>=2.0.0)"] test = ["pytest"] [[package]] -name = "packaging" -version = "24.2" -description = "Core utilities for Python packages" +name = "packaging" +version = "24.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["dev", "notebooks"] +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +description = "Utilities for writing pandoc filters in python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["notebooks"] +files = [ + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, +] + +[[package]] +name = "parso" +version = "0.8.6" +description = "A Python Parser" optional = false -python-versions = ">=3.8" -groups = ["dev"] +python-versions = ">=3.6" +groups = ["notebooks"] files = [ - {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, - {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, + {file = "parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff"}, + {file = "parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd"}, ] +[package.extras] +qa = ["flake8 (==5.0.4)", "types-setuptools (==67.2.0.1)", "zuban (==0.5.1)"] +testing = ["docopt", "pytest"] + [[package]] name = "pathspec" version = "1.0.4" @@ -1673,6 +2687,22 @@ optional = ["typing-extensions (>=4)"] re2 = ["google-re2 (>=1.1)"] tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +groups = ["notebooks"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + [[package]] name = "pip" version = "26.0.1" @@ -1753,14 +2783,14 @@ testing = ["aboutcode-toolkit (>=6.0.0)", "black", "pytest (>=6,!=7.0.0)", "pyte [[package]] name = "platformdirs" -version = "4.9.2" +version = "4.9.4" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ - {file = "platformdirs-4.9.2-py3-none-any.whl", hash = "sha256:9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd"}, - {file = "platformdirs-4.9.2.tar.gz", hash = "sha256:9a33809944b9db043ad67ca0db94b14bf452cc6aeaac46a88ea55b26e2e9d291"}, + {file = "platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868"}, + {file = "platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934"}, ] [[package]] @@ -1798,6 +2828,38 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "prometheus-client" +version = "0.24.1" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "prometheus_client-0.24.1-py3-none-any.whl", hash = "sha256:150db128af71a5c2482b36e588fc8a6b95e498750da4b17065947c16070f4055"}, + {file = "prometheus_client-0.24.1.tar.gz", hash = "sha256:7e0ced7fbbd40f7b84962d5d2ab6f17ef88a72504dcf7c0b40737b43b2a461f9"}, +] + +[package.extras] +aiohttp = ["aiohttp"] +django = ["django"] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"}, + {file = "prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855"}, +] + +[package.dependencies] +wcwidth = "*" + [[package]] name = "propcache" version = "0.4.1" @@ -1930,6 +2992,69 @@ files = [ {file = "propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d"}, ] +[[package]] +name = "psutil" +version = "7.2.2" +description = "Cross-platform lib for process and system monitoring." +optional = false +python-versions = ">=3.6" +groups = ["notebooks"] +files = [ + {file = "psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b"}, + {file = "psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea"}, + {file = "psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63"}, + {file = "psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312"}, + {file = "psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b"}, + {file = "psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9"}, + {file = "psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00"}, + {file = "psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9"}, + {file = "psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a"}, + {file = "psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf"}, + {file = "psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1"}, + {file = "psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841"}, + {file = "psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486"}, + {file = "psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979"}, + {file = "psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9"}, + {file = "psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e"}, + {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8"}, + {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc"}, + {file = "psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988"}, + {file = "psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee"}, + {file = "psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372"}, +] + +[package.extras] +dev = ["abi3audit", "black", "check-manifest", "colorama ; os_name == \"nt\"", "coverage", "packaging", "psleak", "pylint", "pyperf", "pypinfo", "pyreadline3 ; os_name == \"nt\"", "pytest", "pytest-cov", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""] +test = ["psleak", "pytest", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "setuptools", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +groups = ["notebooks"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\" or os_name != \"nt\"" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +groups = ["notebooks"] +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "puyapy" version = "5.7.1" @@ -1994,12 +3119,12 @@ version = "3.0" description = "C parser in Python" optional = false python-versions = ">=3.10" -groups = ["main", "dev"] -markers = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"" +groups = ["main", "dev", "notebooks"] files = [ {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, ] +markers = {main = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"", notebooks = "implementation_name != \"PyPy\""} [[package]] name = "pycryptodomex" @@ -2078,7 +3203,7 @@ version = "2.19.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, @@ -2205,13 +3330,48 @@ termcolor = ">=2.1.0" [package.extras] dev = ["black", "flake8", "pre-commit"] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["notebooks"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-discovery" +version = "1.1.3" +description = "Python interpreter discovery" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "python_discovery-1.1.3-py3-none-any.whl", hash = "sha256:90e795f0121bc84572e737c9aa9966311b9fde44ffb88a5953b3ec9b31c6945e"}, + {file = "python_discovery-1.1.3.tar.gz", hash = "sha256:7acca36e818cd88e9b2ba03e045ad7e93e1713e29c6bbfba5d90202310b7baa5"}, +] + +[package.dependencies] +filelock = ">=3.15.4" +platformdirs = ">=4.3.6,<5" + +[package.extras] +docs = ["furo (>=2025.12.19)", "sphinx (>=9.1)", "sphinx-autodoc-typehints (>=3.6.3)", "sphinxcontrib-mermaid (>=2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.5.4)", "pytest (>=8.3.5)", "pytest-mock (>=3.14)", "setuptools (>=75.1)"] + [[package]] name = "python-dotenv" version = "1.2.2" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["dev"] files = [ {file = "python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a"}, {file = "python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3"}, @@ -2220,6 +3380,21 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "python-json-logger" +version = "4.0.0" +description = "JSON Log Formatter for the Python Logging Package" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2"}, + {file = "python_json_logger-4.0.0.tar.gz", hash = "sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f"}, +] + +[package.extras] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec ; implementation_name != \"pypy\"", "mypy", "orjson ; implementation_name != \"pypy\"", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] + [[package]] name = "pytokens" version = "0.4.1" @@ -2275,13 +3450,40 @@ files = [ [package.extras] dev = ["black", "build", "mypy", "pytest", "pytest-cov", "setuptools", "tox", "twine", "wheel"] +[[package]] +name = "pywinpty" +version = "3.0.3" +description = "Pseudo terminal support for Windows from Python." +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +markers = "os_name == \"nt\"" +files = [ + {file = "pywinpty-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:ff05f12d775b142b11c6fe085129bdd759b61cf7d41da6c745e78e3a1ef5bf40"}, + {file = "pywinpty-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:340ccacb4d74278a631923794ccd758471cfc8eeeeee4610b280420a17ad1e82"}, + {file = "pywinpty-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:dff25a9a6435f527d7c65608a7e62783fc12076e7d44487a4911ee91be5a8ac8"}, + {file = "pywinpty-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:fbc1e230e5b193eef4431cba3f39996a288f9958f9c9f092c8a961d930ee8f68"}, + {file = "pywinpty-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c9081df0e49ffa86d15db4a6ba61530630e48707f987df42c9d3313537e81fc0"}, + {file = "pywinpty-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:15e79d870e18b678fb8a5a6105fd38496b55697c66e6fc0378236026bc4d59e9"}, + {file = "pywinpty-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9c91dbb026050c77bdcef964e63a4f10f01a639113c4d3658332614544c467ab"}, + {file = "pywinpty-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:fe1f7911805127c94cf51f89ab14096c6f91ffdcacf993d2da6082b2142a2523"}, + {file = "pywinpty-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:3f07a6cf1c1d470d284e614733c3d0f726d2c85e78508ea10a403140c3c0c18a"}, + {file = "pywinpty-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:15c7c0b6f8e9d87aabbaff76468dabf6e6121332c40fc1d83548d02a9d6a3759"}, + {file = "pywinpty-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:d4b6b7b0fe0cdcd02e956bd57cfe9f4e5a06514eecf3b5ae174da4f951b58be9"}, + {file = "pywinpty-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:34789d685fc0d547ce0c8a65e5a70e56f77d732fa6e03c8f74fefb8cbb252019"}, + {file = "pywinpty-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:0c37e224a47a971d1a6e08649a1714dac4f63c11920780977829ed5c8cadead1"}, + {file = "pywinpty-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c4e9c3dff7d86ba81937438d5819f19f385a39d8f592d4e8af67148ceb4f6ab5"}, + {file = "pywinpty-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:0f10e81d52d7f2c4d927f645f247028e64eaf205a3ed9e64dbd998122108a218"}, + {file = "pywinpty-3.0.3.tar.gz", hash = "sha256:523441dc34d231fb361b4b00f8c99d3f16de02f5005fd544a0183112bcc22412"}, +] + [[package]] name = "pyyaml" version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, @@ -2358,13 +3560,134 @@ files = [ {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] +[[package]] +name = "pyzmq" +version = "27.1.0" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386"}, + {file = "pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda"}, + {file = "pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f"}, + {file = "pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32"}, + {file = "pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394"}, + {file = "pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f"}, + {file = "pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97"}, + {file = "pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07"}, + {file = "pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496"}, + {file = "pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd"}, + {file = "pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf"}, + {file = "pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f"}, + {file = "pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5"}, + {file = "pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6"}, + {file = "pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7"}, + {file = "pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05"}, + {file = "pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9"}, + {file = "pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128"}, + {file = "pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39"}, + {file = "pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97"}, + {file = "pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db"}, + {file = "pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c"}, + {file = "pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2"}, + {file = "pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e"}, + {file = "pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a"}, + {file = "pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea"}, + {file = "pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96"}, + {file = "pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d"}, + {file = "pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146"}, + {file = "pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd"}, + {file = "pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a"}, + {file = "pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92"}, + {file = "pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0"}, + {file = "pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7"}, + {file = "pyzmq-27.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:18339186c0ed0ce5835f2656cdfb32203125917711af64da64dbaa3d949e5a1b"}, + {file = "pyzmq-27.1.0-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:753d56fba8f70962cd8295fb3edb40b9b16deaa882dd2b5a3a2039f9ff7625aa"}, + {file = "pyzmq-27.1.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b721c05d932e5ad9ff9344f708c96b9e1a485418c6618d765fca95d4daacfbef"}, + {file = "pyzmq-27.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be883ff3d722e6085ee3f4afc057a50f7f2e0c72d289fd54df5706b4e3d3a50"}, + {file = "pyzmq-27.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b2e592db3a93128daf567de9650a2f3859017b3f7a66bc4ed6e4779d6034976f"}, + {file = "pyzmq-27.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad68808a61cbfbbae7ba26d6233f2a4aa3b221de379ce9ee468aa7a83b9c36b0"}, + {file = "pyzmq-27.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e2687c2d230e8d8584fbea433c24382edfeda0c60627aca3446aa5e58d5d1831"}, + {file = "pyzmq-27.1.0-cp38-cp38-win32.whl", hash = "sha256:a1aa0ee920fb3825d6c825ae3f6c508403b905b698b6460408ebd5bb04bbb312"}, + {file = "pyzmq-27.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:df7cd397ece96cf20a76fae705d40efbab217d217897a5053267cd88a700c266"}, + {file = "pyzmq-27.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:96c71c32fff75957db6ae33cd961439f386505c6e6b377370af9b24a1ef9eafb"}, + {file = "pyzmq-27.1.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:49d3980544447f6bd2968b6ac913ab963a49dcaa2d4a2990041f16057b04c429"}, + {file = "pyzmq-27.1.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:849ca054d81aa1c175c49484afaaa5db0622092b5eccb2055f9f3bb8f703782d"}, + {file = "pyzmq-27.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3970778e74cb7f85934d2b926b9900e92bfe597e62267d7499acc39c9c28e345"}, + {file = "pyzmq-27.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:da96ecdcf7d3919c3be2de91a8c513c186f6762aa6cf7c01087ed74fad7f0968"}, + {file = "pyzmq-27.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9541c444cfe1b1c0156c5c86ece2bb926c7079a18e7b47b0b1b3b1b875e5d098"}, + {file = "pyzmq-27.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e30a74a39b93e2e1591b58eb1acef4902be27c957a8720b0e368f579b82dc22f"}, + {file = "pyzmq-27.1.0-cp39-cp39-win32.whl", hash = "sha256:b1267823d72d1e40701dcba7edc45fd17f71be1285557b7fe668887150a14b78"}, + {file = "pyzmq-27.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c996ded912812a2fcd7ab6574f4ad3edc27cb6510349431e4930d4196ade7db"}, + {file = "pyzmq-27.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:346e9ba4198177a07e7706050f35d733e08c1c1f8ceacd5eb6389d653579ffbc"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:50081a4e98472ba9f5a02850014b4c9b629da6710f8f14f3b15897c666a28f1b"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:510869f9df36ab97f89f4cff9d002a89ac554c7ac9cadd87d444aa4cf66abd27"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f8426a01b1c4098a750973c37131cf585f61c7911d735f729935a0c701b68d3"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:726b6a502f2e34c6d2ada5e702929586d3ac948a4dbbb7fed9854ec8c0466027"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:bd67e7c8f4654bef471c0b1ca6614af0b5202a790723a58b79d9584dc8022a78"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:722ea791aa233ac0a819fc2c475e1292c76930b31f1d828cb61073e2fe5e208f"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:01f9437501886d3a1dd4b02ef59fb8cc384fa718ce066d52f175ee49dd5b7ed8"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4a19387a3dddcc762bfd2f570d14e2395b2c9701329b266f83dd87a2b3cbd381"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c618fbcd069e3a29dcd221739cacde52edcc681f041907867e0f5cc7e85f172"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff8d114d14ac671d88c89b9224c63d6c4e5a613fe8acd5594ce53d752a3aafe9"}, + {file = "pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "referencing" +version = "0.37.0" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.10" +groups = ["notebooks"] +files = [ + {file = "referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231"}, + {file = "referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "requests" version = "2.32.5" description = "Python HTTP for Humans." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, @@ -2380,16 +3703,61 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["notebooks"] +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["notebooks"] +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rfc3987-syntax" +version = "1.1.0" +description = "Helper functions to syntactically validate strings according to RFC 3987." +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f"}, + {file = "rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d"}, +] + +[package.dependencies] +lark = ">=1.2.2" + +[package.extras] +testing = ["pytest (>=8.3.5)"] + [[package]] name = "rich" -version = "14.3.2" +version = "14.3.3" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" groups = ["dev"] files = [ - {file = "rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69"}, - {file = "rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8"}, + {file = "rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d"}, + {file = "rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b"}, ] [package.dependencies] @@ -2418,32 +3786,206 @@ rich = ">=12.0.0" [package.extras] docs = ["sphinx"] +[[package]] +name = "rpds-py" +version = "0.30.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.10" +groups = ["notebooks"] +files = [ + {file = "rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288"}, + {file = "rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139"}, + {file = "rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464"}, + {file = "rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85"}, + {file = "rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394"}, + {file = "rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95"}, + {file = "rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53"}, + {file = "rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e"}, + {file = "rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84"}, +] + [[package]] name = "ruff" -version = "0.15.4" +version = "0.15.6" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "ruff-0.15.4-py3-none-linux_armv6l.whl", hash = "sha256:a1810931c41606c686bae8b5b9a8072adac2f611bb433c0ba476acba17a332e0"}, - {file = "ruff-0.15.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5a1632c66672b8b4d3e1d1782859e98d6e0b4e70829530666644286600a33992"}, - {file = "ruff-0.15.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a4386ba2cd6c0f4ff75252845906acc7c7c8e1ac567b7bc3d373686ac8c222ba"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2496488bdfd3732747558b6f95ae427ff066d1fcd054daf75f5a50674411e75"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3f1c4893841ff2d54cbda1b2860fa3260173df5ddd7b95d370186f8a5e66a4ac"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:820b8766bd65503b6c30aaa6331e8ef3a6e564f7999c844e9a547c40179e440a"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9fb74bab47139c1751f900f857fa503987253c3ef89129b24ed375e72873e85"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f80c98765949c518142b3a50a5db89343aa90f2c2bf7799de9986498ae6176db"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451a2e224151729b3b6c9ffb36aed9091b2996fe4bdbd11f47e27d8f2e8888ec"}, - {file = "ruff-0.15.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a8f157f2e583c513c4f5f896163a93198297371f34c04220daf40d133fdd4f7f"}, - {file = "ruff-0.15.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:917cc68503357021f541e69b35361c99387cdbbf99bd0ea4aa6f28ca99ff5338"}, - {file = "ruff-0.15.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e9737c8161da79fd7cfec19f1e35620375bd8b2a50c3e77fa3d2c16f574105cc"}, - {file = "ruff-0.15.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:291258c917539e18f6ba40482fe31d6f5ac023994ee11d7bdafd716f2aab8a68"}, - {file = "ruff-0.15.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3f83c45911da6f2cd5936c436cf86b9f09f09165f033a99dcf7477e34041cbc3"}, - {file = "ruff-0.15.4-py3-none-win32.whl", hash = "sha256:65594a2d557d4ee9f02834fcdf0a28daa8b3b9f6cb2cb93846025a36db47ef22"}, - {file = "ruff-0.15.4-py3-none-win_amd64.whl", hash = "sha256:04196ad44f0df220c2ece5b0e959c2f37c777375ec744397d21d15b50a75264f"}, - {file = "ruff-0.15.4-py3-none-win_arm64.whl", hash = "sha256:60d5177e8cfc70e51b9c5fad936c634872a74209f934c1e79107d11787ad5453"}, - {file = "ruff-0.15.4.tar.gz", hash = "sha256:3412195319e42d634470cc97aa9803d07e9d5c9223b99bcb1518f0c725f26ae1"}, + {file = "ruff-0.15.6-py3-none-linux_armv6l.whl", hash = "sha256:7c98c3b16407b2cf3d0f2b80c80187384bc92c6774d85fefa913ecd941256fff"}, + {file = "ruff-0.15.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ee7dcfaad8b282a284df4aa6ddc2741b3f4a18b0555d626805555a820ea181c3"}, + {file = "ruff-0.15.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3bd9967851a25f038fc8b9ae88a7fbd1b609f30349231dffaa37b6804923c4bb"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13f4594b04e42cd24a41da653886b04d2ff87adbf57497ed4f728b0e8a4866f8"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2ed8aea2f3fe57886d3f00ea5b8aae5bf68d5e195f487f037a955ff9fbaac9e"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70789d3e7830b848b548aae96766431c0dc01a6c78c13381f423bf7076c66d15"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:542aaf1de3154cea088ced5a819ce872611256ffe2498e750bbae5247a8114e9"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c22e6f02c16cfac3888aa636e9eba857254d15bbacc9906c9689fdecb1953ab"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98893c4c0aadc8e448cfa315bd0cc343a5323d740fe5f28ef8a3f9e21b381f7e"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:70d263770d234912374493e8cc1e7385c5d49376e41dfa51c5c3453169dc581c"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:55a1ad63c5a6e54b1f21b7514dfadc0c7fb40093fa22e95143cf3f64ebdcd512"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8dc473ba093c5ec238bb1e7429ee676dca24643c471e11fbaa8a857925b061c0"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:85b042377c2a5561131767974617006f99f7e13c63c111b998f29fc1e58a4cfb"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cef49e30bc5a86a6a92098a7fbf6e467a234d90b63305d6f3ec01225a9d092e0"}, + {file = "ruff-0.15.6-py3-none-win32.whl", hash = "sha256:bbf67d39832404812a2d23020dda68fee7f18ce15654e96fb1d3ad21a5fe436c"}, + {file = "ruff-0.15.6-py3-none-win_amd64.whl", hash = "sha256:aee25bc84c2f1007ecb5037dff75cef00414fdf17c23f07dc13e577883dca406"}, + {file = "ruff-0.15.6-py3-none-win_arm64.whl", hash = "sha256:c34de3dd0b0ba203be50ae70f5910b17188556630e2178fd7d79fc030eb0d837"}, + {file = "ruff-0.15.6.tar.gz", hash = "sha256:8394c7bb153a4e3811a4ecdacd4a8e6a4fa8097028119160dffecdcdf9b56ae4"}, +] + +[[package]] +name = "send2trash" +version = "2.1.0" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c"}, + {file = "send2trash-2.1.0.tar.gz", hash = "sha256:1c72b39f09457db3c05ce1d19158c2cbef4c32b8bedd02c155e49282b7ea7459"}, +] + +[package.extras] +nativelib = ["pyobjc (>=9.0) ; sys_platform == \"darwin\"", "pywin32 (>=305) ; sys_platform == \"win32\""] +test = ["pytest (>=8)"] + +[[package]] +name = "setuptools" +version = "82.0.1" +description = "Most extensible Python build backend with support for C/C++ extension modules" +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb"}, + {file = "setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.13.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.18.*)", "pytest-mypy"] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["notebooks"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] @@ -2458,6 +4000,38 @@ files = [ {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] +[[package]] +name = "soupsieve" +version = "2.8.3" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"}, + {file = "soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +groups = ["notebooks"] +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + [[package]] name = "structlog" version = "25.5.0" @@ -2485,6 +4059,47 @@ files = [ [package.extras] tests = ["pytest", "pytest-cov"] +[[package]] +name = "terminado" +version = "0.18.1" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, +] + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] + +[[package]] +name = "tinycss2" +version = "1.4.0" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, + {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + [[package]] name = "tomli" version = "2.4.0" @@ -2554,25 +4169,88 @@ files = [ {file = "tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021"}, ] +[[package]] +name = "tornado" +version = "6.5.5" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa"}, + {file = "tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521"}, + {file = "tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5"}, + {file = "tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07"}, + {file = "tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e"}, + {file = "tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca"}, + {file = "tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7"}, + {file = "tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b"}, + {file = "tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6"}, + {file = "tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9"}, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + [[package]] name = "typing-extensions" version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["main", "dev", "notebooks"] files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] +[[package]] +name = "tzdata" +version = "2025.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +groups = ["notebooks"] +files = [ + {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"}, + {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"}, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +groups = ["notebooks"] +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[package.extras] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] + [[package]] name = "urllib3" version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["dev", "notebooks"] files = [ {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, @@ -2586,163 +4264,211 @@ zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "virtualenv" -version = "20.38.0" +version = "21.2.0" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "virtualenv-20.38.0-py3-none-any.whl", hash = "sha256:d6e78e5889de3a4742df2d3d44e779366325a90cf356f15621fddace82431794"}, - {file = "virtualenv-20.38.0.tar.gz", hash = "sha256:94f39b1abaea5185bf7ea5a46702b56f1d0c9aa2f41a6c2b8b0af4ddc74c10a7"}, + {file = "virtualenv-21.2.0-py3-none-any.whl", hash = "sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f"}, + {file = "virtualenv-21.2.0.tar.gz", hash = "sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = {version = ">=3.24.2,<4", markers = "python_version >= \"3.10\""} platformdirs = ">=3.9.1,<5" +python-discovery = ">=1" + +[[package]] +name = "wcwidth" +version = "0.6.0" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = ">=3.8" +groups = ["notebooks"] +files = [ + {file = "wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad"}, + {file = "wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159"}, +] + +[[package]] +name = "webcolors" +version = "25.10.0" +description = "A library for working with the color formats defined by HTML and CSS." +optional = false +python-versions = ">=3.10" +groups = ["notebooks"] +files = [ + {file = "webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d"}, + {file = "webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +groups = ["notebooks"] +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.9" +groups = ["notebooks"] +files = [ + {file = "websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef"}, + {file = "websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98"}, +] [package.extras] -docs = ["furo (>=2023.7.26)", "pre-commit-uv (>=4.1.4)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinx-autodoc-typehints (>=3.6.2)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2025.12.21.14)", "sphinxcontrib-mermaid (>=2)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "pytest-xdist (>=3.5)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx_rtd_theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["pytest", "websockets"] [[package]] name = "yarl" -version = "1.22.0" +version = "1.23.0" description = "Yet another URL library" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e"}, - {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f"}, - {file = "yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467"}, - {file = "yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea"}, - {file = "yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca"}, - {file = "yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b"}, - {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511"}, - {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6"}, - {file = "yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e"}, - {file = "yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca"}, - {file = "yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b"}, - {file = "yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376"}, - {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f"}, - {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2"}, - {file = "yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520"}, - {file = "yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8"}, - {file = "yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c"}, - {file = "yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74"}, - {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53"}, - {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a"}, - {file = "yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67"}, - {file = "yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95"}, - {file = "yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d"}, - {file = "yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b"}, - {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10"}, - {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3"}, - {file = "yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62"}, - {file = "yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03"}, - {file = "yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249"}, - {file = "yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b"}, - {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4"}, - {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683"}, - {file = "yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da"}, - {file = "yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2"}, - {file = "yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79"}, - {file = "yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33"}, - {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1"}, - {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca"}, - {file = "yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c"}, - {file = "yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e"}, - {file = "yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27"}, - {file = "yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1"}, - {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3aa27acb6de7a23785d81557577491f6c38a5209a254d1191519d07d8fe51748"}, - {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:af74f05666a5e531289cb1cc9c883d1de2088b8e5b4de48004e5ca8a830ac859"}, - {file = "yarl-1.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62441e55958977b8167b2709c164c91a6363e25da322d87ae6dd9c6019ceecf9"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b580e71cac3f8113d3135888770903eaf2f507e9421e5697d6ee6d8cd1c7f054"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e81fda2fb4a07eda1a2252b216aa0df23ebcd4d584894e9612e80999a78fd95b"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:99b6fc1d55782461b78221e95fc357b47ad98b041e8e20f47c1411d0aacddc60"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:088e4e08f033db4be2ccd1f34cf29fe994772fb54cfe004bbf54db320af56890"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4e1f6f0b4da23e61188676e3ed027ef0baa833a2e633c29ff8530800edccba"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:84fc3ec96fce86ce5aa305eb4aa9358279d1aa644b71fab7b8ed33fe3ba1a7ca"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5dbeefd6ca588b33576a01b0ad58aa934bc1b41ef89dee505bf2932b22ddffba"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14291620375b1060613f4aab9ebf21850058b6b1b438f386cc814813d901c60b"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a4fcfc8eb2c34148c118dfa02e6427ca278bfd0f3df7c5f99e33d2c0e81eae3e"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:029866bde8d7b0878b9c160e72305bbf0a7342bcd20b9999381704ae03308dc8"}, - {file = "yarl-1.22.0-cp39-cp39-win32.whl", hash = "sha256:4dcc74149ccc8bba31ce1944acee24813e93cfdee2acda3c172df844948ddf7b"}, - {file = "yarl-1.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:10619d9fdee46d20edc49d3479e2f8269d0779f1b031e6f7c2aa1c76be04b7ed"}, - {file = "yarl-1.22.0-cp39-cp39-win_arm64.whl", hash = "sha256:dd7afd3f8b0bfb4e0d9fc3c31bfe8a4ec7debe124cfd90619305def3c8ca8cd2"}, - {file = "yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff"}, - {file = "yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71"}, + {file = "yarl-1.23.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cff6d44cb13d39db2663a22b22305d10855efa0fa8015ddeacc40bc59b9d8107"}, + {file = "yarl-1.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c53f8347cd4200f0d70a48ad059cabaf24f5adc6ba08622a23423bc7efa10d"}, + {file = "yarl-1.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a6940a074fb3c48356ed0158a3ca5699c955ee4185b4d7d619be3c327143e05"}, + {file = "yarl-1.23.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ed5f69ce7be7902e5c70ea19eb72d20abf7d725ab5d49777d696e32d4fc1811d"}, + {file = "yarl-1.23.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:389871e65468400d6283c0308e791a640b5ab5c83bcee02a2f51295f95e09748"}, + {file = "yarl-1.23.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dda608c88cf709b1d406bdfcd84d8d63cff7c9e577a403c6108ce8ce9dcc8764"}, + {file = "yarl-1.23.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c4fe09e0780c6c3bf2b7d4af02ee2394439d11a523bbcf095cf4747c2932007"}, + {file = "yarl-1.23.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c9921eb8bd12633b41ad27686bbb0b1a2a9b8452bfdf221e34f311e9942ed4"}, + {file = "yarl-1.23.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5f10fd85e4b75967468af655228fbfd212bdf66db1c0d135065ce288982eda26"}, + {file = "yarl-1.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dbf507e9ef5688bada447a24d68b4b58dd389ba93b7afc065a2ba892bea54769"}, + {file = "yarl-1.23.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:85e9beda1f591bc73e77ea1c51965c68e98dafd0fec72cdd745f77d727466716"}, + {file = "yarl-1.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1fdaa14ef51366d7757b45bde294e95f6c8c049194e793eedb8387c86d5993"}, + {file = "yarl-1.23.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:75e3026ab649bf48f9a10c0134512638725b521340293f202a69b567518d94e0"}, + {file = "yarl-1.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:80e6d33a3d42a7549b409f199857b4fb54e2103fc44fb87605b6663b7a7ff750"}, + {file = "yarl-1.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ec2f42d41ccbd5df0270d7df31618a8ee267bfa50997f5d720ddba86c4a83a6"}, + {file = "yarl-1.23.0-cp310-cp310-win32.whl", hash = "sha256:debe9c4f41c32990771be5c22b56f810659f9ddf3d63f67abfdcaa2c6c9c5c1d"}, + {file = "yarl-1.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f043cb8a2d71c981c09c510da013bc79fd661f5c60139f00dd3c3cc4f2ffb"}, + {file = "yarl-1.23.0-cp310-cp310-win_arm64.whl", hash = "sha256:263cd4f47159c09b8b685890af949195b51d1aa82ba451c5847ca9bc6413c220"}, + {file = "yarl-1.23.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b35d13d549077713e4414f927cdc388d62e543987c572baee613bf82f11a4b99"}, + {file = "yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbb0fef01f0c6b38cb0f39b1f78fc90b807e0e3c86a7ff3ce74ad77ce5c7880c"}, + {file = "yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432"}, + {file = "yarl-1.23.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2c6b50c7b0464165472b56b42d4c76a7b864597007d9c085e8b63e185cf4a7a"}, + {file = "yarl-1.23.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aafe5dcfda86c8af00386d7781d4c2181b5011b7be3f2add5e99899ea925df05"}, + {file = "yarl-1.23.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ee33b875f0b390564c1fb7bc528abf18c8ee6073b201c6ae8524aca778e2d83"}, + {file = "yarl-1.23.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c41e021bc6d7affb3364dc1e1e5fa9582b470f283748784bd6ea0558f87f42c"}, + {file = "yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99c8a9ed30f4164bc4c14b37a90208836cbf50d4ce2a57c71d0f52c7fb4f7598"}, + {file = "yarl-1.23.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2af5c81a1f124609d5f33507082fc3f739959d4719b56877ab1ee7e7b3d602b"}, + {file = "yarl-1.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6b41389c19b07c760c7e427a3462e8ab83c4bb087d127f0e854c706ce1b9215c"}, + {file = "yarl-1.23.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1dc702e42d0684f42d6519c8d581e49c96cefaaab16691f03566d30658ee8788"}, + {file = "yarl-1.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0e40111274f340d32ebcc0a5668d54d2b552a6cca84c9475859d364b380e3222"}, + {file = "yarl-1.23.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4764a6a7588561a9aef92f65bda2c4fb58fe7c675c0883862e6df97559de0bfb"}, + {file = "yarl-1.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:03214408cfa590df47728b84c679ae4ef00be2428e11630277be0727eba2d7cc"}, + {file = "yarl-1.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:170e26584b060879e29fac213e4228ef063f39128723807a312e5c7fec28eff2"}, + {file = "yarl-1.23.0-cp311-cp311-win32.whl", hash = "sha256:51430653db848d258336cfa0244427b17d12db63d42603a55f0d4546f50f25b5"}, + {file = "yarl-1.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf49a3ae946a87083ef3a34c8f677ae4243f5b824bfc4c69672e72b3d6719d46"}, + {file = "yarl-1.23.0-cp311-cp311-win_arm64.whl", hash = "sha256:b39cb32a6582750b6cc77bfb3c49c0f8760dc18dc96ec9fb55fbb0f04e08b928"}, + {file = "yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860"}, + {file = "yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069"}, + {file = "yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25"}, + {file = "yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8"}, + {file = "yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072"}, + {file = "yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8"}, + {file = "yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7"}, + {file = "yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51"}, + {file = "yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67"}, + {file = "yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7"}, + {file = "yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d"}, + {file = "yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760"}, + {file = "yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2"}, + {file = "yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86"}, + {file = "yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34"}, + {file = "yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d"}, + {file = "yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e"}, + {file = "yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9"}, + {file = "yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e"}, + {file = "yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5"}, + {file = "yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b"}, + {file = "yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035"}, + {file = "yarl-1.23.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9d9a4d06d3481eab79803beb4d9bd6f6a8e781ec078ac70d7ef2dcc29d1bea5"}, + {file = "yarl-1.23.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f514f6474e04179d3d33175ed3f3e31434d3130d42ec153540d5b157deefd735"}, + {file = "yarl-1.23.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fda207c815b253e34f7e1909840fd14299567b1c0eb4908f8c2ce01a41265401"}, + {file = "yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4"}, + {file = "yarl-1.23.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7504f2b476d21653e4d143f44a175f7f751cd41233525312696c76aa3dbb23f"}, + {file = "yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a"}, + {file = "yarl-1.23.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:609d3614d78d74ebe35f54953c5bbd2ac647a7ddb9c30a5d877580f5e86b22f2"}, + {file = "yarl-1.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4966242ec68afc74c122f8459abd597afd7d8a60dc93d695c1334c5fd25f762f"}, + {file = "yarl-1.23.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0fd068364a6759bc794459f0a735ab151d11304346332489c7972bacbe9e72b"}, + {file = "yarl-1.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:39004f0ad156da43e86aa71f44e033de68a44e5a31fc53507b36dd253970054a"}, + {file = "yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543"}, + {file = "yarl-1.23.0-cp313-cp313-win32.whl", hash = "sha256:1b6b572edd95b4fa8df75de10b04bc81acc87c1c7d16bcdd2035b09d30acc957"}, + {file = "yarl-1.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3"}, + {file = "yarl-1.23.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb4948814a2a98e3912505f09c9e7493b1506226afb1f881825368d6fb776ee3"}, + {file = "yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa"}, + {file = "yarl-1.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a41bcf68efd19073376eb8cf948b8d9be0af26256403e512bb18f3966f1f9120"}, + {file = "yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59"}, + {file = "yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512"}, + {file = "yarl-1.23.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1009abedb49ae95b136a8904a3f71b342f849ffeced2d3747bf29caeda218c4"}, + {file = "yarl-1.23.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8d00f29b42f534cc8aa3931cfe773b13b23e561e10d2b26f27a8d309b0e82a1"}, + {file = "yarl-1.23.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:95451e6ce06c3e104556d73b559f5da6c34a069b6b62946d3ad66afcd51642ea"}, + {file = "yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9"}, + {file = "yarl-1.23.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88f9fb0116fbfcefcab70f85cf4b74a2b6ce5d199c41345296f49d974ddb4123"}, + {file = "yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24"}, + {file = "yarl-1.23.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:115136c4a426f9da976187d238e84139ff6b51a20839aa6e3720cd1026d768de"}, + {file = "yarl-1.23.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ead11956716a940c1abc816b7df3fa2b84d06eaed8832ca32f5c5e058c65506b"}, + {file = "yarl-1.23.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:fe8f8f5e70e6dbdfca9882cd9deaac058729bcf323cf7a58660901e55c9c94f6"}, + {file = "yarl-1.23.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a0e317df055958a0c1e79e5d2aa5a5eaa4a6d05a20d4b0c9c3f48918139c9fc6"}, + {file = "yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5"}, + {file = "yarl-1.23.0-cp313-cp313t-win32.whl", hash = "sha256:93a784271881035ab4406a172edb0faecb6e7d00f4b53dc2f55919d6c9688595"}, + {file = "yarl-1.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dd00607bffbf30250fe108065f07453ec124dbf223420f57f5e749b04295e090"}, + {file = "yarl-1.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ac09d42f48f80c9ee1635b2fcaa819496a44502737660d3c0f2ade7526d29144"}, + {file = "yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912"}, + {file = "yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474"}, + {file = "yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719"}, + {file = "yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319"}, + {file = "yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434"}, + {file = "yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723"}, + {file = "yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039"}, + {file = "yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52"}, + {file = "yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c"}, + {file = "yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae"}, + {file = "yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e"}, + {file = "yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85"}, + {file = "yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd"}, + {file = "yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6"}, + {file = "yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe"}, + {file = "yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169"}, + {file = "yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70"}, + {file = "yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e"}, + {file = "yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679"}, + {file = "yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412"}, + {file = "yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4"}, + {file = "yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c"}, + {file = "yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4"}, + {file = "yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94"}, + {file = "yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28"}, + {file = "yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6"}, + {file = "yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277"}, + {file = "yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4"}, + {file = "yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a"}, + {file = "yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb"}, + {file = "yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41"}, + {file = "yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2"}, + {file = "yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4"}, + {file = "yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4"}, + {file = "yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2"}, + {file = "yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25"}, + {file = "yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f"}, + {file = "yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5"}, ] [package.dependencies] @@ -2752,5 +4478,5 @@ propcache = ">=0.2.1" [metadata] lock-version = "2.1" -python-versions = "^3.13" -content-hash = "f000f425f54e910b120aebd9fbcbbb8a10841657f38653781d08f74c31194f87" +python-versions = ">=3.13,<4.0" +content-hash = "e579058bb43df2de9afcaf071ed40e61d9c1177011ed99632b829abab8b7b5d3" diff --git a/pyproject.toml b/pyproject.toml index c6a82cf0..e3a3dd89 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,19 @@ -[tool.poetry] -package-mode = false +[project] name = "d-asa" -version = "0.5.0" +version = "0.20.0" description = "Debt Algorand Standard Application" license = "AGPL-3.0" -authors = ["cusma "] -maintainers = ["cusma "] -readme = ["README.md", "docs/SUMMARY.md"] -documentation = "https://cusma.github.io/d-asa/" -repository = "https://github.com/cusma/d-asa" +readme = "README.md" +requires-python = ">=3.13,<4.0" +authors = [ + { name = "cusma", email = "cosimo.bassi@gmail.com" }, +] +maintainers = [ + { name = "cusma", email = "cosimo.bassi@gmail.com" }, +] +dependencies = [ + "algokit-utils>=4.2.3,<5.0.0", +] keywords = [ "algorand", "blockchain", @@ -18,16 +23,27 @@ keywords = [ "actus", ] +[project.urls] +Documentation = "https://cusma.github.io/d-asa/" +Repository = "https://github.com/cusma/d-asa" + +[tool.poetry] +packages = [ + { include = "d_asa", from = "src" }, +] +include = [ + { path = "src/d_asa/artifacts/*.json", format = ["sdist", "wheel"] }, + { path = "src/d_asa/py.typed", format = ["sdist", "wheel"] }, +] + [tool.poetry.dependencies] -python = "^3.13" -algokit-utils = "^4.2.3" -python-dotenv = "^1.2.2" -algorand-python = "^3.4.0" +python = ">=3.13,<4.0" [tool.poetry.group.dev.dependencies] algokit-client-generator = "^2.2.0" -black = { extras = ["d"], version = "^26.1.0" } -ruff = "^0.15.4" +algorand-python = "^3.4.0" +black = { extras = ["d"], version = "^26.3.1" } +ruff = "^0.15.5" mypy = "^1.19.1" pytest = "^9.0.2" pytest-cov = "^7.0.0" @@ -37,9 +53,17 @@ pre-commit = "^4.5.1" puyapy = "^5.7.1" urllib3 = "^2.6.3" pip = "^26.0.1" +python-dotenv = "^1.2.2" + +[tool.poetry.group.notebooks] +optional = true + +[tool.poetry.group.notebooks.dependencies] +ipykernel = "^7.2.0" +jupyterlab = "^4.4.7" [build-system] -requires = ["poetry-core"] +requires = ["poetry-core>=2.0.0,<3.0.0"] build-backend = "poetry.core.masonry.api" [tool.ruff] @@ -64,17 +88,24 @@ lint.unfixable = ["B", "RUF"] [tool.ruff.lint.per-file-ignores] "tests/**" = ["ANN001", "ANN401", "E501"] +"smart_contracts/abi_types.py" = ["UP040"] +"smart_contracts/events.py" = ["UP040"] +"modules/**" = ["UP040"] [tool.ruff.lint.flake8-annotations] allow-star-arg-any = true suppress-none-returning = true [tool.pytest.ini_options] -pythonpath = ["smart_contracts", "tests"] +pythonpath = ["src", "tests"] +markers = [ + "showcase: narrative LocalNet walkthroughs that are excluded from the default test run", +] [tool.mypy] files = "smart_contracts/" -python_version = "3.12" +python_version = "3.13" +mypy_path = "src" disallow_any_generics = true disallow_subclassing_any = true disallow_untyped_calls = true @@ -93,6 +124,12 @@ disallow_any_decorated = true disallow_any_explicit = true untyped_calls_exclude = ["algosdk"] +[[tool.mypy.overrides]] +module = "smart_contracts.d_asa.deploy_config" +disallow_any_unimported = false +disallow_any_expr = false +follow_imports = "skip" + [[tool.mypy.overrides]] module = "tests.*" disallow_any_expr = false diff --git a/smart_contracts/__main__.py b/smart_contracts/__main__.py index 50e5f440..f0c06caa 100644 --- a/smart_contracts/__main__.py +++ b/smart_contracts/__main__.py @@ -1,6 +1,7 @@ import dataclasses import importlib import logging +import re import subprocess import sys from collections.abc import Callable @@ -10,9 +11,7 @@ from algokit_utils.config import config from dotenv import load_dotenv -from smart_contracts import errors as err - -from .mixin_composition import CompositionValidationError, validate_contract_composition +config.configure(debug=True, trace_all=False) # Set up logging and load environment variables. logging.basicConfig( @@ -22,13 +21,14 @@ logger.info("Loading .env") load_dotenv() -# Set trace_all to True to capture all transactions, defaults to capturing traces only on failure -# Learn more about using AlgoKit AVM Debugger to debug your TEAL source codes and inspect various kinds of -# Algorand transactions in atomic groups -> https://github.com/algorandfoundation/algokit-avm-vscode-debugger -config.configure(debug=True, trace_all=False, logger=logger) - # Determine the root path based on this file's location. root_path = Path(__file__).parent +src_artifact_path = root_path.parent / "src" / "d_asa" / "artifacts" +canonical_src_contract_name = "d_asa" +canonical_src_app_spec_name = "DASA.arc56.json" +canonical_src_client_name = "dasa_client.py" +canonical_src_avm_client_name = "dasa_avm_client.py" +generated_artifacts_init = '"""Generated client artifacts."""\n' # ----------------------- Contract Configuration ----------------------- # @@ -55,7 +55,14 @@ def import_deploy_if_exists(folder: Path) -> Callable[[], None] | None: module_name = f"{folder.parent.name}.{folder.name}.deploy_config" deploy_module = importlib.import_module(module_name) return deploy_module.deploy # type: ignore[no-any-return, misc] - except ImportError: + except ImportError as e: + # Log the import error for debugging, but don't fail if deploy_config doesn't exist + if "No module named" in str(e) and "deploy_config" in str(e): + logger.debug(f"No deploy_config found for {folder.name}") + else: + logger.warning( + f"Failed to import deploy_config for {folder.name}: {e}", exc_info=True + ) return None @@ -79,55 +86,108 @@ def has_contract_file(directory: Path) -> bool: # -------------------------- Build Logic -------------------------- # deployment_extension = "py" -INVALID_MIXIN_MARKERS: tuple[str, ...] = ( - "INVALID_MIXIN_COMPOSITION", - err.INVALID_MIXIN_COMPOSITION, -) -def _get_output_path(output_dir: Path, deployment_extension: str) -> Path: +def _to_snake_case(name: str) -> str: + """Converts CamelCase or acronym-heavy names to snake_case.""" + if name.isupper(): + return name.lower() + + first_pass = re.sub(r"(.)([A-Z][a-z]+)", r"\1_\2", name) + second_pass = re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", first_pass) + return second_pass.lower() + + +def _get_client_output_dir(output_dir: Path, contract_name: str) -> Path: + """Returns where generated clients should be written for a contract.""" + if contract_name == canonical_src_contract_name: + return src_artifact_path + return output_dir + + +def _get_typed_client_output_path( + target_dir: Path, + contract_name: str, + app_spec_contract_name: str, + deployment_extension: str, +) -> Path: """Constructs the output path for the generated client file.""" - return output_dir / Path( - "{contract_name}" - + ("_client" if deployment_extension == "py" else "Client") - + f".{deployment_extension}" + if contract_name == canonical_src_contract_name: + return target_dir / canonical_src_client_name + + base_name = ( + f"{_to_snake_case(app_spec_contract_name)}_client" + if deployment_extension == "py" + else f"{app_spec_contract_name}Client" + ) + return target_dir / f"{base_name}.{deployment_extension}" + + +def _get_avm_client_output_path( + target_dir: Path, contract_name: str, app_spec_contract_name: str +) -> Path: + """Constructs the output path for the generated AVM client file.""" + if contract_name == canonical_src_contract_name: + return target_dir / canonical_src_avm_client_name + + return target_dir / f"{_to_snake_case(app_spec_contract_name)}_avm_client.py" + + +def _get_app_spec_path(output_dir: Path, contract_name: str) -> Path | None: + """Gets the canonical ARC-56 path for a contract if it exists.""" + if contract_name == canonical_src_contract_name: + app_spec_path = src_artifact_path / canonical_src_app_spec_name + return app_spec_path if app_spec_path.exists() else None + + return next( + ( + file + for file in output_dir.iterdir() + if file.is_file() and file.suffixes == [".arc56", ".json"] + ), + None, ) -def _assert_no_invalid_mixin_markers(output_dir: Path) -> None: - scanned_files = list(output_dir.glob("*.teal")) + list( - output_dir.glob("*.arc56.json") +def _reset_src_artifacts(contract_name: str) -> None: + """Clears and recreates the canonical generated artifact package.""" + if contract_name != canonical_src_contract_name: + return + + if src_artifact_path.exists(): + rmtree(src_artifact_path) + src_artifact_path.mkdir(parents=True, exist_ok=True) + (src_artifact_path / "__init__.py").write_text( + generated_artifacts_init, encoding="utf-8" ) - offending: list[Path] = [] - for artifact_file in scanned_files: - content = artifact_file.read_text(encoding="utf-8") - if any(marker in content for marker in INVALID_MIXIN_MARKERS): - offending.append(artifact_file) - if offending: - file_list = "\n".join(f"- {file}" for file in offending) - raise Exception( - "Invalid mixin composition marker found in compiled artifacts:\n" - f"{file_list}\n" - "This indicates a broken MRO/composition, aborting." - ) -def build(output_dir: Path, contract_path: Path) -> Path: +def _sync_src_artifacts(output_dir: Path, contract_name: str) -> Path | None: + """Moves the canonical D-ASA artifacts into src/d_asa/artifacts.""" + if contract_name != canonical_src_contract_name: + return None + + src_artifact_path.mkdir(parents=True, exist_ok=True) + + app_spec_path = output_dir / canonical_src_app_spec_name + if not app_spec_path.exists(): + raise Exception("Could not build contract, DASA.arc56.json file not found") + + canonical_app_spec_path = src_artifact_path / canonical_src_app_spec_name + app_spec_path.replace(canonical_app_spec_path) + return canonical_app_spec_path + + +def build(output_dir: Path, contract_name: str, contract_path: Path) -> Path: """ Builds the contract by exporting (compiling) its source and generating a client. If the output directory already exists, it is cleared. """ - try: - validate_contract_composition(contract_path, root_path) - except CompositionValidationError as exc: - raise Exception( - f"Could not build contract due to invalid mixin composition:\n{exc}" - ) from exc - output_dir = output_dir.resolve() if output_dir.exists(): rmtree(output_dir) output_dir.mkdir(exist_ok=True, parents=True) + _reset_src_artifacts(contract_name) logger.info(f"Exporting {contract_path} to {output_dir}") build_result = subprocess.run( @@ -138,14 +198,16 @@ def build(output_dir: Path, contract_path: Path) -> Path: "python", str(contract_path.resolve()), f"--out-dir={output_dir}", - "--no-output-arc32", - "--output-arc56", "--output-source-map", ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, ) + + if build_result.stdout: + print(build_result.stdout) + if build_result.returncode: raise Exception(f"Could not build contract:\n{build_result.stdout}") @@ -160,9 +222,20 @@ def build(output_dir: Path, contract_path: Path) -> Path: "No '*.arc56.json' file found (likely a logic signature being compiled). Skipping client generation." ) else: + target_dir = _get_client_output_dir(output_dir, contract_name) + target_dir.mkdir(exist_ok=True, parents=True) + + # Generate Python App Clients (off-chain) for file_name in app_spec_file_names: client_file = file_name print(file_name) + app_spec_contract_name = file_name.removesuffix(".arc56.json") + client_output_path = _get_typed_client_output_path( + target_dir, + contract_name, + app_spec_contract_name, + deployment_extension, + ) generate_result = subprocess.run( [ "algokit", @@ -170,12 +243,16 @@ def build(output_dir: Path, contract_path: Path) -> Path: "client", str(output_dir), "--output", - str(_get_output_path(output_dir, deployment_extension)), + str(client_output_path), ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, ) + + if generate_result.stdout: + print(generate_result.stdout) + if generate_result.returncode: if "No such command" in generate_result.stdout: raise Exception( @@ -186,10 +263,51 @@ def build(output_dir: Path, contract_path: Path) -> Path: f"Could not generate typed client:\n{generate_result.stdout}" ) - _assert_no_invalid_mixin_markers(output_dir) + # Generate Python AVM Clients (on-chain) + for file_name in app_spec_file_names: + app_spec_contract_name = file_name.removesuffix(".arc56.json") + logger.info(f"Generating AVM Client (on-chain) for {file_name}") + puyapy_result = subprocess.run( + [ + "poetry", + "run", + "puyapy-clientgen", + str(output_dir / file_name), + "--out-dir", + str(target_dir), + ], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + + if puyapy_result.stdout: + print(puyapy_result.stdout) + + if puyapy_result.returncode: + raise Exception( + f"Could not generate client with puyapy-clientgen:\n{puyapy_result.stdout}" + ) + + generated_file = target_dir / f"client_{app_spec_contract_name}.py" + desired_file = _get_avm_client_output_path( + target_dir, contract_name, app_spec_contract_name + ) + + if not generated_file.exists(): + raise FileNotFoundError( + f"Expected generated AVM client '{generated_file.name}' was not created by puyapy-clientgen" + ) + + if desired_file.exists(): + desired_file.unlink() + + generated_file.rename(desired_file) + logger.info(f"Renamed AVM client to {desired_file.name}") + canonical_app_spec_path = _sync_src_artifacts(output_dir, contract_name) if client_file: - return output_dir / client_file + return canonical_app_spec_path or output_dir / client_file return output_dir @@ -210,29 +328,20 @@ def main(action: str, contract_name: str | None = None) -> None: case "build": for contract in filtered_contracts: logger.info(f"Building app at {contract.path}") - build(artifact_path / contract.name, contract.path) + build(artifact_path / contract.name, contract.name, contract.path) case "deploy": for contract in filtered_contracts: output_dir = artifact_path / contract.name - app_spec_file_name = next( - ( - file.name - for file in output_dir.iterdir() - if file.is_file() and file.suffixes == [".arc56", ".json"] - ), - None, - ) - if app_spec_file_name is None: + app_spec_path = _get_app_spec_path(output_dir, contract.name) + if app_spec_path is None: raise Exception("Could not deploy app, .arc56.json file not found") - _assert_no_invalid_mixin_markers(output_dir) if contract.deploy: logger.info(f"Deploying app {contract.name}") contract.deploy() case "all": for contract in filtered_contracts: logger.info(f"Building app at {contract.path}") - build(artifact_path / contract.name, contract.path) - _assert_no_invalid_mixin_markers(artifact_path / contract.name) + build(artifact_path / contract.name, contract.name, contract.path) if contract.deploy: logger.info(f"Deploying {contract.name}") contract.deploy() diff --git a/smart_contracts/abi_types.py b/smart_contracts/abi_types.py index 3d86ce1d..05dde824 100644 --- a/smart_contracts/abi_types.py +++ b/smart_contracts/abi_types.py @@ -3,6 +3,7 @@ from algopy import ( Account, Array, + Asset, BoxMap, Bytes, FixedBytes, @@ -12,110 +13,179 @@ arc4, ) -CouponRates: TypeAlias = Array[arc4.UInt16] -TimeEvents: TypeAlias = Array[UInt64] -TimePeriod: TypeAlias = tuple[UInt64, UInt64] -TimePeriods: TypeAlias = Array[TimePeriod] -ProspectusHash: TypeAlias = FixedBytes[Literal[32]] +class RoleValidity(Struct, kw_only=True): + """D-ASA Role Configuration""" -class AssetInfo(Struct, kw_only=True): - """D-ASA Info""" + role_validity_start: UInt64 + role_validity_end: UInt64 - denomination_asset_id: UInt64 - settlement_asset_id: UInt64 - outstanding_principal: UInt64 - unit_value: UInt64 - day_count_convention: arc4.UInt8 - principal_discount: arc4.UInt16 - interest_rate: arc4.UInt16 - total_supply: UInt64 - circulating_supply: UInt64 - primary_distribution_opening_date: UInt64 - primary_distribution_closure_date: UInt64 - issuance_date: UInt64 - maturity_date: UInt64 - suspended: bool - performance: arc4.UInt8 +RbacRole: TypeAlias = BoxMap[Account, RoleValidity] +ContractTypeId: TypeAlias = arc4.UInt8 +EventTypeId: TypeAlias = arc4.UInt8 +DayCountConvention: TypeAlias = arc4.UInt8 +TimeStamp: TypeAlias = UInt64 +Hash: TypeAlias = FixedBytes[Literal[32]] -# FIXME: Switch to Struct when bytes operations are supported -class AssetMetadata(arc4.Struct, kw_only=True): - """D-ASA Metadata""" - contract_type: arc4.UInt8 - calendar: arc4.UInt8 - business_day_convention: arc4.UInt8 - end_of_month_convention: arc4.UInt8 - prepayment_effect: arc4.UInt8 - penalty_type: arc4.UInt8 - prospectus_hash: ProspectusHash - prospectus_url: String +class Prospectus(Struct, kw_only=True): + """Contract Prospectus.""" + hash: Hash + url: String -class AccountInfo(Struct, kw_only=True): - """D-ASA Account Info""" - payment_address: Account - units: UInt64 - unit_value: UInt64 - paid_coupons: UInt64 - suspended: bool +class NormalizedActusTerms(Struct, kw_only=True): + """Normalized ACTUS terms required by the AVM kernel.""" + contract_type: ContractTypeId + denomination_asset_id: Asset + settlement_asset_id: Asset + total_units: UInt64 + notional_principal: UInt64 + initial_exchange_amount: UInt64 + initial_exchange_date: TimeStamp + maturity_date: TimeStamp + day_count_convention: DayCountConvention + rate_reset_spread: UInt64 + rate_reset_multiplier: UInt64 + rate_reset_floor: UInt64 + rate_reset_cap: UInt64 + rate_reset_next: UInt64 + has_rate_reset_floor: bool + has_rate_reset_cap: bool + dynamic_principal_redemption: bool + fixed_point_scale: UInt64 -class DayCountFactor(Struct, kw_only=True): - """D-ASA Day Count Factor""" - numerator: UInt64 - denominator: UInt64 +class ExecutionScheduleEntry(Struct, kw_only=True): + """A single normalized ACTUS event.""" + event_id: UInt64 + event_type: EventTypeId + scheduled_time: TimeStamp + accrual_factor: UInt64 + redemption_accrual_factor: UInt64 + next_nominal_interest_rate: UInt64 + next_principal_redemption: UInt64 + next_outstanding_principal: UInt64 + flags: UInt64 -class CouponsInfo(Struct, kw_only=True): - """D-ASA Coupons Info""" - total_coupons: UInt64 - due_coupons: UInt64 - next_coupon_due_date: UInt64 - day_count_factor: DayCountFactor - all_due_coupons_paid: bool +ExecutionSchedulePage: TypeAlias = Array[ExecutionScheduleEntry] -class PaymentAmounts(Struct, kw_only=True): - """D-ASA Payment Amounts""" +class InitialKernelState(Struct, kw_only=True): + """Initial kernel state at deployment status date.""" - interest: UInt64 - principal: UInt64 + status_date: TimeStamp + event_cursor: UInt64 + outstanding_principal: UInt64 + interest_calculation_base: UInt64 + nominal_interest_rate: UInt64 + accrued_interest: UInt64 + next_principal_redemption: UInt64 + cumulative_interest_index: UInt64 + cumulative_principal_index: UInt64 + + +class ObservedEventRequest(Struct, kw_only=True): + """Authorized payload for appending or applying observed ACTUS events.""" + + event_id: UInt64 + event_type: EventTypeId + scheduled_time: TimeStamp + accrual_factor: UInt64 + redemption_accrual_factor: UInt64 + observed_rate: UInt64 + next_nominal_interest_rate: UInt64 + next_principal_redemption: UInt64 + next_outstanding_principal: UInt64 + flags: UInt64 + + +class ObservedCashEventRequest(Struct, kw_only=True): + """Authorized payload for appending observed ACTUS cash events.""" + + event_id: UInt64 + event_type: EventTypeId + scheduled_time: TimeStamp + accrual_factor: UInt64 + redemption_accrual_factor: UInt64 + next_nominal_interest_rate: UInt64 + next_principal_redemption: UInt64 + next_outstanding_principal: UInt64 + flags: UInt64 + + +class KernelState(Struct, kw_only=True): + """Typed Global State.""" + + contract_type: ContractTypeId + status: UInt64 + total_units: UInt64 + reserved_units_total: UInt64 + initial_exchange_amount: UInt64 + event_cursor: UInt64 + schedule_entry_count: UInt64 + outstanding_principal: UInt64 + interest_calculation_base: UInt64 + nominal_interest_rate: UInt64 + accrued_interest: UInt64 + cumulative_interest_index: UInt64 + cumulative_principal_index: UInt64 + reserved_interest: UInt64 + reserved_principal: UInt64 + + +class AccountPosition(Struct, kw_only=True): + """ + Tracks the account's units and lazy-settlement state. `interest_checkpoint` + and `principal_checkpoint` are cumulative per-unit fixed-point indices already + applied to this account. Any later index growth is converted into absolute + amounts in `claimable_interest` and `claimable_principal` when the position is + settled. `settled_cursor` records the global event cursor seen at the last + settlement. + + Attributes: + payment_address: Destination for cashflow withdrawals. + units: Active units that accrue funded cashflows. + reserved_units: Pre-IED units not yet active. + suspended: Whether the account is suspended. + settled_cursor: Global event cursor at the last account settlement. + interest_checkpoint: Applied cumulative per-unit interest index. + principal_checkpoint: Applied cumulative per-unit principal index. + claimable_interest: Absolute interest amount currently claimable. + claimable_principal: Absolute principal amount currently claimable. + """ + payment_address: Account + units: UInt64 + reserved_units: UInt64 + suspended: bool + settled_cursor: UInt64 + interest_checkpoint: UInt64 + principal_checkpoint: UInt64 + claimable_interest: UInt64 + claimable_principal: UInt64 -class PaymentResult(Struct, kw_only=True): - """D-ASA Payment Result""" - amount: UInt64 +class CashClaimResult(Struct, kw_only=True): + """Result returned after a holder cashflow claim attempt.""" + + interest_amount: UInt64 + principal_amount: UInt64 + total_amount: UInt64 timestamp: UInt64 context: Bytes -class SecondaryMarketSchedule(Struct, kw_only=True): - """D-ASA Secondary Market Schedule""" - - secondary_market_opening_date: UInt64 - secondary_market_closure_date: UInt64 - - -class CurrentUnitsValue(Struct, kw_only=True): - """D-ASA Account's Current Units Value""" - - units_value: UInt64 - accrued_interest: UInt64 - day_count_factor: DayCountFactor - - -# FIXME: Switch to Struct when bytes operations are supported -class RoleConfig(arc4.Struct, kw_only=True): - """D-ASA Role Configuration""" +class CashFundingResult(Struct, kw_only=True): + """Result returned after funding one or more due ACTUS cash events.""" - role_validity_start: UInt64 - role_validity_end: UInt64 - - -RbacRole: TypeAlias = BoxMap[Account, RoleConfig] + funded_interest: UInt64 + funded_principal: UInt64 + total_funded: UInt64 + processed_events: UInt64 + timestamp: UInt64 diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.puya.map b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map new file mode 100644 index 00000000..27364a58 --- /dev/null +++ b/smart_contracts/artifacts/d_asa/DASA.approval.puya.map @@ -0,0 +1,64018 @@ +{ + "version": 3, + "sources": [ + "../../../modules/accounting.py", + "../../../modules/actus_kernel.py", + "../../../modules/payment_agent.py", + "../../../modules/rbac.py", + "../../../modules/transfer_agent.py", + "../../d_asa/contract.py" + ], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG4BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAA0B;AAA1B;AAGA;;AAAiB;AAAjB;AFMA;AAAc;AAAd;AACA;;AAAqB;AAArB;AAGA;;AAAuB;;AAAvB;AACA;;AAAsB;;AAAtB;AAGA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AAGA;;AAA6B;AAA7B;AACA;;AAAqB;AAArB;AACA;;AAA6B;AAA7B;AACA;;AAA6B;AAA7B;AAGA;;AAA4B;AAA5B;AAGA;;AAAmB;AAAnB;AACA;;AAA4B;AAA5B;AAGA;;AAA+B;AAA/B;AACA;;AAA6B;AAA7B;AACA;;AAAiC;AAAjC;AACA;;AAAoC;AAApC;AAGA;;AAAiC;AAAjC;AACA;;AAAwB;AAAxB;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AACA;;AAA6B;AAA7B;AACA;;AAAwB;AAAxB;AACA;;AAAsB;AAAtB;AACA;;AAAuB;AAAvB;AACA;;AAA4B;AAA5B;AACA;;AAA0B;AAA1B;AAGA;;AAA0B;AAA1B;AACA;;AAAyB;AAAzB;AAGA;;AAAiC;AAAjC;AACA;;AAAkC;AAAlC;AAQA;AAAoB;AAApB;AACA;AAA4B;AAA5B;AAGA;;AAAyB;AAAzB;AIhGO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AF8IK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADvGA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ADgGU;AAAA;AAAA;AAAA;AAAP;AC3EA;;;AACA;;;AACA;;;ADiEO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AC3EG;;;AAAX;;;AAIsB;AACA;;AADA;AADF;;AAAA;AAFR;AAAA;;;AAQe;AAAnB;;AACkB;AAAlB;;AACmB;AAAnB;;AAGI;;AAAA;;AAAA;AAAA;;;AACI;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;AADJ;;;AAGiC;AAAA;AAAA;AAAA;AAAzB;;;AAAA;AAAA;;AACL;;AAAA;AAAA;AAAA;;AAAuB;;AAAvB;AAAf;;;AAEuC;;AAAA;AAAA;AAAA;AAAA;;ADmQ3B;AADG;AAAA;AAAA;;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AClQA;;;ADwcA;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAwB;;AAAxB;AAAP;AAxIG;;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AAYE;;AAAA;AAAA;AAAA;AAAA;;AACS;;AAAnB;AAAA;;;AAAA;;AAAyC;;AAAzC;AAAA;;;AACQ;;;AA6HkB;;AAAA;;AAAA;AAAA;;AAG1B;;;AAAX;;;;;;;AAkB+B;;AAAA;;;AACC;;AAAA;;;AACN;;AAAA;;;AAAA;AAAA;;AAAA;;AACC;AAAA;;;AAAA;AAAA;;AACD;;AAAA;;AAAA;AAAA;AAAA;;AA4JyB;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAtRH;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;;AAAA;AAwRA;;AAAA;;AAAA;AAAP;AACO;;AAAA;AAAA;AA7JH;;AAAA;AADJ;AAIA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;AAAgC;;AAAhC;AAAX;;;AAEY;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAGG;;;AAAJ;;;AAAkC;;AAAA;AAAA;AAAgC;;AAAhC;AAAlC;;;AAGkC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACJ;;AAAA;;AAAA;AACA;;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AAEG;;AAAA;;;AAAoB;;;AAApB;AAAA;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAGC;AAAc;;;AAAd;AACA;;AAAiC;AAAjC;AAEJ;;AAAA;;AAAA;AAAA;;;AAAA;AC9fI;;AAAA;;AAAA;AAAA;;AACA;;AAAA;;AAAA;AAAA;;AACA;;AAAoB;AAApB;AAAA;;;;;AD6eA;;AAAwB;AAAxB;;;;AAlCa;;AAAA;AAAA;AAAA;AAAA;;AAGI;;AAAd;AAAf;;;AAEoB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;AAGH;;AAAc;AAAd;AAAjB;;;AAC6C;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;;AACpB;;AAAc;;AAAd;AAAjB;;;;;;;AAAA;;;AAC6C;AAA7B;;AACqB;AAArB;;;;;AA7IL;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAyHQ;;;AAxHJ;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;AAAA;AAAA;;AACZ;AAAA;;AAAA;AAAA;AAAA;AAAf;;;AACuB;;;AAsHQ;;;AArHA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;;AAAA;AAAA;AAAnB;AAAf;;;AACuB;AAAA;;AAAA;AAAA;;;AAmHQ;;;;;;;AAAA;;;AAhHnB;;AAAA;;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAApC;AAAA;AADJ;AAGO;AAAA;;;AA8GgB;;;AAzIhB;AAAA;;AAAA;AAAA;AAAwB;;AAAA;;;AAAA;;AAAxB;;;AAwIe;;;ACnctB;;AAAA;AAAA;AAIiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAEH;;AALP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAtDV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AA8DA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ADkCU;AAAA;AAAA;AAAA;AAAP;ADvH0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AETG;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AA2HJ;;;AACA;;;ADLO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;ACJA;;AAAA;AAAA;;;AACA;;;;;AF3BI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACE;AAAA;;AAAA;AAAA;AAAA;;AADF;;AAAA;AAAA;AAAA;;AE6BJ;AAzHI;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AA2HhB;;;AArH6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AAwHc;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAjHd;AAIQ;;;;;;;;;;;;;AAJR;;;;;;AAAA;AFsFkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAGW;AAA9B;AAAA;AAAA;;AAAA;;AACA;AAAA;;AACA;;AAAA;AAAA;AAEO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAP;AAGA;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AEoBiB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AACH;;AAJP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AA/CV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AEvFA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBG;;;AACO;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AACO;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AHgGU;AAAA;AAAA;AAAA;AAAP;AEtE4B;;AAAqB;;AAA1C;;;AAAP;ACGA;;;AACA;;;AH0DO;AAAA;AAAA;AAAA;AAAe;;AAAf;AGzDP;AJtD0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIwDA;AAAA;;;AACA;AAAA;AAEI;AAAA;;AAAA;AAAA;AAAA;AAAqC;AAAA;;AAAA;AAAA;AAArC;AADJ;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;AJ8DJ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AIzDA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AA+CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AHiDU;AAAA;AAAA;AAAA;AAAP;AGbA;;;AACA;;;AHIO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AGtIG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAA8B;;AAA9B;AADJ;AAGD;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADJ;AAqHG;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AJ/G0B;;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AIkHA;;AAAA;;;AACA;AAAA;;;AACO;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;AAAA;AAAA;AAAA;AAAA;AAAT;AAAP;AH6mBG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAE8C;AAAA;AAAA;AAAA;AAAzB;;;AAET;;AAAA;AAA4B;;AAA5B;AADJ;AG7mBA;;AAAA;AAAA;;;AACA;;AAAA;AAAA;;AAAA;;;AACA;;;;;AACA;;;;;AJIgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAA;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AATA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AIlDH;AAAA;;AAAA;AAAA;AAAA;AAAA;AJuEA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AGtF+B;;AAAgB;;AAArC;;;AAAP;AHvD0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAiKA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AGtH+B;;AAAsB;;AAA3C;;;AAAP;AFqEO;AAAA;AAAA;AAAA;AAAe;;;AAAf;ADuEA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAnLU;AAFH;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAsLP;AACO;;AA3BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAjM6B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAsNO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AACA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA5N6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2OO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;ACuwBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;AAAA;AAAA;AACO;;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AAiBA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA8BG;;;AAGqB;AAAA;AAAA;AAArB;;AAAA;;AAAA;AAn1BO;;;AAAA;AAEH;AAFG;AAAA;;;AAAA;AAGH;;AAHG;AAAA;;;AAAA;AAIH;;AAJG;AAAA;;;AAAA;AAKH;;AALG;AAAA;;;AAAA;AAMH;;AANG;AAAA;;;;AAWP;AA00B4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AA1uBrB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAEI;;AAAA;AAAA;AAAA;;AA9BG;;;AAAA;;AAEH;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAYP;AAoBG;AAAiB;AAAjB;AAAX;;;AACuB;;AAAA;;;AAAA;AAAJ;AAAP;AA6dG;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;AAAP;AAGgC;;AAAA;AAAA;AAAA;AAnCb;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAmC8B;;AAAA;;AAAA;AA9B1B;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;AAHjB;;;;;;AAAA;AA4BmB;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAA4B;AAA5B;AAGA;;AAAA;;AAAA;AAG6B;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACqB;;AAAA;;AAAA;AAArB;;AAAA;;AAAA;AACiC;;AAAA;AAAA;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACoC;;AAAA;;;AAAA;AAApC;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AAGwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AAG6B;;AAAA;AAAA;AAA7B;;AAAA;AAAA;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACwB;;AAAA;;AAAA;AAAxB;;AAAA;AAAA;AACsB;;AAAA;;AAAA;AAAtB;;AAAA;AAAA;AACuB;;AAAA;;AAAA;AAAvB;;AAAA;AAAA;AAC4B;;AAAA;;;AAAA;AAA5B;;AAAA;AAAA;AAC0B;;AAAA;;;AAAA;AAA1B;;AAAA;AAAA;AAGyB;;AAAA;;AAAA;AAAzB;;AAAA;AAAA;AAGoB;;AAAA;AAAA;AAApB;AAAA;AAAA;AAGiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACkC;;AAAA;;AAAA;AAAlC;;AAAA;AAAA;AAGA;;AAAyB;AAAzB;AACA;;AAA0B;AAA1B;AAEO;;AAA8B;;AAA9B;AAAP;AACqC;AAAA;AAAA;AAA9B;;AAAA;AAAP;AACO;AAAP;AAiNuB;;AAAA;;;AAAvB;;AAAA;AAAA;AACsB;;AAAA;;;AAAtB;;AAAA;AAAA;AACO;;AAxCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;AA0CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAgCG;;;AAGkB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAxOX;AAAA;AAAA;AAAA;AAAA;AAAP;AACO;AAAwB;;AAAxB;AAAP;AAGO;AAAA;;AAAA;AAAA;AAAP;AAEc;AAAsB;;AAAtB;AAAA;AAOU;;AAAd;AADF;;AAAA;AAFR;AAAA;;;AAMQ;AACF;AAAA;;AAAA;AAAd;;;AACoB;;AAAA;;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AACW;AADX;AACW;AAAA;AAAA;;AAAA;;AACZ;AAAA;AAAA;AAAA;AAAA;;AAAkB;;AAAA;;AAAA;AAAlB;;AAAA;AAAP;AACA;;AAAA;;AAAA;;;AAGO;AAAA;;AAAA;AAAA;AAAA;;AAAP;AACZ;;;AACA;AAAA;;;AACmD;AAAQ;AAAR;AAAd;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAejB;;AAAA;AAAA;;AAAA;AADJ;AAGhB;;AAAA;;;AACuB;;AAAoB;AAApB;AAAP;AAGJ;AAAS;AAAT;AAAA;;;;;AAjBQ;;AAAA;AAAA;AAC4C;AAAtB;AAElB;AAAuB;;AAAvB;AAAA;AAAA;AAAA;AAAA;;AADJ;AAGgB;AAAA;AAAA;;AAAA;AAAA;AAChB;AAAA;AAE2B;AAAvB;AADa;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;;AA/sBV;;AAAA;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AA4tBR;;AAAA;;;AAEgB;;AAAA;;AAAA;AADJ;AAAA;AAAA;AAGA;AAAc;;AAAd;AAsLG;;AAxCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAv6BU;AAAA;AAAA;AAAA;AAAP;AAw+BA;;;AACA;;;AACA;;;AAEO;AAAA;AAAA;AAAA;AAAoB;AAAA;AAAA;AAAA;AAApB;;AAAA;AAAP;AACQ;;;AACD;AAAA;;;AAAA;AAAoB;;;AAApB;AAAP;AAIiB;;AAAA;;;AAEM;;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AAEC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AACrB;;AAAA;;;AAVV;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAMkB;AANlB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAFJ;;;AAAA;;AAeO;;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;AA+CA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAhgCU;AAAA;AAAA;AAAA;AAAP;AAqiCA;;;AACA;;;AAEG;;AAAA;AAAA;AAAgB;;AAAhB;AAAX;;;AA98Be;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA+8BH;AACA;;;AAh9BG;AAAA;;AAAA;AAAA;AAAA;AAAsB;;AAAtB;AAwsBP;AACO;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAP;AAEwB;AAAA;;;AAAA;;AAAA;AAAA;AADxB;;;AAIuC;AAAA;AAAA;AAAA;AAzvBpB;;AAAZ;AA0vBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAkPmB;AAAA;AAAA;AAAA;AAAZ;;AAAA;AAAA;;AAAA;AAAP;AACQ;;;AAAA;AAAA;;AAEJ;AAAA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAn1BA;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAm1BP;AAGO;;AAAoB;;;AAApB;AAAP;AA30BO;;AAAe;;AAAf;AAAA;;;AAAA;;AAAqC;;AAArC;AAAA;;;;AA40Bf;;;AEhnCoC;;AAAe;;AAApC;;;AAAP;AFonCA;;AAAA;;AAAA;;;AAAA;;AACO;;AAxDV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsDO;;;;;;;;;;;;;;;;AAIP;;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AA1jCU;AAAA;AAAA;AAAA;AAAP;AAulCA;;;AACA;;;AACA;;;AAjmCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsFO;AAAA;;AAAA;AAAA;AAAsB;;AAAtB;AA4uBP;AACO;AAAA;AAAA;AAAA;AAAA;;AAAoB;AAAA;AAAA;AAAA;AAApB;AAAA;;AAAA;AAAP;AACO;;AAAA;;;AAAA;AAAA;;AAAsB;;;AAAtB;AAAP;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAgB;AAAhB;AAAP;AAER;;;AAEgB;AAAA;AAAA;AAAA;AAA4B;AAA5B;AADa;;;AAIb;;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AADJ;AAImC;AAAA;AAAA;AAAA;AApyBpB;;AAAZ;AAqyBA;;AAAA;;AACJ;AAAc;;AAAd;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAX;;;AACmB;;AAAA;AAAA;AAAA;;AAAA;AACJ;;AAAA;AAAA;AAAA;AAAA;AAAc;;AAAd;AAAP;AAKuB;;AAAA;AAAA;;;AACA;;AAAA;;;AACW;;AAAA;;;AACC;;AAAA;;;AACD;;AAAA;;;AACC;;AAAA;;;AAR/B;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAaA;;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAA6B;AAA7B;AAAA;AAAA;AAAA;AAuPO;;AAnCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1jCU;AAAA;AAAA;AAAA;AAAP;AAAA;AA4mC6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AACX;AAAA;AAAA;AAAA;AACQ;AAAA;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACI;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACL;AAAA;;AAAA;AAAA;AACS;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AACT;AAAA;;AAAA;AAAA;AACC;AAAA;;AAAA;AAAA;AAfhB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAZV;AAAA;AAAA;AAAA;AAAA;AAAA;AA/lCU;AAAA;AAAA;AAAA;AAAP;AAyoCG;AAAA;AAAA;AAAA;AAAqB;AAAA;AAAA;AAAA;AAArB;AAAX;;;AAEyB;AAAA;AAAA;AAAA;AADN;AAEQ;;AAFR;AAGY;AAHZ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAbd;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBmC;AAAA;AAAA;AAAA;AAAzB;;;AAxBV;;;AExmCG;;;AAdH;AAAA;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1Hc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AA2HG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9FM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqHJ;;;AAnHG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiHJ;;;AA/GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6GJ;;;AA3GG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAwGP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1HO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAyHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhGM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoHJ;;;AAlHG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgHJ;;;AA9GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA4GJ;;;AA1GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA2GP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL+B;;AAAgB;;AAArC;;;AAAP;AAgMA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAtM+B;;AAAc;;AAAnC;;;AAAP;AAmNA;;AAAA;AAAA;AACO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AAXV;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAtBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAkBU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA9TL;;AAAA;AAAA;AAAA;AAAA;;AA6TC;AAGO;AAAA;AAjDlB;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Ce;;AAzTL;;AAAA;AAAA;AAAA;AAAA;;AAwTC;AAGO;AAAA;AA5ClB;;;AAqCe;;AApTL;;AAAA;AAAA;AAAA;AAAA;;AAmTC;AAGO;AAAA;AAvClB;;;AAgCe;;AA/SL;;AAAA;AAAA;AAAA;AAAA;;AA8SC;AAGO;AAAA;AAlClB;;;AA2Be;;AA1SL;;AAAA;AAAA;AAAA;AAAA;;AAySC;AAGO;AAAA;AA7BlB;;;AAsBkB;;;;;;;;;;;;;;;;;;AAtBlB;;;AH9SD;;;AAEe;;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAgBJ;;;AApB8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqCW;AAAA;AAAA;AAIM;AAAA;;AAAA;AAAA;AAAiC;;AAAA;;AAAA;AAAjC;AAEb;AAAA;;AAAA;AAAA;AAAkC;;AAAA;;AAAA;AAAlC;AAMgB;;AAAA;AAAA;AAAgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAIgB;AAAA;;AAAA;AAAA;AADf;;AAAA;;AAAA;;AAAA;;;AAMtB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAI+B;AAAA;;AAAA;AAAA;AAA/B;AAAA;;AACgC;AAAA;;AAAA;AAAA;AAAhC;AAAA;;AAG0B;AAAA;AAAA;AAAA;AAA1B;AAAA;;AAIA;;AAAA;AAAA;AACA;AAEJ;;;;;;AAzE8B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AC+GO;AAAA;AAAA;AAAA;AAAe;;AAAf;ADnCf;;;AACY;AAEO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACR;;AAAA;AAAA;AAAA;;AAAX;;;AACY;AAGJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAC0B;AAA1B;AAAA;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;AAAA;AAAA;;AAAA;AAAA;;ACyCJ;;;AAIO;;AAAA;;;AAAA;;AAAA;;;AACQ;AAAP;AACQ;;AAAA;;AAAA;AACL;;AAAA;AAAP;AAEJ;;;AAEJ;;AAAA;;;AACmB;AAAP;AACG;AAAA;;AAAA;AAAA;AAAP;AAAA;AACoC;AAAA;;AAAA;AAAA;AAA7B;;AAAA;AAAA;;AAAA;;;AAAP;AAEJ;;;AAOJ;;AAAA;;;AACmB;AAAP;AAEA;AAAA;;AAAA;AAAA;AAEA;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;AAwBJ;;;AAEsB;AAAA;AAAA;AAAA;AAAX;;AAAA;AAAP;AAdO;;AAAY;;AAAZ;AAgBA;AAAc;;AAAd;AAAA;AAAA;AAAA;AAAA;;AAAP;AAZO;;AAAW;;AAAX;AAeS;;AAAA;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAAP;AACO;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAuGJ;;;AA1DO;;AARC;AAQD;AAAA;;;AAAA;;AAPC;AAOD;AAAA;;;AAAA;;AANC;;AAMD;AAAA;;;AAAA;;AALC;;AAKD;AAAA;;;AAAA;;AAJC;;AAID;AAAA;;;AACQ;AA6DX;;AA1DR;;AAAA;;;AAEmB;AAwDJ;;;AAtDJ;;AAAiB;;AAAjB;AAAA;;;AAAyC;;AAAiB;;AAAjB;AAAzC;;;AAIQ;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAkDJ;;;;AAAA;;;AA7CJ;;AAAiB;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;;AA2CJ;;;;AAAA;;;AArCJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;;AAmCJ;;;;AAAA;;;AA5BJ;;AAAiB;;AAAjB;AAAX;;;AAEmB;;AAAc;;AAAd;AA0BJ;;;AAxBA;AAwBA;;;AAkBH;AAAA;;AAAA;AAAA;AAAsB;AAAtB;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;;;AADJ;;AAAA;AA8CJ;;;AASQ;;AAAA;;AAAA;AAAA;AAAA;;;AACG;AAAA;;AAAA;AAAA;AADH;;;AAEG;AAAA;;AAAA;AAAA;AAFH;;;AAIO;AAAP;;AAAA;;AAAA;AAEA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHM;;;AAQN;AAAA;;AAAA;AAAA;AAHG;;AAAA;AAAA;;;AAAP;;AAAA;;AAAA;AA+DJ;;;AAMJ;;AAAA;;;AACY;;AAAA;AACU;AAAA;;AAAA;AAAA;AACV;AAAA;;AAAA;AAAA;AADmC;;AAAA;;AAAA;;;AAAzB;AAKd;AAAA;AAGI;AAAA;;AAAA;AAAA;AAFG;;AAAA;AAAA;;AAAA;;;AAAP;AAyIJ;;;;;;;;AAUW;;AAAA;AAAA;AAAkB;AAAA;AAAA;AAAA;AAAlB;AAAP;AACO;;AAAA;;AAAA;AAAwB;;AAAxB;AAAP;AAEa;;AAAA;AAAA;AAAA;AACI;AAAd;AAAA;AAAX;;;AA5ee;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+eH;AAEI;AAAA;;AAAA;AAAA;AAA6B;AAAA;;AAAA;AAAA;AAA7B;AADJ;AAG6B;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAC6B;;AAAA;;AAAA;AAA7B;;AAAA;AAAA;AACA;;AAAwB;AAAxB;AACiC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;AAAc;;AAAd;AA7LJ;;AAAA;AACO;AAAA;;AAAA;AAAA;AA6LH;;AAAA;AAGmB;AAHnB;;;;AAAA;;AAKA;;AAAA;;AAAA;;AAAA;AA/fG;AAAA;AAAA;AAAA;AAAe;;AAAf;AAYA;AAAP;AAsfA;AAAA;;AAAA;AAAA;AAAyB;;AAAA;;;AAAA;;AAAzB;AAAA;;AAAA;AAAA;AAEG;;AAAc;;AAAd;AAAX;;;AAIgB;;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAHY;;;AAMI;AAAA;;AAAA;AAAA;AAAhB;AAAA;;AAiFL;AAAA;;AAAA;AAAA;AAAA;;;AAAqC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA9B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACR;AAAA;;AAAA;AAAA;AAAA;;;AAAmC;AAAA;;AAAA;AAAA;AAAP;;AAAA;AAA5B;;;AACQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AArFP;;AAAA;;AAAA;AAYD;;AAAc;;AAAd;AAAX;;;AACyC;;AAAA;;AAAA;AAA7B;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAKD;;;AAAX;;;AACe;;AAAc;;AAAd;AAAf;;;AAI2B;AAAA;AAAA;AAAA;AAA4B;AAAA;AAAA;AAAA;AAA5B;AACD;;AADA;AADF;;AAAA;AAFR;AAAA;;;AA9LU;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACJ;AAAd;;AACwB;AAAxB;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAX;;;AAE8B;;AAAA;;AAAA;;;AAAA;AAAA;;AAKM;AAAxB;;;;AAEc;AAAA;AAAA;AAAA;AAAoB;AAApB;AAAA;;AACM;AAAA;AAAA;AAAA;AAAlB;;AAAA;AAAd;;;AAC2B;;AAAA;;;AAAA;AAAA;;AACK;AAAA;AAAA;AAAA;;AAEuB;;AAArB;AAAA;;;AAClB;;AAAqB;;AAArB;AAAA;;;AACI;;AAAA;;AAAA;AADJ;;;;AAGhB;;;AACA;;AAAA;;;AAC4C;AAAxB;;AAOR;;AAAmB;AAAnB;AAAA;;;;;AAHY;;AAAA;;AAAA;AAFc;;AAAA;AAAA;;;AAAA;AAAA;;AAIlB;;AAAA;AAAA;;;;;;;;;AAGZ;;AAAA;AACY;AAAA;;AAAA;AAAA;AACT;;AAAA;;AAAA;AAAc;AAAd;AAAX;;;AAEyB;AAAA;;AAAA;AAAA;AAAb;AAGA;AAAA;;AAAA;AAAA;AAFG;;AAAA;;;AA+JC;;AAAA;AAAA;AAKR;AAAA;AAAA;AAAA;AAAqB;AAArB;AAAA;AAAA;AAAA;AACA;;AAEW;AACQ;AAHnB;;;;AAAA;;;;;;;;;AAFqC;;AAAA;;AAAA;AAAjC;;AAAA;AAAA;;;;AAjBC;;AAAc;;AAAd;AAAb;;;AAE6C;AAAA;;AAAA;AAAA;AAAjC;;AAAA;AAAA;;;;AAdC;;AAAc;;AAAd;AAAb;;;AACwB;;AAAA;;AAAA;AAAA;AAAA;;AACxB;;;AAC4B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAChB;;AAAA;;AAAA;;;;AAEG;;AAAA;;AAAA;AAAA;AAAA;;AAAf;;;AACgB;;AAAA;;AAAA;;;;AAkCZ;;;AAUwB;;AACH;;AAAA;AAAA;AACE;;AAAA;;;AACI;;AAAA;;;AACJ;;AAGW;;AALX;AAKW;AA6BtC;;AAAA;;;AACmB;AA/BS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAIA;AAAA;;AAAA;AAAA;AACH;;AAAA;AAAiB;AAAjB;AAZb;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;;;;;;AAwCG;;AAAe;AAAf;AAAA;;;AAAA;;AAAsC;;AAAtC;AAAA;;;AACQ;AAhCC;;;AAiCL;;;AAjCK;;;AErpBhB;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", + "op_pc_offset": 0, + "pc_events": { + "1": { + "subroutine": "algopy.arc4.ARC4Contract.approval_program", + "params": {}, + "block": "main", + "stack_in": [], + "op": "intcblock 0 1 8 32 1500" + }, + "9": { + "op": "bytecblock 0x151f7c75 \"status\" \"event_cursor\" \"schedule_entry_count\" \"outstanding_principal\" \"fixed_point_scale\" \"accrued_interest\" \"interest_calculation_base\" 0x4123 \"nominal_interest_rate\" \"contract_type\" \"reserved_units_total\" \"reserved_principal\" \"total_units\" \"next_principal_redemption\" \"reserved_interest\" \"cumulative_interest_index\" \"cumulative_principal_index\" 0x523a41525223 \"settlement_asset_id\" \"initial_exchange_amount\" 0x523a41555423 0x523a50594423 0x523a4d4e4723 0x5323 0x523a4d4f4323 0x523a54525323 0x523a4f504423 \"initial_exchange_date\" \"transfer_opening_date\" \"transfer_closure_date\" \"rate_reset_floor\" \"rate_reset_cap\" \"contract_suspended\" \"defaulted\" \"dynamic_principal_redemption\" \"rate_reset_spread\" \"rate_reset_multiplier\" \"rate_reset_next\" \"has_rate_reset_floor\" \"has_rate_reset_cap\" 0x00 \"prospectus_hash\" \"prospectus_url\" \"denomination_asset_id\" \"maturity_date\" \"day_count_convention\" 0x068101 0x0000" + }, + "773": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "775": { + "op": "bnz main_after_if_else@2", + "stack_out": [] + }, + "778": { + "op": "bytec 18 // 0x523a41525223", + "defined_out": [ + "0x523a41525223" + ], + "stack_out": [ + "0x523a41525223" + ] + }, + "780": { + "op": "global ZeroAddress", + "defined_out": [ + "0x523a41525223", + "tmp%0#3" + ], + "stack_out": [ + "0x523a41525223", + "tmp%0#3" + ] + }, + "782": { + "op": "app_global_put", + "stack_out": [] + }, + "783": { + "op": "bytec 27 // 0x523a4f504423", + "defined_out": [ + "0x523a4f504423" + ], + "stack_out": [ + "0x523a4f504423" + ] + }, + "785": { + "op": "global ZeroAddress", + "defined_out": [ + "0x523a4f504423", + "tmp%1#3" + ], + "stack_out": [ + "0x523a4f504423", + "tmp%1#3" + ] + }, + "787": { + "op": "app_global_put", + "stack_out": [] + }, + "788": { + "op": "bytec 33 // \"contract_suspended\"", + "defined_out": [ + "\"contract_suspended\"" + ], + "stack_out": [ + "\"contract_suspended\"" + ] + }, + "790": { + "op": "intc_0 // 0", + "defined_out": [ + "\"contract_suspended\"", + "0" + ], + "stack_out": [ + "\"contract_suspended\"", + "0" + ] + }, + "791": { + "op": "app_global_put", + "stack_out": [] + }, + "792": { + "op": "bytec 34 // \"defaulted\"", + "defined_out": [ + "\"defaulted\"" + ], + "stack_out": [ + "\"defaulted\"" + ] + }, + "794": { + "op": "intc_0 // 0", + "stack_out": [ + "\"defaulted\"", + "0" + ] + }, + "795": { + "op": "app_global_put", + "stack_out": [] + }, + "796": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"" + ], + "stack_out": [ + "\"status\"" + ] + }, + "797": { + "op": "intc_0 // 0", + "stack_out": [ + "\"status\"", + "0" + ] + }, + "798": { + "op": "app_global_put", + "stack_out": [] + }, + "799": { + "op": "bytec 10 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"" + ], + "stack_out": [ + "\"contract_type\"" + ] + }, + "801": { + "op": "intc_0 // 0", + "stack_out": [ + "\"contract_type\"", + "0" + ] + }, + "802": { + "op": "app_global_put", + "stack_out": [] + }, + "803": { + "op": "bytec 42 // \"prospectus_hash\"", + "defined_out": [ + "\"prospectus_hash\"" + ], + "stack_out": [ + "\"prospectus_hash\"" + ] + }, + "805": { + "op": "pushbytes 0x", + "defined_out": [ + "\"prospectus_hash\"", + "0x" + ], + "stack_out": [ + "\"prospectus_hash\"", + "0x" + ] + }, + "807": { + "op": "app_global_put", + "stack_out": [] + }, + "808": { + "op": "bytec 43 // \"prospectus_url\"", + "defined_out": [ + "\"prospectus_url\"" + ], + "stack_out": [ + "\"prospectus_url\"" + ] + }, + "810": { + "op": "pushbytes \"\"", + "defined_out": [ + "\"\"", + "\"prospectus_url\"" + ], + "stack_out": [ + "\"prospectus_url\"", + "\"\"" + ] + }, + "812": { + "op": "app_global_put", + "stack_out": [] + }, + "813": { + "op": "bytec 44 // \"denomination_asset_id\"", + "defined_out": [ + "\"denomination_asset_id\"" + ], + "stack_out": [ + "\"denomination_asset_id\"" + ] + }, + "815": { + "op": "intc_0 // 0", + "stack_out": [ + "\"denomination_asset_id\"", + "0" + ] + }, + "816": { + "op": "app_global_put", + "stack_out": [] + }, + "817": { + "op": "bytec 19 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"" + ], + "stack_out": [ + "\"settlement_asset_id\"" + ] + }, + "819": { + "op": "intc_0 // 0", + "stack_out": [ + "\"settlement_asset_id\"", + "0" + ] + }, + "820": { + "op": "app_global_put", + "stack_out": [] + }, + "821": { + "op": "bytec 28 // \"initial_exchange_date\"", + "defined_out": [ + "\"initial_exchange_date\"" + ], + "stack_out": [ + "\"initial_exchange_date\"" + ] + }, + "823": { + "op": "intc_0 // 0", + "stack_out": [ + "\"initial_exchange_date\"", + "0" + ] + }, + "824": { + "op": "app_global_put", + "stack_out": [] + }, + "825": { + "op": "bytec 45 // \"maturity_date\"", + "defined_out": [ + "\"maturity_date\"" + ], + "stack_out": [ + "\"maturity_date\"" + ] + }, + "827": { + "op": "intc_0 // 0", + "stack_out": [ + "\"maturity_date\"", + "0" + ] + }, + "828": { + "op": "app_global_put", + "stack_out": [] + }, + "829": { + "op": "bytec 29 // \"transfer_opening_date\"", + "defined_out": [ + "\"transfer_opening_date\"" + ], + "stack_out": [ + "\"transfer_opening_date\"" + ] + }, + "831": { + "op": "intc_0 // 0", + "stack_out": [ + "\"transfer_opening_date\"", + "0" + ] + }, + "832": { + "op": "app_global_put", + "stack_out": [] + }, + "833": { + "op": "bytec 30 // \"transfer_closure_date\"", + "defined_out": [ + "\"transfer_closure_date\"" + ], + "stack_out": [ + "\"transfer_closure_date\"" + ] + }, + "835": { + "op": "intc_0 // 0", + "stack_out": [ + "\"transfer_closure_date\"", + "0" + ] + }, + "836": { + "op": "app_global_put", + "stack_out": [] + }, + "837": { + "op": "bytec 46 // \"day_count_convention\"", + "defined_out": [ + "\"day_count_convention\"" + ], + "stack_out": [ + "\"day_count_convention\"" + ] + }, + "839": { + "op": "intc_0 // 0", + "stack_out": [ + "\"day_count_convention\"", + "0" + ] + }, + "840": { + "op": "app_global_put", + "stack_out": [] + }, + "841": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"" + ], + "stack_out": [ + "\"total_units\"" + ] + }, + "843": { + "op": "intc_0 // 0", + "stack_out": [ + "\"total_units\"", + "0" + ] + }, + "844": { + "op": "app_global_put", + "stack_out": [] + }, + "845": { + "op": "bytec 11 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"" + ], + "stack_out": [ + "\"reserved_units_total\"" + ] + }, + "847": { + "op": "intc_0 // 0", + "stack_out": [ + "\"reserved_units_total\"", + "0" + ] + }, + "848": { + "op": "app_global_put", + "stack_out": [] + }, + "849": { + "op": "bytec 20 // \"initial_exchange_amount\"", + "defined_out": [ + "\"initial_exchange_amount\"" + ], + "stack_out": [ + "\"initial_exchange_amount\"" + ] + }, + "851": { + "op": "intc_0 // 0", + "stack_out": [ + "\"initial_exchange_amount\"", + "0" + ] + }, + "852": { + "op": "app_global_put", + "stack_out": [] + }, + "853": { + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"" + ], + "stack_out": [ + "\"outstanding_principal\"" + ] + }, + "855": { + "op": "intc_0 // 0", + "stack_out": [ + "\"outstanding_principal\"", + "0" + ] + }, + "856": { + "op": "app_global_put", + "stack_out": [] + }, + "857": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"" + ], + "stack_out": [ + "\"next_principal_redemption\"" + ] + }, + "859": { + "op": "intc_0 // 0", + "stack_out": [ + "\"next_principal_redemption\"", + "0" + ] + }, + "860": { + "op": "app_global_put", + "stack_out": [] + }, + "861": { + "op": "bytec 35 // \"dynamic_principal_redemption\"", + "defined_out": [ + "\"dynamic_principal_redemption\"" + ], + "stack_out": [ + "\"dynamic_principal_redemption\"" + ] + }, + "863": { + "op": "intc_0 // 0", + "stack_out": [ + "\"dynamic_principal_redemption\"", + "0" + ] + }, + "864": { + "op": "app_global_put", + "stack_out": [] + }, + "865": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"" + ], + "stack_out": [ + "\"interest_calculation_base\"" + ] + }, + "867": { + "op": "intc_0 // 0", + "stack_out": [ + "\"interest_calculation_base\"", + "0" + ] + }, + "868": { + "op": "app_global_put", + "stack_out": [] + }, + "869": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"" + ], + "stack_out": [ + "\"accrued_interest\"" + ] + }, + "871": { + "op": "intc_0 // 0", + "stack_out": [ + "\"accrued_interest\"", + "0" + ] + }, + "872": { + "op": "app_global_put", + "stack_out": [] + }, + "873": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"" + ], + "stack_out": [ + "\"nominal_interest_rate\"" + ] + }, + "875": { + "op": "intc_0 // 0", + "stack_out": [ + "\"nominal_interest_rate\"", + "0" + ] + }, + "876": { + "op": "app_global_put", + "stack_out": [] + }, + "877": { + "op": "bytec 36 // \"rate_reset_spread\"", + "defined_out": [ + "\"rate_reset_spread\"" + ], + "stack_out": [ + "\"rate_reset_spread\"" + ] + }, + "879": { + "op": "intc_0 // 0", + "stack_out": [ + "\"rate_reset_spread\"", + "0" + ] + }, + "880": { + "op": "app_global_put", + "stack_out": [] + }, + "881": { + "op": "bytec 37 // \"rate_reset_multiplier\"", + "defined_out": [ + "\"rate_reset_multiplier\"" + ], + "stack_out": [ + "\"rate_reset_multiplier\"" + ] + }, + "883": { + "op": "intc_0 // 0", + "stack_out": [ + "\"rate_reset_multiplier\"", + "0" + ] + }, + "884": { + "op": "app_global_put", + "stack_out": [] + }, + "885": { + "op": "bytec 31 // \"rate_reset_floor\"", + "defined_out": [ + "\"rate_reset_floor\"" + ], + "stack_out": [ + "\"rate_reset_floor\"" + ] + }, + "887": { + "op": "intc_0 // 0", + "stack_out": [ + "\"rate_reset_floor\"", + "0" + ] + }, + "888": { + "op": "app_global_put", + "stack_out": [] + }, + "889": { + "op": "bytec 32 // \"rate_reset_cap\"", + "defined_out": [ + "\"rate_reset_cap\"" + ], + "stack_out": [ + "\"rate_reset_cap\"" + ] + }, + "891": { + "op": "intc_0 // 0", + "stack_out": [ + "\"rate_reset_cap\"", + "0" + ] + }, + "892": { + "op": "app_global_put", + "stack_out": [] + }, + "893": { + "op": "bytec 38 // \"rate_reset_next\"", + "defined_out": [ + "\"rate_reset_next\"" + ], + "stack_out": [ + "\"rate_reset_next\"" + ] + }, + "895": { + "op": "intc_0 // 0", + "stack_out": [ + "\"rate_reset_next\"", + "0" + ] + }, + "896": { + "op": "app_global_put", + "stack_out": [] + }, + "897": { + "op": "bytec 39 // \"has_rate_reset_floor\"", + "defined_out": [ + "\"has_rate_reset_floor\"" + ], + "stack_out": [ + "\"has_rate_reset_floor\"" + ] + }, + "899": { + "op": "intc_0 // 0", + "stack_out": [ + "\"has_rate_reset_floor\"", + "0" + ] + }, + "900": { + "op": "app_global_put", + "stack_out": [] + }, + "901": { + "op": "bytec 40 // \"has_rate_reset_cap\"", + "defined_out": [ + "\"has_rate_reset_cap\"" + ], + "stack_out": [ + "\"has_rate_reset_cap\"" + ] + }, + "903": { + "op": "intc_0 // 0", + "stack_out": [ + "\"has_rate_reset_cap\"", + "0" + ] + }, + "904": { + "op": "app_global_put", + "stack_out": [] + }, + "905": { + "op": "bytec 12 // \"reserved_principal\"", + "defined_out": [ + "\"reserved_principal\"" + ], + "stack_out": [ + "\"reserved_principal\"" + ] + }, + "907": { + "op": "intc_0 // 0", + "stack_out": [ + "\"reserved_principal\"", + "0" + ] + }, + "908": { + "op": "app_global_put", + "stack_out": [] + }, + "909": { + "op": "bytec 15 // \"reserved_interest\"", + "defined_out": [ + "\"reserved_interest\"" + ], + "stack_out": [ + "\"reserved_interest\"" + ] + }, + "911": { + "op": "intc_0 // 0", + "stack_out": [ + "\"reserved_interest\"", + "0" + ] + }, + "912": { + "op": "app_global_put", + "stack_out": [] + }, + "913": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "defined_out": [ + "\"cumulative_interest_index\"" + ], + "stack_out": [ + "\"cumulative_interest_index\"" + ] + }, + "915": { + "op": "intc_0 // 0", + "stack_out": [ + "\"cumulative_interest_index\"", + "0" + ] + }, + "916": { + "op": "app_global_put", + "stack_out": [] + }, + "917": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "defined_out": [ + "\"cumulative_principal_index\"" + ], + "stack_out": [ + "\"cumulative_principal_index\"" + ] + }, + "919": { + "op": "intc_0 // 0", + "stack_out": [ + "\"cumulative_principal_index\"", + "0" + ] + }, + "920": { + "op": "app_global_put", + "stack_out": [] + }, + "921": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"" + ], + "stack_out": [ + "\"event_cursor\"" + ] + }, + "922": { + "op": "intc_0 // 0", + "stack_out": [ + "\"event_cursor\"", + "0" + ] + }, + "923": { + "op": "app_global_put", + "stack_out": [] + }, + "924": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"" + ], + "stack_out": [ + "\"schedule_entry_count\"" + ] + }, + "925": { + "op": "intc_0 // 0", + "stack_out": [ + "\"schedule_entry_count\"", + "0" + ] + }, + "926": { + "op": "app_global_put", + "stack_out": [] + }, + "927": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"" + ], + "stack_out": [ + "\"fixed_point_scale\"" + ] + }, + "929": { + "op": "intc_0 // 0", + "stack_out": [ + "\"fixed_point_scale\"", + "0" + ] + }, + "930": { + "op": "app_global_put", + "stack_out": [] + }, + "931": { + "op": "txn GlobalNumByteSlice", + "defined_out": [ + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2" + ] + }, + "933": { + "op": "pushint 10", + "defined_out": [ + "10", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "10" + ] + }, + "935": { + "op": "==", + "defined_out": [ + "tmp%1#2" + ], + "stack_out": [ + "tmp%1#2" + ] + }, + "936": { + "error": "Wrong Global Bytes allocation", + "op": "assert // Wrong Global Bytes allocation", + "stack_out": [] + }, + "937": { + "op": "txn GlobalNumUint", + "defined_out": [ + "tmp%2#1" + ], + "stack_out": [ + "tmp%2#1" + ] + }, + "939": { + "op": "pushint 54", + "defined_out": [ + "54", + "tmp%2#1" + ], + "stack_out": [ + "tmp%2#1", + "54" + ] + }, + "941": { + "op": "==", + "defined_out": [ + "tmp%3#1" + ], + "stack_out": [ + "tmp%3#1" + ] + }, + "942": { + "error": "Wrong Global UInts allocation", + "op": "assert // Wrong Global UInts allocation", + "stack_out": [] + }, + "943": { + "op": "txn LocalNumByteSlice", + "defined_out": [ + "tmp%4#1" + ], + "stack_out": [ + "tmp%4#1" + ] + }, + "945": { + "op": "!", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "tmp%5#0" + ] + }, + "946": { + "error": "Wrong Local Bytes allocation", + "op": "assert // Wrong Local Bytes allocation", + "stack_out": [] + }, + "947": { + "op": "txn LocalNumUint", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "949": { + "op": "!", + "defined_out": [ + "tmp%7#0" + ], + "stack_out": [ + "tmp%7#0" + ] + }, + "950": { + "error": "Wrong Local UInts allocation", + "op": "assert // Wrong Local UInts allocation", + "stack_out": [] + }, + "951": { + "block": "main_after_if_else@2", + "stack_in": [], + "op": "pushbytes 0x914f04eb // method \"contract_update()void\"", + "defined_out": [ + "Method(contract_update()void)" + ], + "stack_out": [ + "Method(contract_update()void)" + ] + }, + "957": { + "op": "txna ApplicationArgs 0", + "defined_out": [ + "Method(contract_update()void)", + "tmp%0#1" + ], + "stack_out": [ + "Method(contract_update()void)", + "tmp%0#1" + ] + }, + "960": { + "op": "match main_contract_update_route@4", + "stack_out": [] + }, + "964": { + "block": "main_switch_case_next@5", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "966": { + "op": "!", + "defined_out": [ + "tmp%7#0" + ], + "stack_out": [ + "tmp%7#0" + ] + }, + "967": { + "op": "assert", + "stack_out": [] + }, + "968": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "tmp%8#0" + ] + }, + "970": { + "op": "bz main_create_NoOp@33", + "stack_out": [] + }, + "973": { + "op": "pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x39241fa3 0x010c8299 0x7406acd2 0x1a72a2ee // method \"fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)\", method \"claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])\", method \"transfer_set_schedule(uint64,uint64)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"transfer(address,address,uint64)uint64\", method \"account_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)\", method \"contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64\", method \"contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64\", method \"contract_execute_ied()uint64\", method \"apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64\", method \"contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_contract_default(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", + "defined_out": [ + "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", + "Method(account_open(address,address)uint64)", + "Method(account_suspension(address,bool)uint64)", + "Method(account_update_payment_address(address,address)uint64)", + "Method(append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", + "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", + "Method(contract_execute_ied()uint64)", + "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", + "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", + "Method(primary_distribution(address,uint64)uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_contract_default(bool)uint64)", + "Method(rbac_contract_suspension(bool)uint64)", + "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", + "Method(rbac_get_arranger()address)", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", + "Method(rbac_revoke_role(uint8,address)uint64)", + "Method(rbac_rotate_arranger(address)uint64)", + "Method(rbac_set_op_daemon(address)uint64)", + "Method(transfer(address,address,uint64)uint64)", + "Method(transfer_set_schedule(uint64,uint64)uint64)" + ], + "stack_out": [ + "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", + "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", + "Method(transfer_set_schedule(uint64,uint64)uint64)", + "Method(primary_distribution(address,uint64)uint64)", + "Method(transfer(address,address,uint64)uint64)", + "Method(account_suspension(address,bool)uint64)", + "Method(account_open(address,address)uint64)", + "Method(account_update_payment_address(address,address)uint64)", + "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", + "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", + "Method(contract_execute_ied()uint64)", + "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(rbac_rotate_arranger(address)uint64)", + "Method(rbac_set_op_daemon(address)uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_revoke_role(uint8,address)uint64)", + "Method(rbac_contract_suspension(bool)uint64)", + "Method(rbac_contract_default(bool)uint64)", + "Method(rbac_get_arranger()address)", + "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))" + ] + }, + "1100": { + "op": "txna ApplicationArgs 0", + "defined_out": [ + "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", + "Method(account_open(address,address)uint64)", + "Method(account_suspension(address,bool)uint64)", + "Method(account_update_payment_address(address,address)uint64)", + "Method(append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", + "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", + "Method(contract_execute_ied()uint64)", + "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", + "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", + "Method(primary_distribution(address,uint64)uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_contract_default(bool)uint64)", + "Method(rbac_contract_suspension(bool)uint64)", + "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", + "Method(rbac_get_arranger()address)", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", + "Method(rbac_revoke_role(uint8,address)uint64)", + "Method(rbac_rotate_arranger(address)uint64)", + "Method(rbac_set_op_daemon(address)uint64)", + "Method(transfer(address,address,uint64)uint64)", + "Method(transfer_set_schedule(uint64,uint64)uint64)", + "tmp%10#0" + ], + "stack_out": [ + "Method(fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64))", + "Method(claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]))", + "Method(transfer_set_schedule(uint64,uint64)uint64)", + "Method(primary_distribution(address,uint64)uint64)", + "Method(transfer(address,address,uint64)uint64)", + "Method(account_suspension(address,bool)uint64)", + "Method(account_open(address,address)uint64)", + "Method(account_update_payment_address(address,address)uint64)", + "Method(account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64)", + "Method(contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64)", + "Method(contract_execute_ied()uint64)", + "Method(apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64)", + "Method(contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))", + "Method(rbac_rotate_arranger(address)uint64)", + "Method(rbac_set_op_daemon(address)uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_revoke_role(uint8,address)uint64)", + "Method(rbac_contract_suspension(bool)uint64)", + "Method(rbac_contract_default(bool)uint64)", + "Method(rbac_get_arranger()address)", + "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", + "tmp%10#0" + ] + }, + "1103": { + "op": "match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_contract_default rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", + "stack_out": [] + }, + "1155": { + "op": "err" + }, + "1156": { + "block": "main_create_NoOp@33", + "stack_in": [], + "op": "pushbytes 0x956d7156 // method \"contract_create(address)uint64\"", + "defined_out": [ + "Method(contract_create(address)uint64)" + ], + "stack_out": [ + "Method(contract_create(address)uint64)" + ] + }, + "1162": { + "op": "txna ApplicationArgs 0", + "defined_out": [ + "Method(contract_create(address)uint64)", + "tmp%11#0" + ], + "stack_out": [ + "Method(contract_create(address)uint64)", + "tmp%11#0" + ] + }, + "1165": { + "op": "match contract_create", + "stack_out": [] + }, + "1169": { + "op": "err" + }, + "1170": { + "block": "main_contract_update_route@4", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%1#1" + ], + "stack_out": [ + "tmp%1#1" + ] + }, + "1172": { + "op": "pushint 4 // UpdateApplication", + "defined_out": [ + "UpdateApplication", + "tmp%1#1" + ], + "stack_out": [ + "tmp%1#1", + "UpdateApplication" + ] + }, + "1174": { + "op": "==", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "1175": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%2#0", + "tmp%3#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%3#0" + ] + }, + "1177": { + "op": "&&", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "tmp%5#0" + ] + }, + "1178": { + "op": "assert", + "stack_out": [] + }, + "1179": { + "op": "b contract_update" + }, + "1182": { + "subroutine": "_puya_lib.util.ensure_budget", + "params": { + "required_budget#0": "uint64", + "fee_source#0": "uint64" + }, + "block": "ensure_budget", + "stack_in": [], + "op": "proto 2 0" + }, + "1185": { + "op": "frame_dig -2", + "defined_out": [ + "required_budget#0 (copy)" + ], + "stack_out": [ + "required_budget#0 (copy)" + ] + }, + "1187": { + "op": "pushint 10", + "defined_out": [ + "10", + "required_budget#0 (copy)" + ], + "stack_out": [ + "required_budget#0 (copy)", + "10" + ] + }, + "1189": { + "op": "+", + "defined_out": [ + "required_budget_with_buffer#0" + ], + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1190": { + "block": "ensure_budget_while_top@1", + "stack_in": [ + "required_budget_with_buffer#0" + ], + "op": "frame_dig 0", + "defined_out": [ + "required_budget_with_buffer#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "required_budget_with_buffer#0" + ] + }, + "1192": { + "op": "global OpcodeBudget", + "defined_out": [ + "required_budget_with_buffer#0", + "tmp%1#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "required_budget_with_buffer#0", + "tmp%1#0" + ] + }, + "1194": { + "op": ">", + "defined_out": [ + "required_budget_with_buffer#0", + "tmp%2#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "tmp%2#0" + ] + }, + "1195": { + "op": "bz ensure_budget_after_while@6", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1198": { + "op": "itxn_begin" + }, + "1199": { + "op": "pushint 6 // appl", + "defined_out": [ + "appl", + "required_budget_with_buffer#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "appl" + ] + }, + "1201": { + "op": "itxn_field TypeEnum", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1203": { + "op": "pushint 5 // DeleteApplication", + "defined_out": [ + "DeleteApplication", + "required_budget_with_buffer#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "DeleteApplication" + ] + }, + "1205": { + "op": "itxn_field OnCompletion", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1207": { + "op": "bytec 47 // 0x068101", + "defined_out": [ + "0x068101", + "required_budget_with_buffer#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "0x068101" + ] + }, + "1209": { + "op": "itxn_field ApprovalProgram", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1211": { + "op": "bytec 47 // 0x068101", + "stack_out": [ + "required_budget_with_buffer#0", + "0x068101" + ] + }, + "1213": { + "op": "itxn_field ClearStateProgram", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1215": { + "op": "frame_dig -1", + "defined_out": [ + "fee_source#0 (copy)", + "required_budget_with_buffer#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "fee_source#0 (copy)" + ] + }, + "1217": { + "op": "switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1223": { + "block": "ensure_budget_switch_case_next@5", + "stack_in": [ + "required_budget_with_buffer#0" + ], + "op": "itxn_submit" + }, + "1224": { + "op": "b ensure_budget_while_top@1" + }, + "1227": { + "block": "ensure_budget_switch_case_1@4", + "stack_in": [ + "required_budget_with_buffer#0" + ], + "op": "global MinTxnFee", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "tmp%3#0" + ] + }, + "1229": { + "op": "itxn_field Fee", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1231": { + "op": "b ensure_budget_switch_case_next@5" + }, + "1234": { + "block": "ensure_budget_switch_case_0@3", + "stack_in": [ + "required_budget_with_buffer#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "required_budget_with_buffer#0", + "0" + ] + }, + "1235": { + "op": "itxn_field Fee", + "stack_out": [ + "required_budget_with_buffer#0" + ] + }, + "1237": { + "op": "b ensure_budget_switch_case_next@5" + }, + "1240": { + "block": "ensure_budget_after_while@6", + "stack_in": [ + "required_budget_with_buffer#0" + ], + "retsub": true, + "op": "retsub" + }, + "1241": { + "subroutine": "modules.payment_agent.PaymentAgent.fund_due_cashflows[routing]", + "params": {}, + "block": "fund_due_cashflows", + "stack_in": [], + "op": "intc_0 // 0", + "stack_out": [ + "entry#0" + ] + }, + "1242": { + "op": "pushbytes \"\"", + "stack_out": [ + "entry#0", + "event_type#0" + ] + }, + "1244": { + "op": "dupn 13", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0" + ] + }, + "1246": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "tmp%0#0" + ] + }, + "1249": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "1250": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "tmp%0#0", + "len%0#0" + ] + }, + "1251": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "tmp%0#0", + "len%0#0", + "8" + ] + }, + "1252": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "tmp%0#0", + "eq%0#0" + ] + }, + "1253": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "tmp%0#0" + ] + }, + "1254": { + "op": "btoi", + "defined_out": [ + "max_event_count#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1255": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1256": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "max_event_count#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"status\"" + ] + }, + "1257": { + "op": "app_global_get_ex", + "defined_out": [ + "max_event_count#0", + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1258": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0" + ] + }, + "1259": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1260": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "1263": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" + }, + "1266": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" + }, + "1269": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1270": { + "op": "bytec_1 // \"status\"", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"status\"" + ] + }, + "1271": { + "op": "app_global_get_ex", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1272": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0" + ] + }, + "1273": { + "op": "pushint 50", + "defined_out": [ + "50", + "max_event_count#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "50" + ] + }, + "1275": { + "op": "==", + "defined_out": [ + "max_event_count#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%0#1" + ] + }, + "1276": { + "op": "!", + "defined_out": [ + "max_event_count#0", + "tmp%0#1", + "tmp%1#4" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%1#4" + ] + }, + "1277": { + "error": "IED not yet executed", + "op": "assert // IED not yet executed", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1278": { + "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", + "op": "callsub _is_dynamic_annuity", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%0#1" + ] + }, + "1281": { + "op": "bz fund_due_cashflows_after_if_else@3", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1284": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "max_event_count#0" + ] + }, + "1285": { + "op": "pushint 100", + "defined_out": [ + "100", + "max_event_count#0", + "tmp%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "max_event_count#0", + "100" + ] + }, + "1287": { + "op": "*", + "defined_out": [ + "max_event_count#0", + "tmp%0#1", + "tmp%1#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%1#1" + ] + }, + "1288": { + "op": "intc 4 // 1500", + "defined_out": [ + "1500", + "max_event_count#0", + "tmp%0#1", + "tmp%1#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%1#1", + "1500" + ] + }, + "1290": { + "op": "+", + "defined_out": [ + "max_event_count#0", + "tmp%0#1", + "tmp%2#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%2#1" + ] + }, + "1291": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%2#1", + "0" + ] + }, + "1292": { + "callsub": "_puya_lib.util.ensure_budget", + "op": "callsub ensure_budget", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1295": { + "block": "fund_due_cashflows_after_if_else@3", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0" + ] + }, + "1296": { + "op": "bury 5", + "defined_out": [ + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1298": { + "op": "intc_0 // 0", + "defined_out": [ + "funded_interest#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "funded_interest#0" + ] + }, + "1299": { + "op": "bury 14", + "defined_out": [ + "funded_interest#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1301": { + "op": "intc_0 // 0", + "defined_out": [ + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "funded_principal#0" + ] + }, + "1302": { + "op": "bury 13", + "defined_out": [ + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1304": { + "block": "fund_due_cashflows_while_top@4", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 4", + "defined_out": [ + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0" + ] + }, + "1306": { + "op": "dig 1", + "defined_out": [ + "max_event_count#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "max_event_count#0" + ] + }, + "1308": { + "op": "<", + "defined_out": [ + "max_event_count#0", + "processed_events#0", + "tmp%3#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%3#1" + ] + }, + "1309": { + "op": "bz fund_due_cashflows_after_while@11", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1312": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "max_event_count#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1313": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "max_event_count#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"event_cursor\"" + ] + }, + "1314": { + "op": "app_global_get_ex", + "defined_out": [ + "max_event_count#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1315": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0" + ] + }, + "1316": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "0" + ] + }, + "1317": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "max_event_count#0", + "maybe_value%0#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "1318": { + "op": "app_global_get_ex", + "defined_out": [ + "max_event_count#0", + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1319": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "1320": { + "op": "<", + "defined_out": [ + "max_event_count#0", + "processed_events#0", + "tmp%4#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%4#0" + ] + }, + "1321": { + "op": "bz fund_due_cashflows_after_while@11", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1324": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1325": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"event_cursor\"" + ] + }, + "1326": { + "op": "app_global_get_ex", + "defined_out": [ + "max_event_count#0", + "maybe_exists%2#0", + "maybe_value%2#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "1327": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%2#0" + ] + }, + "1328": { + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1331": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "entry#0" + ] + }, + "1332": { + "op": "bury 17", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1334": { + "op": "pushint 9", + "defined_out": [ + "9", + "entry#0", + "max_event_count#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "9" + ] + }, + "1336": { + "op": "extract_uint64", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0" + ] + }, + "1337": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0", + "values%0#0" + ] + }, + "1338": { + "op": "bury 3", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0" + ] + }, + "1340": { + "op": "global LatestTimestamp", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0", + "tmp%6#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0", + "tmp%6#0" + ] + }, + "1342": { + "op": ">", + "defined_out": [ + "entry#0", + "max_event_count#0", + "processed_events#0", + "tmp%7#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%7#0" + ] + }, + "1343": { + "op": "bnz fund_due_cashflows_after_while@11", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1346": { + "op": "dig 15", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1348": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "entry#0", + "max_event_count#0", + "processed_events#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "8" + ] + }, + "1349": { + "op": "getbyte", + "defined_out": [ + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1350": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "event_type#0" + ] + }, + "1351": { + "op": "bury 16", + "defined_out": [ + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1353": { + "op": "intc_2 // 8", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "8" + ] + }, + "1354": { + "op": "==", + "defined_out": [ + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%0#1" + ] + }, + "1355": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%0#1", + "tmp%0#1" + ] + }, + "1356": { + "op": "bury 4", + "defined_out": [ + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%0#1" + ] + }, + "1358": { + "op": "bnz fund_due_cashflows_bool_true@52", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1361": { + "op": "dig 14", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1363": { + "op": "pushint 3", + "defined_out": [ + "3", + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "3" + ] + }, + "1365": { + "op": "==", + "defined_out": [ + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "tmp%1#4", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%1#4" + ] + }, + "1366": { + "op": "bnz fund_due_cashflows_bool_true@52", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1369": { + "op": "dig 14", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1371": { + "op": "pushint 19", + "defined_out": [ + "19", + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "19" + ] + }, + "1373": { + "op": "==", + "defined_out": [ + "entry#0", + "event_type#0", + "max_event_count#0", + "processed_events#0", + "tmp%0#1", + "tmp%2#2", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%2#2" + ] + }, + "1374": { + "op": "bz fund_due_cashflows_bool_false@53", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1377": { + "block": "fund_due_cashflows_bool_true@52", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "or_result%0#0" + ] + }, + "1378": { + "block": "fund_due_cashflows_bool_merge@54", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "or_result%0#0" + ], + "op": "bz fund_due_cashflows_after_while@11", + "defined_out": [], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1381": { + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1383": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "0" + ] + }, + "1384": { + "op": "extract_uint64", + "defined_out": [ + "entry#0", + "values%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#1" + ] + }, + "1385": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#1", + "0" + ] + }, + "1386": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "entry#0", + "values%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#1", + "0", + "\"event_cursor\"" + ] + }, + "1387": { + "op": "app_global_get_ex", + "defined_out": [ + "entry#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "values%0#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1388": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#1", + "maybe_value%0#0" + ] + }, + "1389": { + "op": "==", + "defined_out": [ + "entry#0", + "tmp%0#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%0#2" + ] + }, + "1390": { + "error": "Invalid event cursor", + "op": "assert // Invalid event cursor", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1391": { + "op": "dig 1", + "defined_out": [ + "entry#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0" + ] + }, + "1393": { + "op": "global LatestTimestamp", + "defined_out": [ + "entry#0", + "tmp%1#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0", + "tmp%1#1" + ] + }, + "1395": { + "op": "<=", + "defined_out": [ + "entry#0", + "tmp%2#2", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%2#2" + ] + }, + "1396": { + "error": "No due cashflow to pay", + "op": "assert // No due cashflow to pay", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1397": { + "op": "dig 2", + "defined_out": [ + "entry#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%0#1" + ] + }, + "1399": { + "op": "bnz fund_due_cashflows_after_if_else@15", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1402": { + "op": "dig 14", + "defined_out": [ + "entry#0", + "event_type#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1404": { + "op": "pushint 19", + "defined_out": [ + "19", + "entry#0", + "event_type#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "19" + ] + }, + "1406": { + "op": "==", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%2#2" + ] + }, + "1407": { + "op": "bnz fund_due_cashflows_after_if_else@15", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1410": { + "op": "intc_0 // 0", + "defined_out": [ + "entry#0", + "event_type#0", + "interest_amount_due#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_amount_due#0" + ] + }, + "1411": { + "op": "bury 11", + "defined_out": [ + "entry#0", + "event_type#0", + "interest_amount_due#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1413": { + "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1415": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "8" + ] + }, + "1416": { + "op": "getbyte", + "defined_out": [ + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1417": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "event_type#0" + ] + }, + "1418": { + "op": "bury 16", + "defined_out": [ + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1420": { + "op": "pushint 3", + "defined_out": [ + "3", + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "3" + ] + }, + "1422": { + "op": "==", + "defined_out": [ + "entry#0", + "event_type#0", + "tmp%1#4" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%1#4" + ] + }, + "1423": { + "op": "bnz fund_due_cashflows_after_if_else@19", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1426": { + "op": "dig 14", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1428": { + "op": "pushint 19", + "defined_out": [ + "19", + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "19" + ] + }, + "1430": { + "op": "==", + "defined_out": [ + "entry#0", + "event_type#0", + "tmp%2#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%2#2" + ] + }, + "1431": { + "op": "bnz fund_due_cashflows_after_if_else@19", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1434": { + "op": "intc_0 // 0", + "defined_out": [ + "entry#0", + "event_type#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount_due#0" + ] + }, + "1435": { + "op": "bury 6", + "defined_out": [ + "entry#0", + "event_type#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1437": { + "block": "fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1439": { + "op": "pushint 49", + "defined_out": [ + "49", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "49" + ] + }, + "1441": { + "op": "extract_uint64", + "defined_out": [ + "entry#0", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "next_outstanding_principal#0" + ] + }, + "1442": { + "op": "bury 8", + "defined_out": [ + "entry#0", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1444": { + "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", + "op": "callsub _is_dynamic_annuity", + "defined_out": [ + "entry#0", + "next_outstanding_principal#0", + "tmp%3#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%3#1" + ] + }, + "1447": { + "op": "bnz fund_due_cashflows_if_body@29", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1450": { + "op": "dig 7", + "defined_out": [ + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "next_interest_base#2" + ] + }, + "1452": { + "op": "bury 9", + "defined_out": [ + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1454": { + "block": "fund_due_cashflows_after_if_else@38", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 10", + "defined_out": [ + "interest_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_amount_due#0" + ] + }, + "1456": { + "callsub": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", + "op": "callsub _amount_to_index_delta", + "defined_out": [ + "interest_amount_due#0", + "interest_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0" + ] + }, + "1459": { + "op": "dig 6", + "defined_out": [ + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_amount_due#0" + ] + }, + "1461": { + "callsub": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", + "op": "callsub _amount_to_index_delta", + "defined_out": [ + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0" + ] + }, + "1464": { + "op": "dig 1", + "defined_out": [ + "interest_amount_due#0", + "interest_index_delta#0", + "interest_index_delta#0 (copy)", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "interest_index_delta#0 (copy)" + ] + }, + "1466": { + "callsub": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", + "op": "callsub _index_delta_to_amount", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "interest_amount#1" + ] + }, + "1469": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "interest_amount#1", + "interest_amount#1 (copy)" + ] + }, + "1470": { + "op": "cover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "interest_amount#1" + ] + }, + "1472": { + "op": "bury 15", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0" + ] + }, + "1474": { + "op": "dup", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount_due#0", + "principal_index_delta#0", + "principal_index_delta#0 (copy)" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_index_delta#0 (copy)" + ] + }, + "1475": { + "callsub": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", + "op": "callsub _index_delta_to_amount", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1" + ] + }, + "1478": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "principal_amount#1" + ] + }, + "1479": { + "op": "bury 11", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1" + ] + }, + "1481": { + "op": "dig 2", + "defined_out": [ + "interest_amount#1", + "interest_amount#1 (copy)", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "interest_amount#1 (copy)" + ] + }, + "1483": { + "op": "dig 1", + "defined_out": [ + "interest_amount#1", + "interest_amount#1 (copy)", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount#1 (copy)", + "principal_amount_due#0", + "principal_index_delta#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "interest_amount#1 (copy)", + "principal_amount#1 (copy)" + ] + }, + "1485": { + "op": "+", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0" + ] + }, + "1486": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "required_amount#0" + ] + }, + "1487": { + "op": "bury 9", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0" + ] + }, + "1489": { + "op": "global CurrentApplicationAddress", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%0#3" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "tmp%0#3" + ] + }, + "1491": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "tmp%0#3", + "0" + ] + }, + "1492": { + "op": "bytec 19 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"", + "0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%0#3" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "tmp%0#3", + "0", + "\"settlement_asset_id\"" + ] + }, + "1494": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%0#3" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "tmp%0#3", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1495": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "tmp%0#3", + "maybe_value%0#0" + ] + }, + "1496": { + "op": "asset_holding_get AssetBalance", + "defined_out": [ + "balance#0", + "check%0#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "check%0#0" + ] + }, + "1498": { + "error": "account opted into asset", + "op": "assert // account opted into asset", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0" + ] + }, + "1499": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "0" + ] + }, + "1500": { + "op": "bytec 15 // \"reserved_interest\"", + "defined_out": [ + "\"reserved_interest\"", + "0", + "balance#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "0", + "\"reserved_interest\"" + ] + }, + "1502": { + "op": "app_global_get_ex", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1503": { + "error": "check self.reserved_interest exists", + "op": "assert // check self.reserved_interest exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0" + ] + }, + "1504": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "0" + ] + }, + "1505": { + "op": "bytec 12 // \"reserved_principal\"", + "defined_out": [ + "\"reserved_principal\"", + "0", + "balance#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "0", + "\"reserved_principal\"" + ] + }, + "1507": { + "op": "app_global_get_ex", + "defined_out": [ + "balance#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1508": { + "error": "check self.reserved_principal exists", + "op": "assert // check self.reserved_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "1509": { + "op": "dig 1", + "defined_out": [ + "balance#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "maybe_value%1#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_value%0#0 (copy)" + ] + }, + "1511": { + "op": "+", + "defined_out": [ + "balance#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "reserved_total#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "reserved_total#0" + ] + }, + "1512": { + "op": "dig 2", + "defined_out": [ + "balance#0", + "balance#0 (copy)", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "reserved_total#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "reserved_total#0", + "balance#0 (copy)" + ] + }, + "1514": { + "op": "dig 1", + "defined_out": [ + "balance#0", + "balance#0 (copy)", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "reserved_total#0", + "reserved_total#0 (copy)" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "reserved_total#0", + "balance#0 (copy)", + "reserved_total#0 (copy)" + ] + }, + "1516": { + "op": ">=", + "defined_out": [ + "balance#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "reserved_total#0", + "tmp%2#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "reserved_total#0", + "tmp%2#2" + ] + }, + "1517": { + "error": "Not enough funds for the payment", + "op": "assert // Not enough funds for the payment", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "balance#0", + "maybe_value%0#0", + "reserved_total#0" + ] + }, + "1518": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "maybe_value%0#0", + "reserved_total#0", + "balance#0" + ] + }, + "1520": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "maybe_value%0#0", + "balance#0", + "reserved_total#0" + ] + }, + "1521": { + "op": "-", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%3#3" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "required_amount#0", + "maybe_value%0#0", + "tmp%3#3" + ] + }, + "1522": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "maybe_value%0#0", + "tmp%3#3", + "required_amount#0" + ] + }, + "1524": { + "op": ">=", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_value%0#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%15#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "maybe_value%0#0", + "tmp%15#1" + ] + }, + "1525": { + "error": "Not enough funds for the payment", + "op": "assert // Not enough funds for the payment", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "interest_amount#1", + "principal_index_delta#0", + "principal_amount#1", + "maybe_value%0#0" + ] + }, + "1526": { + "op": "uncover 3", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "maybe_value%0#0", + "interest_amount#1" + ] + }, + "1528": { + "op": "+", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%16#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "tmp%16#1" + ] + }, + "1529": { + "op": "bytec 15 // \"reserved_interest\"", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "tmp%16#1", + "\"reserved_interest\"" + ] + }, + "1531": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "\"reserved_interest\"", + "tmp%16#1" + ] + }, + "1532": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1" + ] + }, + "1533": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "0" + ] + }, + "1534": { + "op": "bytec 12 // \"reserved_principal\"", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "0", + "\"reserved_principal\"" + ] + }, + "1536": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_exists%5#0", + "maybe_value%5#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "1537": { + "error": "check self.reserved_principal exists", + "op": "assert // check self.reserved_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "principal_amount#1", + "maybe_value%5#0" + ] + }, + "1538": { + "op": "+", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%17#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "tmp%17#0" + ] + }, + "1539": { + "op": "bytec 12 // \"reserved_principal\"", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "tmp%17#0", + "\"reserved_principal\"" + ] + }, + "1541": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "\"reserved_principal\"", + "tmp%17#0" + ] + }, + "1542": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0" + ] + }, + "1543": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "0" + ] + }, + "1544": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "defined_out": [ + "\"cumulative_interest_index\"", + "0", + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "0", + "\"cumulative_interest_index\"" + ] + }, + "1546": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "interest_index_delta#0", + "maybe_exists%6#0", + "maybe_value%6#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "maybe_value%6#0", + "maybe_exists%6#0" + ] + }, + "1547": { + "error": "check self.cumulative_interest_index exists", + "op": "assert // check self.cumulative_interest_index exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_index_delta#0", + "principal_index_delta#0", + "maybe_value%6#0" + ] + }, + "1548": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_index_delta#0", + "maybe_value%6#0", + "interest_index_delta#0" + ] + }, + "1550": { + "op": "+", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0", + "tmp%18#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_index_delta#0", + "tmp%18#0" + ] + }, + "1551": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_index_delta#0", + "tmp%18#0", + "\"cumulative_interest_index\"" + ] + }, + "1553": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_index_delta#0", + "\"cumulative_interest_index\"", + "tmp%18#0" + ] + }, + "1554": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_index_delta#0" + ] + }, + "1555": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_index_delta#0", + "0" + ] + }, + "1556": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "defined_out": [ + "\"cumulative_principal_index\"", + "0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_index_delta#0", + "0", + "\"cumulative_principal_index\"" + ] + }, + "1558": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "maybe_exists%7#0", + "maybe_value%7#0", + "principal_amount#1", + "principal_amount_due#0", + "principal_index_delta#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_index_delta#0", + "maybe_value%7#0", + "maybe_exists%7#0" + ] + }, + "1559": { + "error": "check self.cumulative_principal_index exists", + "op": "assert // check self.cumulative_principal_index exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_index_delta#0", + "maybe_value%7#0" + ] + }, + "1560": { + "op": "+", + "defined_out": [ + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%19#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%19#0" + ] + }, + "1561": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%19#0", + "\"cumulative_principal_index\"" + ] + }, + "1563": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"cumulative_principal_index\"", + "tmp%19#0" + ] + }, + "1564": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1565": { + "op": "dig 15", + "defined_out": [ + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1567": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "8" + ] + }, + "1568": { + "op": "getbyte", + "defined_out": [ + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%20#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%20#0" + ] + }, + "1569": { + "op": "pushint 3", + "defined_out": [ + "3", + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%20#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%20#0", + "3" + ] + }, + "1571": { + "op": "==", + "defined_out": [ + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%21#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%21#0" + ] + }, + "1572": { + "op": "bz fund_due_cashflows_else_body@40", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1575": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1576": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "0", + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"accrued_interest\"" + ] + }, + "1578": { + "op": "app_global_get_ex", + "defined_out": [ + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "maybe_exists%8#0", + "maybe_value%8#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%8#0", + "maybe_exists%8#0" + ] + }, + "1579": { + "error": "check self.accrued_interest exists", + "op": "assert // check self.accrued_interest exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%8#0" + ] + }, + "1580": { + "op": "dig 16", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%8#0", + "entry#0" + ] + }, + "1582": { + "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", + "op": "callsub _entry_interest_segment", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "maybe_value%8#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%8#0", + "_entry_interest_segment%0#0", + "entry#0" + ] + }, + "1585": { + "op": "bury 18", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "maybe_value%8#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%8#0", + "_entry_interest_segment%0#0" + ] + }, + "1587": { + "op": "+", + "defined_out": [ + "entry#0", + "interest_amount#1", + "interest_amount_due#0", + "principal_amount#1", + "principal_amount_due#0", + "required_amount#0", + "tmp%22#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%22#0" + ] + }, + "1588": { + "op": "bytec 6 // \"accrued_interest\"", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%22#0", + "\"accrued_interest\"" + ] + }, + "1590": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"accrued_interest\"", + "tmp%22#0" + ] + }, + "1591": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1592": { + "block": "fund_due_cashflows_after_if_else@41", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", + "op": "callsub _is_dynamic_annuity", + "defined_out": [ + "tmp%23#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%23#0" + ] + }, + "1595": { + "op": "bz fund_due_cashflows_if_body@43", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1598": { + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1600": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "8" + ] + }, + "1601": { + "op": "getbyte", + "defined_out": [ + "entry#0", + "tmp%24#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%24#0" + ] + }, + "1602": { + "op": "pushint 19", + "defined_out": [ + "19", + "entry#0", + "tmp%24#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%24#0", + "19" + ] + }, + "1604": { + "op": "==", + "defined_out": [ + "entry#0", + "tmp%25#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%25#0" + ] + }, + "1605": { + "op": "bz fund_due_cashflows_after_if_else@44", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1608": { + "block": "fund_due_cashflows_if_body@43", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1610": { + "op": "pushint 41", + "defined_out": [ + "41", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "41" + ] + }, + "1612": { + "op": "extract_uint64", + "defined_out": [ + "entry#0", + "values%4#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%4#0" + ] + }, + "1613": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "entry#0", + "values%4#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%4#0", + "\"next_principal_redemption\"" + ] + }, + "1615": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"next_principal_redemption\"", + "values%4#0" + ] + }, + "1616": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1617": { + "block": "fund_due_cashflows_after_if_else@44", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"outstanding_principal\"" + ] + }, + "1619": { + "op": "dig 8", + "defined_out": [ + "\"outstanding_principal\"", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"outstanding_principal\"", + "next_outstanding_principal#0" + ] + }, + "1621": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1622": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"interest_calculation_base\"" + ] + }, + "1624": { + "op": "dig 9", + "defined_out": [ + "\"interest_calculation_base\"", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"interest_calculation_base\"", + "next_interest_base#2" + ] + }, + "1626": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1627": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1628": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"event_cursor\"" + ] + }, + "1629": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%9#0", + "maybe_value%9#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%9#0", + "maybe_exists%9#0" + ] + }, + "1630": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%9#0" + ] + }, + "1631": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "maybe_value%9#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%9#0", + "1" + ] + }, + "1632": { + "op": "+", + "defined_out": [ + "next_interest_base#2", + "next_outstanding_principal#0", + "tmp%26#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%26#0" + ] + }, + "1633": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%26#0", + "\"event_cursor\"" + ] + }, + "1634": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"event_cursor\"", + "tmp%26#0" + ] + }, + "1635": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1636": { + "op": "dig 15", + "defined_out": [ + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1638": { + "op": "extract 8 1", + "defined_out": [ + "aggregate%extract%10#0", + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "aggregate%extract%10#0" + ] + }, + "1641": { + "op": "pushbytes 0x13", + "defined_out": [ + "0x13", + "aggregate%extract%10#0", + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "aggregate%extract%10#0", + "0x13" + ] + }, + "1644": { + "op": "b==", + "defined_out": [ + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "tmp%27#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%27#0" + ] + }, + "1645": { + "op": "bz fund_due_cashflows_after_if_else@47", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1648": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1649": { + "op": "bytec 4 // \"outstanding_principal\"", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"outstanding_principal\"" + ] + }, + "1651": { + "op": "app_global_get_ex", + "defined_out": [ + "entry#0", + "maybe_exists%10#0", + "maybe_value%10#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%10#0", + "maybe_exists%10#0" + ] + }, + "1652": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%10#0" + ] + }, + "1653": { + "op": "bnz fund_due_cashflows_after_if_else@47", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1656": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"status\"" + ] + }, + "1657": { + "op": "pushint 200", + "defined_out": [ + "\"status\"", + "200", + "entry#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"status\"", + "200" + ] + }, + "1660": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1661": { + "op": "bytec 7 // \"interest_calculation_base\"", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"interest_calculation_base\"" + ] + }, + "1663": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"interest_calculation_base\"", + "0" + ] + }, + "1664": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1665": { + "block": "fund_due_cashflows_after_if_else@47", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1667": { + "op": "dig 4", + "defined_out": [ + "entry#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "required_amount#0" + ] + }, + "1669": { + "op": "dup", + "defined_out": [ + "entry#0", + "required_amount#0", + "required_amount#0 (copy)" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "required_amount#0 (copy)", + "required_amount#0" + ] + }, + "1670": { + "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", + "op": "callsub _emit_execution_event", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1673": { + "op": "pop", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1674": { + "op": "dig 13", + "defined_out": [ + "entry#0", + "funded_interest#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "funded_interest#0" + ] + }, + "1676": { + "op": "dig 12", + "defined_out": [ + "entry#0", + "funded_interest#0", + "interest_amount#1", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "funded_interest#0", + "interest_amount#1" + ] + }, + "1678": { + "op": "+", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "funded_interest#0" + ] + }, + "1679": { + "op": "bury 14", + "defined_out": [ + "entry#0", + "funded_interest#0", + "interest_amount#1", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1681": { + "op": "dig 12", + "defined_out": [ + "entry#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "funded_principal#0" + ] + }, + "1683": { + "op": "dig 7", + "defined_out": [ + "entry#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "principal_amount#1", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "funded_principal#0", + "principal_amount#1" + ] + }, + "1685": { + "op": "+", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "funded_principal#0" + ] + }, + "1686": { + "op": "bury 13", + "defined_out": [ + "entry#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "principal_amount#1", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1688": { + "op": "dig 4", + "defined_out": [ + "entry#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "principal_amount#1", + "processed_events#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0" + ] + }, + "1690": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "entry#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "principal_amount#1", + "processed_events#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "1" + ] + }, + "1691": { + "op": "+", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0" + ] + }, + "1692": { + "op": "bury 5", + "defined_out": [ + "entry#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "principal_amount#1", + "processed_events#0", + "required_amount#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1694": { + "op": "b fund_due_cashflows_while_top@4" + }, + "1697": { + "block": "fund_due_cashflows_else_body@40", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"accrued_interest\"" + ] + }, + "1699": { + "op": "intc_0 // 0", + "defined_out": [ + "\"accrued_interest\"", + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "\"accrued_interest\"", + "0" + ] + }, + "1700": { + "op": "app_global_put", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1701": { + "op": "b fund_due_cashflows_after_if_else@41" + }, + "1704": { + "block": "fund_due_cashflows_if_body@29", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1706": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "8" + ] + }, + "1707": { + "op": "getbyte", + "defined_out": [ + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1708": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "event_type#0" + ] + }, + "1709": { + "op": "bury 16", + "defined_out": [ + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1711": { + "op": "pushint 3", + "defined_out": [ + "3", + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "3" + ] + }, + "1713": { + "op": "==", + "defined_out": [ + "entry#0", + "event_type#0", + "tmp%5#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%5#0" + ] + }, + "1714": { + "op": "bz fund_due_cashflows_else_body@31", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1717": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1718": { + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "entry#0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"outstanding_principal\"" + ] + }, + "1720": { + "op": "app_global_get_ex", + "defined_out": [ + "entry#0", + "event_type#0", + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1721": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%1#0" + ] + }, + "1722": { + "op": "dig 6", + "defined_out": [ + "entry#0", + "event_type#0", + "maybe_value%1#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%1#0", + "principal_amount_due#0" + ] + }, + "1724": { + "op": "-", + "defined_out": [ + "entry#0", + "event_type#0", + "next_outstanding_principal#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "next_outstanding_principal#0" + ] + }, + "1725": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "next_outstanding_principal#0", + "next_outstanding_principal#0" + ] + }, + "1726": { + "op": "bury 9", + "defined_out": [ + "entry#0", + "event_type#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "next_interest_base#2" + ] + }, + "1728": { + "op": "bury 9", + "defined_out": [ + "entry#0", + "event_type#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1730": { + "op": "b fund_due_cashflows_after_if_else@38" + }, + "1733": { + "block": "fund_due_cashflows_else_body@31", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 14", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1735": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "8" + ] + }, + "1736": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%7#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%7#0" + ] + }, + "1737": { + "op": "bz fund_due_cashflows_else_body@33", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1740": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1741": { + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"outstanding_principal\"" + ] + }, + "1743": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%2#0", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "next_outstanding_principal#0", + "maybe_exists%2#0" + ] + }, + "1744": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_exists%2#0", + "next_outstanding_principal#0" + ] + }, + "1745": { + "op": "bury 9", + "defined_out": [ + "event_type#0", + "maybe_exists%2#0", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_exists%2#0" + ] + }, + "1747": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1748": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1749": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "0", + "event_type#0", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"interest_calculation_base\"" + ] + }, + "1751": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%3#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "next_interest_base#2", + "maybe_exists%3#0" + ] + }, + "1752": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_exists%3#0", + "next_interest_base#2" + ] + }, + "1753": { + "op": "bury 10", + "defined_out": [ + "event_type#0", + "maybe_exists%3#0", + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_exists%3#0" + ] + }, + "1755": { + "error": "check self.interest_calculation_base exists", + "op": "assert // check self.interest_calculation_base exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1756": { + "op": "b fund_due_cashflows_after_if_else@38" + }, + "1759": { + "block": "fund_due_cashflows_else_body@33", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 14", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1761": { + "op": "pushint 19", + "defined_out": [ + "19", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "19" + ] + }, + "1763": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%8#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%8#1" + ] + }, + "1764": { + "op": "bnz fund_due_cashflows_if_body@34", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1767": { + "op": "dig 7", + "defined_out": [ + "event_type#0", + "next_interest_base#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "next_interest_base#2" + ] + }, + "1769": { + "op": "bury 9", + "defined_out": [ + "event_type#0", + "next_interest_base#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1771": { + "op": "b fund_due_cashflows_after_if_else@38" + }, + "1774": { + "block": "fund_due_cashflows_if_body@34", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "next_outstanding_principal#0" + ] + }, + "1775": { + "op": "bury 8", + "defined_out": [ + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1777": { + "op": "intc_0 // 0", + "defined_out": [ + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "next_interest_base#2" + ] + }, + "1778": { + "op": "bury 9", + "defined_out": [ + "next_interest_base#2", + "next_outstanding_principal#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1780": { + "op": "b fund_due_cashflows_after_if_else@38" + }, + "1783": { + "block": "fund_due_cashflows_after_if_else@19", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", + "op": "callsub _is_dynamic_annuity", + "defined_out": [ + "tmp%3#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%3#1" + ] + }, + "1786": { + "op": "bz fund_due_cashflows_after_if_else@27", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1789": { + "op": "dig 14", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0" + ] + }, + "1791": { + "op": "pushint 19", + "defined_out": [ + "19", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "event_type#0", + "19" + ] + }, + "1793": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%4#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%4#0" + ] + }, + "1794": { + "op": "bz fund_due_cashflows_after_if_else@22", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1797": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1798": { + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "event_type#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"outstanding_principal\"" + ] + }, + "1800": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1801": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "defined_out": [ + "event_type#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount_due#0" + ] + }, + "1802": { + "op": "bury 6", + "defined_out": [ + "event_type#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1804": { + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" + }, + "1807": { + "block": "fund_due_cashflows_after_if_else@22", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1808": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"accrued_interest\"" + ] + }, + "1810": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1811": { + "error": "check self.accrued_interest exists", + "op": "assert // check self.accrued_interest exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%1#0" + ] + }, + "1812": { + "op": "dig 16", + "defined_out": [ + "entry#0", + "maybe_value%1#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%1#0", + "entry#0" + ] + }, + "1814": { + "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", + "op": "callsub _entry_interest_segment", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "maybe_value%1#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%1#0", + "_entry_interest_segment%0#0", + "entry#0" + ] + }, + "1817": { + "op": "bury 18", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "maybe_value%1#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%1#0", + "_entry_interest_segment%0#0" + ] + }, + "1819": { + "op": "+", + "defined_out": [ + "entry#0", + "interest_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_due#0" + ] + }, + "1820": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_due#0", + "interest_due#0" + ] + }, + "1821": { + "op": "bury 11", + "defined_out": [ + "entry#0", + "interest_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_due#0" + ] + }, + "1823": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_due#0", + "0" + ] + }, + "1824": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "0", + "entry#0", + "interest_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_due#0", + "0", + "\"next_principal_redemption\"" + ] + }, + "1826": { + "op": "app_global_get_ex", + "defined_out": [ + "entry#0", + "interest_due#0", + "maybe_exists%2#0", + "maybe_value%2#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_due#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "1827": { + "error": "check self.next_principal_redemption exists", + "op": "assert // check self.next_principal_redemption exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_due#0", + "maybe_value%2#0" + ] + }, + "1828": { + "op": ">=", + "defined_out": [ + "entry#0", + "interest_due#0", + "tmp%6#2" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%6#2" + ] + }, + "1829": { + "op": "bz fund_due_cashflows_after_if_else@24", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1832": { + "op": "intc_0 // 0", + "defined_out": [ + "entry#0", + "interest_due#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount_due#0" + ] + }, + "1833": { + "op": "bury 6", + "defined_out": [ + "entry#0", + "interest_due#0", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1835": { + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" + }, + "1838": { + "block": "fund_due_cashflows_after_if_else@24", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1839": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"next_principal_redemption\"" + ] + }, + "1841": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%3#1", + "maybe_exists%3#0" + ] + }, + "1842": { + "error": "check self.next_principal_redemption exists", + "op": "assert // check self.next_principal_redemption exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%3#1" + ] + }, + "1843": { + "op": "dig 10", + "defined_out": [ + "interest_due#0", + "maybe_value%3#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%3#1", + "interest_due#0" + ] + }, + "1845": { + "op": "-", + "defined_out": [ + "interest_due#0", + "principal_amount#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount#1" + ] + }, + "1846": { + "op": "dup", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount#1", + "principal_amount#1" + ] + }, + "1847": { + "op": "bury 8", + "defined_out": [ + "interest_due#0", + "principal_amount#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount#1" + ] + }, + "1849": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount#1", + "0" + ] + }, + "1850": { + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "interest_due#0", + "principal_amount#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount#1", + "0", + "\"outstanding_principal\"" + ] + }, + "1852": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_due#0", + "maybe_exists%4#1", + "maybe_value%4#1", + "principal_amount#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount#1", + "maybe_value%4#1", + "maybe_exists%4#1" + ] + }, + "1853": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount#1", + "maybe_value%4#1" + ] + }, + "1854": { + "op": ">", + "defined_out": [ + "interest_due#0", + "principal_amount#1", + "tmp%8#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%8#1" + ] + }, + "1855": { + "op": "bz fund_due_cashflows_after_if_else@26", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1858": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1859": { + "op": "bytec 4 // \"outstanding_principal\"", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"outstanding_principal\"" + ] + }, + "1861": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_due#0", + "maybe_exists%5#0", + "maybe_value%5#0", + "principal_amount#1" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "1862": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "defined_out": [ + "interest_due#0", + "principal_amount#1", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount_due#0" + ] + }, + "1863": { + "op": "bury 6", + "defined_out": [ + "interest_due#0", + "principal_amount#1", + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1865": { + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" + }, + "1868": { + "block": "fund_due_cashflows_after_if_else@26", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 6", + "defined_out": [ + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount_due#0" + ] + }, + "1870": { + "op": "bury 6", + "defined_out": [ + "principal_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1872": { + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" + }, + "1875": { + "block": "fund_due_cashflows_after_if_else@27", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 15", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0" + ] + }, + "1877": { + "op": "pushint 49", + "defined_out": [ + "49", + "entry#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "entry#0", + "49" + ] + }, + "1879": { + "op": "extract_uint64", + "defined_out": [ + "entry#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0" + ] + }, + "1880": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "entry#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0", + "0" + ] + }, + "1881": { + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "entry#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0", + "0", + "\"outstanding_principal\"" + ] + }, + "1883": { + "op": "app_global_get_ex", + "defined_out": [ + "entry#0", + "maybe_exists%6#0", + "maybe_value%6#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0", + "maybe_value%6#0", + "maybe_exists%6#0" + ] + }, + "1884": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0", + "maybe_value%6#0" + ] + }, + "1885": { + "op": "dup2", + "defined_out": [ + "entry#0", + "maybe_value%6#0", + "maybe_value%6#0 (copy)", + "values%0#0", + "values%0#0 (copy)" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0", + "maybe_value%6#0", + "values%0#0 (copy)", + "maybe_value%6#0 (copy)" + ] + }, + "1886": { + "op": "<=", + "defined_out": [ + "entry#0", + "maybe_value%6#0", + "tmp%9#2", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0", + "maybe_value%6#0", + "tmp%9#2" + ] + }, + "1887": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "values%0#0", + "maybe_value%6#0" + ] + }, + "1888": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%6#0", + "values%0#0" + ] + }, + "1889": { + "op": "-", + "defined_out": [ + "entry#0", + "principal_amount_due#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "principal_amount_due#0" + ] + }, + "1890": { + "op": "bury 6", + "defined_out": [ + "entry#0", + "principal_amount_due#0", + "values%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1892": { + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28" + }, + "1895": { + "block": "fund_due_cashflows_after_if_else@15", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0" + ] + }, + "1896": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0", + "\"accrued_interest\"" + ] + }, + "1898": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1899": { + "error": "check self.accrued_interest exists", + "op": "assert // check self.accrued_interest exists", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0" + ] + }, + "1900": { + "op": "dig 16", + "defined_out": [ + "entry#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "entry#0" + ] + }, + "1902": { + "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", + "op": "callsub _entry_interest_segment", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "_entry_interest_segment%0#0", + "entry#0" + ] + }, + "1905": { + "op": "bury 18", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "maybe_value%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "maybe_value%0#0", + "_entry_interest_segment%0#0" + ] + }, + "1907": { + "op": "+", + "defined_out": [ + "entry#0", + "interest_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "interest_amount_due#0" + ] + }, + "1908": { + "op": "bury 11", + "defined_out": [ + "entry#0", + "interest_amount_due#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1910": { + "op": "b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16" + }, + "1913": { + "block": "fund_due_cashflows_after_while@11", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "dig 4", + "defined_out": [ + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0" + ] + }, + "1915": { + "op": "dup", + "defined_out": [ + "processed_events#0", + "processed_events#0 (copy)" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "processed_events#0 (copy)" + ] + }, + "1916": { + "error": "No due cashflow to pay", + "op": "assert // No due cashflow to pay", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0" + ] + }, + "1917": { + "op": "dig 14", + "defined_out": [ + "funded_interest#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0" + ] + }, + "1919": { + "op": "dup", + "defined_out": [ + "funded_interest#0", + "funded_interest#0 (copy)", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_interest#0 (copy)" + ] + }, + "1920": { + "op": "dig 15", + "defined_out": [ + "funded_interest#0", + "funded_interest#0 (copy)", + "funded_principal#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_interest#0 (copy)", + "funded_principal#0" + ] + }, + "1922": { + "op": "dup", + "defined_out": [ + "funded_interest#0", + "funded_interest#0 (copy)", + "funded_principal#0", + "funded_principal#0 (copy)", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_interest#0", + "funded_interest#0 (copy)", + "funded_principal#0 (copy)", + "funded_principal#0 (copy)" + ] + }, + "1923": { + "op": "cover 3", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_principal#0", + "funded_interest#0", + "funded_interest#0 (copy)", + "funded_principal#0 (copy)" + ] + }, + "1925": { + "op": "+", + "defined_out": [ + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%14#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_principal#0", + "funded_interest#0", + "tmp%14#0" + ] + }, + "1926": { + "op": "global LatestTimestamp", + "defined_out": [ + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%14#0", + "tmp%15#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_principal#0", + "funded_interest#0", + "tmp%14#0", + "tmp%15#0" + ] + }, + "1928": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_principal#0", + "tmp%14#0", + "tmp%15#0", + "funded_interest#0" + ] + }, + "1930": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%14#0", + "tmp%15#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "funded_principal#0", + "tmp%14#0", + "tmp%15#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "1931": { + "op": "uncover 3", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "tmp%14#0", + "tmp%15#0", + "aggregate%val_as_bytes%0#0", + "funded_principal#0" + ] + }, + "1933": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%1#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%14#0", + "tmp%15#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "tmp%14#0", + "tmp%15#0", + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "1934": { + "op": "concat", + "defined_out": [ + "aggregate%head%1#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%14#0", + "tmp%15#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "tmp%14#0", + "tmp%15#0", + "aggregate%head%1#0" + ] + }, + "1935": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "tmp%15#0", + "aggregate%head%1#0", + "tmp%14#0" + ] + }, + "1937": { + "op": "itob", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%2#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%15#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "tmp%15#0", + "aggregate%head%1#0", + "aggregate%val_as_bytes%2#0" + ] + }, + "1938": { + "op": "concat", + "defined_out": [ + "aggregate%head%2#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%15#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "processed_events#0", + "tmp%15#0", + "aggregate%head%2#0" + ] + }, + "1939": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%15#0", + "aggregate%head%2#0", + "processed_events#0" + ] + }, + "1941": { + "op": "itob", + "defined_out": [ + "aggregate%head%2#0", + "aggregate%val_as_bytes%3#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%15#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%15#0", + "aggregate%head%2#0", + "aggregate%val_as_bytes%3#0" + ] + }, + "1942": { + "op": "concat", + "defined_out": [ + "aggregate%head%3#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%15#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%15#0", + "aggregate%head%3#0" + ] + }, + "1943": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "aggregate%head%3#0", + "tmp%15#0" + ] + }, + "1944": { + "op": "itob", + "defined_out": [ + "aggregate%head%3#0", + "aggregate%val_as_bytes%4#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "aggregate%head%3#0", + "aggregate%val_as_bytes%4#0" + ] + }, + "1945": { + "op": "concat", + "defined_out": [ + "aggregate%head%4#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "aggregate%head%4#0" + ] + }, + "1946": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%head%4#0", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "aggregate%head%4#0", + "0x151f7c75" + ] + }, + "1947": { + "op": "swap", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "0x151f7c75", + "aggregate%head%4#0" + ] + }, + "1948": { + "op": "concat", + "defined_out": [ + "funded_interest#0", + "funded_principal#0", + "processed_events#0", + "tmp%3#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "tmp%3#0" + ] + }, + "1949": { + "op": "log", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1950": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "funded_interest#0", + "funded_principal#0", + "processed_events#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "1" + ] + }, + "1951": { + "op": "return", + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ] + }, + "1952": { + "block": "fund_due_cashflows_bool_false@53", + "stack_in": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "entry#0", + "event_type#0", + "funded_interest#0", + "funded_principal#0", + "interest_amount#1", + "interest_amount_due#0", + "interest_due#0", + "next_interest_base#2", + "next_outstanding_principal#0", + "principal_amount#1", + "principal_amount_due#0", + "processed_events#0", + "required_amount#0", + "tmp%0#1", + "values%0#0", + "max_event_count#0", + "or_result%0#0" + ] + }, + "1953": { + "op": "b fund_due_cashflows_bool_merge@54" + }, + "1956": { + "subroutine": "modules.payment_agent.PaymentAgent.claim_due_cashflows[routing]", + "params": {}, + "block": "claim_due_cashflows", + "stack_in": [], + "op": "pushbytes \"\"", + "stack_out": [ + "interest_amount#0" + ] + }, + "1958": { + "op": "dupn 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ] + }, + "1960": { + "op": "txna ApplicationArgs 1" + }, + "1963": { + "op": "dupn 2", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "1965": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "len%0#0" + ] + }, + "1966": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "len%0#0", + "32" + ] + }, + "1967": { + "op": "==", + "defined_out": [ + "eq%0#0", + "holding_address#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "eq%0#0" + ] + }, + "1968": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0" + ] + }, + "1969": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0" + ] + }, + "1972": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "1973": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)", + "0" + ] + }, + "1974": { + "error": "invalid array length header", + "op": "extract_uint16 // on error: invalid array length header", + "defined_out": [ + "aggregate%array_length%0#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "aggregate%array_length%0#0" + ] + }, + "1975": { + "op": "pushint 2", + "defined_out": [ + "2", + "aggregate%array_length%0#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "aggregate%array_length%0#0", + "2" + ] + }, + "1977": { + "op": "+", + "defined_out": [ + "add%0#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "add%0#0" + ] + }, + "1978": { + "op": "dig 1", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "add%0#0", + "tmp%2#0 (copy)" + ] + }, + "1980": { + "op": "len", + "defined_out": [ + "add%0#0", + "holding_address#0", + "len%1#0", + "tmp%2#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "add%0#0", + "len%1#0" + ] + }, + "1981": { + "op": "==", + "defined_out": [ + "eq%1#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0", + "eq%1#0" + ] + }, + "1982": { + "error": "invalid number of bytes for arc4.dynamic_array", + "op": "assert // invalid number of bytes for arc4.dynamic_array", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "tmp%2#0" + ] + }, + "1983": { + "op": "extract 2 0", + "defined_out": [ + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "holding_address#0", + "payment_info#0" + ] + }, + "1986": { + "op": "swap", + "defined_out": [ + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0" + ] + }, + "1987": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0", + "0" + ] + }, + "1988": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0", + "0", + "\"status\"" + ] + }, + "1989": { + "op": "app_global_get_ex", + "defined_out": [ + "holding_address#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1990": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0", + "maybe_value%0#0" + ] + }, + "1991": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0" + ] + }, + "1992": { + "op": "bytec 8 // 0x4123", + "defined_out": [ + "0x4123", + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "holding_address#0", + "0x4123" + ] + }, + "1994": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "0x4123", + "holding_address#0" + ] + }, + "1995": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "1996": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4" + ] + }, + "1997": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#4", + "holding_address#0", + "maybe_exists%0#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "1998": { + "op": "bury 1", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_exists%0#0" + ] + }, + "2000": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2001": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "0" + ] + }, + "2002": { + "op": "bytec 27 // 0x523a4f504423", + "defined_out": [ + "0", + "0x523a4f504423", + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "0", + "0x523a4f504423" + ] + }, + "2004": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "maybe_exists%0#0", + "maybe_value%0#3", + "payment_info#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#3", + "maybe_exists%0#0" + ] + }, + "2005": { + "error": "check self.op_daemon exists", + "op": "assert // check self.op_daemon exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#3" + ] + }, + "2006": { + "op": "global ZeroAddress", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "maybe_value%0#3", + "payment_info#0", + "tmp%0#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#3", + "tmp%0#1" + ] + }, + "2008": { + "op": "!=", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%1#2" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%1#2" + ] + }, + "2009": { + "op": "bz claim_due_cashflows_after_if_else@17", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2012": { + "op": "txn Sender", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%2#3" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%2#3" + ] + }, + "2014": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%2#3", + "0" + ] + }, + "2015": { + "op": "bytec 27 // 0x523a4f504423", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%2#3", + "0", + "0x523a4f504423" + ] + }, + "2017": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "maybe_exists%1#0", + "maybe_value%1#1", + "payment_info#0", + "tmp%2#3" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%2#3", + "maybe_value%1#1", + "maybe_exists%1#0" + ] + }, + "2018": { + "error": "check self.op_daemon exists", + "op": "assert // check self.op_daemon exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%2#3", + "maybe_value%1#1" + ] + }, + "2019": { + "op": "==", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%3#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%3#1" + ] + }, + "2020": { + "op": "bnz claim_due_cashflows_bool_true@14", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2023": { + "op": "txn Sender", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%4#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%4#0" + ] + }, + "2025": { + "op": "dig 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%4#0", + "holding_address#0" + ] + }, + "2027": { + "op": "==", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%5#2" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%5#2" + ] + }, + "2028": { + "op": "bnz claim_due_cashflows_bool_true@14", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2031": { + "op": "txn Sender", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%6#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#1" + ] + }, + "2033": { + "op": "dig 1", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#1", + "box_prefixed_key%0#4" + ] + }, + "2035": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0", + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%6#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#1", + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "2036": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#1", + "aggregate%box_get%0#0" + ] + }, + "2037": { + "op": "extract 0 32", + "defined_out": [ + "aggregate%extract%0#0", + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%6#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#1", + "aggregate%extract%0#0" + ] + }, + "2040": { + "op": "==", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "payment_info#0", + "tmp%7#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%7#1" + ] + }, + "2041": { + "op": "bz claim_due_cashflows_bool_false@15", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2044": { + "block": "claim_due_cashflows_bool_true@14", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "or_result%0#0" + ] + }, + "2045": { + "error": "Not authorized", + "block": "claim_due_cashflows_bool_merge@16", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "or_result%0#0" + ], + "op": "assert // Not authorized", + "defined_out": [], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2046": { + "block": "claim_due_cashflows_after_if_else@17", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ], + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" + }, + "2049": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" + }, + "2052": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "0" + ] + }, + "2053": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "0", + "\"status\"" + ] + }, + "2054": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2055": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0" + ] + }, + "2056": { + "op": "pushint 50", + "defined_out": [ + "50", + "maybe_value%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "50" + ] + }, + "2058": { + "op": "==", + "defined_out": [ + "tmp%0#2" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#2" + ] + }, + "2059": { + "op": "!", + "defined_out": [ + "tmp%1#2" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%1#2" + ] + }, + "2060": { + "error": "IED not yet executed", + "op": "assert // IED not yet executed", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2061": { + "op": "dig 2", + "defined_out": [ + "holding_address#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "holding_address#0" + ] + }, + "2063": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "2064": { + "callsub": "modules.accounting.AccountingModule._ensure_units_activated", + "op": "callsub _ensure_units_activated", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "holding_address#0" + ] + }, + "2067": { + "callsub": "modules.accounting.AccountingModule._settle_position", + "op": "callsub _settle_position", + "defined_out": [ + "holding_address#0", + "{_settle_position}.0", + "{_settle_position}.1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "{_settle_position}.0", + "{_settle_position}.1" + ] + }, + "2070": { + "op": "popn 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2072": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4" + ] + }, + "2073": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%2#0", + "aggregate%box_get%3#0", + "box_prefixed_key%0#4", + "holding_address#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "aggregate%box_get%3#0" + ] + }, + "2074": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0" + ] + }, + "2075": { + "op": "dup", + "defined_out": [ + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)", + "box_prefixed_key%0#4", + "holding_address#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)" + ] + }, + "2076": { + "op": "pushint 73", + "defined_out": [ + "73", + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)", + "box_prefixed_key%0#4", + "holding_address#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)", + "73" + ] + }, + "2078": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%box_get%2#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "interest_amount#0" + ] + }, + "2079": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "interest_amount#0", + "interest_amount#0 (copy)" + ] + }, + "2080": { + "op": "cover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0", + "interest_amount#0" + ] + }, + "2082": { + "op": "bury 8", + "defined_out": [ + "aggregate%box_get%2#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0" + ] + }, + "2084": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)" + ] + }, + "2085": { + "op": "pushint 81", + "defined_out": [ + "81", + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0", + "aggregate%box_get%2#0 (copy)", + "81" + ] + }, + "2087": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%box_get%2#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0", + "principal_amount#0" + ] + }, + "2088": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0", + "principal_amount#0", + "principal_amount#0" + ] + }, + "2089": { + "op": "bury 8", + "defined_out": [ + "aggregate%box_get%2#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "aggregate%box_get%2#0", + "principal_amount#0" + ] + }, + "2091": { + "op": "uncover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "principal_amount#0", + "interest_amount#0" + ] + }, + "2093": { + "op": "+", + "defined_out": [ + "aggregate%box_get%2#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "total_amount#0" + ] + }, + "2094": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "total_amount#0", + "total_amount#0" + ] + }, + "2095": { + "op": "bury 6", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0", + "total_amount#0" + ] + }, + "2097": { + "error": "No due cashflow to pay", + "op": "assert // No due cashflow to pay", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%2#0" + ] + }, + "2098": { + "op": "extract 0 32", + "defined_out": [ + "aggregate%extract%5#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%extract%5#0" + ] + }, + "2101": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%extract%5#0", + "0" + ] + }, + "2102": { + "op": "bytec 19 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"", + "0", + "aggregate%extract%5#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%extract%5#0", + "0", + "\"settlement_asset_id\"" + ] + }, + "2104": { + "op": "app_global_get_ex", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%extract%5#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2105": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%extract%5#0", + "maybe_value%0#0" + ] + }, + "2106": { + "op": "asset_holding_get AssetBalance", + "defined_out": [ + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "tmp%0#5", + "tmp%1#2", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#5", + "tmp%1#2" + ] + }, + "2108": { + "op": "bury 1", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%1#2" + ] + }, + "2110": { + "op": "bz claim_due_cashflows_bool_false@24", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2113": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4" + ] + }, + "2114": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%12#0", + "aggregate%box_get%13#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%12#0", + "aggregate%box_get%13#0" + ] + }, + "2115": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%12#0" + ] + }, + "2116": { + "op": "pushint 384", + "defined_out": [ + "384", + "aggregate%box_get%12#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%box_get%12#0", + "384" + ] + }, + "2119": { + "op": "getbit", + "defined_out": [ + "aggregate%get_bit%0#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%get_bit%0#0" + ] + }, + "2120": { + "op": "bnz claim_due_cashflows_bool_false@24", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2123": { + "op": "intc_1 // 1", + "defined_out": [ + "and_result%0#0", + "box_prefixed_key%0#4", + "holding_address#0", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "and_result%0#0" + ] + }, + "2124": { + "block": "claim_due_cashflows_bool_merge@25", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "and_result%0#0" + ], + "op": "bz claim_due_cashflows_after_if_else@3", + "defined_out": [], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2127": { + "op": "global CurrentApplicationAddress", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#1" + ] + }, + "2129": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "tmp%0#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#1", + "0" + ] + }, + "2130": { + "op": "bytec 19 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"", + "0", + "tmp%0#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#1", + "0", + "\"settlement_asset_id\"" + ] + }, + "2132": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2133": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%0#1", + "maybe_value%0#0" + ] + }, + "2134": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "tmp%0#1" + ] + }, + "2135": { + "op": "dig 1", + "defined_out": [ + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "tmp%0#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "tmp%0#1", + "maybe_value%0#0 (copy)" + ] + }, + "2137": { + "op": "asset_holding_get AssetBalance", + "defined_out": [ + "check%0#0", + "maybe_value%0#0", + "value%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "value%0#0", + "check%0#0" + ] + }, + "2139": { + "error": "account opted into asset", + "op": "assert // account opted into asset", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "value%0#0" + ] + }, + "2140": { + "op": "dig 5", + "defined_out": [ + "maybe_value%0#0", + "total_amount#0", + "value%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "value%0#0", + "total_amount#0" + ] + }, + "2142": { + "op": "dup", + "defined_out": [ + "maybe_value%0#0", + "total_amount#0", + "total_amount#0 (copy)", + "value%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "value%0#0", + "total_amount#0 (copy)", + "total_amount#0 (copy)" + ] + }, + "2143": { + "op": "cover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "value%0#0", + "total_amount#0 (copy)" + ] + }, + "2145": { + "op": ">=", + "defined_out": [ + "maybe_value%0#0", + "tmp%1#2", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "tmp%1#2" + ] + }, + "2146": { + "error": "Not enough funds for the payment", + "op": "assert // Not enough funds for the payment", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0" + ] + }, + "2147": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "box_prefixed_key%0#4" + ] + }, + "2149": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#4", + "box_prefixed_key%0#4 (copy)", + "maybe_value%0#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "box_prefixed_key%0#4 (copy)", + "box_prefixed_key%0#4 (copy)" + ] + }, + "2150": { + "op": "cover 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "box_prefixed_key%0#4 (copy)" + ] + }, + "2152": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%15#0", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "position#0", + "aggregate%box_get%15#0" + ] + }, + "2153": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "position#0" + ] + }, + "2154": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "position#0 (copy)", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "position#0", + "position#0 (copy)" + ] + }, + "2155": { + "op": "extract 0 32", + "defined_out": [ + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "receiver#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "position#0", + "receiver#0" + ] + }, + "2158": { + "op": "itxn_begin" + }, + "2159": { + "op": "global MinTxnFee", + "defined_out": [ + "box_prefixed_key%0#4", + "inner_txn_params%0%%param_Fee_idx_0#0", + "maybe_value%0#0", + "position#0", + "receiver#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "total_amount#0", + "position#0", + "receiver#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "2161": { + "op": "uncover 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "receiver#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "total_amount#0" + ] + }, + "2163": { + "op": "itxn_field AssetAmount", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "receiver#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "2165": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "receiver#0" + ] + }, + "2166": { + "op": "itxn_field AssetReceiver", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "position#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "2168": { + "op": "uncover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "maybe_value%0#0" + ] + }, + "2170": { + "op": "itxn_field XferAsset", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "2172": { + "op": "pushint 4 // axfer", + "defined_out": [ + "axfer", + "box_prefixed_key%0#4", + "inner_txn_params%0%%param_Fee_idx_0#0", + "position#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "axfer" + ] + }, + "2174": { + "op": "itxn_field TypeEnum", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "2176": { + "op": "itxn_field Fee", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0" + ] + }, + "2178": { + "op": "itxn_submit" + }, + "2179": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "position#0 (copy)" + ] + }, + "2180": { + "op": "pushint 73", + "defined_out": [ + "73", + "box_prefixed_key%0#4", + "position#0", + "position#0 (copy)", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "position#0 (copy)", + "73" + ] + }, + "2182": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "interest_amount#0" + ] + }, + "2183": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "position#0", + "interest_amount#0", + "interest_amount#0 (copy)" + ] + }, + "2184": { + "op": "cover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "interest_amount#0" + ] + }, + "2186": { + "op": "bury 9", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0" + ] + }, + "2188": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "position#0 (copy)" + ] + }, + "2189": { + "op": "pushint 81", + "defined_out": [ + "81", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "position#0 (copy)", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "position#0 (copy)", + "81" + ] + }, + "2191": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "principal_amount#0" + ] + }, + "2192": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "principal_amount#0", + "principal_amount#0 (copy)" + ] + }, + "2193": { + "op": "cover 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0", + "principal_amount#0" + ] + }, + "2195": { + "op": "bury 9", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0" + ] + }, + "2197": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0", + "0" + ] + }, + "2198": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "2199": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "aggregate%val_as_bytes%0#0", + "position#0" + ] + }, + "2200": { + "op": "dig 1", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%0#0 (copy)", + "box_prefixed_key%0#4", + "interest_amount#0", + "position#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "aggregate%val_as_bytes%0#0", + "position#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2202": { + "op": "replace2 73", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "aggregate%val_as_bytes%0#0", + "position#0" + ] + }, + "2204": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "2205": { + "op": "replace2 81", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0" + ] + }, + "2207": { + "op": "uncover 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "position#0", + "box_prefixed_key%0#4" + ] + }, + "2209": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "box_prefixed_key%0#4", + "position#0" + ] + }, + "2210": { + "op": "box_put", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0" + ] + }, + "2211": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "0" + ] + }, + "2212": { + "op": "bytec 15 // \"reserved_interest\"", + "defined_out": [ + "\"reserved_interest\"", + "0", + "box_prefixed_key%0#4", + "interest_amount#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "0", + "\"reserved_interest\"" + ] + }, + "2214": { + "op": "app_global_get_ex", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2215": { + "error": "check self.reserved_interest exists", + "op": "assert // check self.reserved_interest exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0" + ] + }, + "2216": { + "op": "dup", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)" + ] + }, + "2217": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "interest_amount#0 (copy)", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "interest_amount#0 (copy)" + ] + }, + "2219": { + "op": ">=", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "maybe_value%0#0", + "principal_amount#0", + "tmp%0#2", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "tmp%0#2" + ] + }, + "2220": { + "error": "Not enough funds for the payment", + "op": "assert // Not enough funds for the payment", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0" + ] + }, + "2221": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "0" + ] + }, + "2222": { + "op": "bytec 12 // \"reserved_principal\"", + "defined_out": [ + "\"reserved_principal\"", + "0", + "box_prefixed_key%0#4", + "interest_amount#0", + "maybe_value%0#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "0", + "\"reserved_principal\"" + ] + }, + "2224": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2225": { + "error": "check self.reserved_principal exists", + "op": "assert // check self.reserved_principal exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "2226": { + "op": "dig 3", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "maybe_value%0#0", + "maybe_value%1#0", + "principal_amount#0", + "principal_amount#0 (copy)", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "maybe_value%1#0", + "principal_amount#0 (copy)" + ] + }, + "2228": { + "op": ">=", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0", + "tmp%1#2" + ] + }, + "2229": { + "error": "Not enough funds for the payment", + "op": "assert // Not enough funds for the payment", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "maybe_value%0#0" + ] + }, + "2230": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "maybe_value%0#0", + "interest_amount#0" + ] + }, + "2231": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "principal_amount#0", + "tmp%2#2", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "tmp%2#2" + ] + }, + "2232": { + "op": "bytec 15 // \"reserved_interest\"", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "tmp%2#2", + "\"reserved_interest\"" + ] + }, + "2234": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "\"reserved_interest\"", + "tmp%2#2" + ] + }, + "2235": { + "op": "app_global_put", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0" + ] + }, + "2236": { + "op": "intc_0 // 0", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "0" + ] + }, + "2237": { + "op": "bytec 12 // \"reserved_principal\"", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "0", + "\"reserved_principal\"" + ] + }, + "2239": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "maybe_exists%3#0", + "maybe_value%3#0", + "principal_amount#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "2240": { + "error": "check self.reserved_principal exists", + "op": "assert // check self.reserved_principal exists", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "maybe_value%3#0" + ] + }, + "2241": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "maybe_value%3#0", + "principal_amount#0" + ] + }, + "2242": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#4", + "interest_amount#0", + "principal_amount#0", + "tmp%3#0", + "total_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%3#0" + ] + }, + "2243": { + "op": "bytec 12 // \"reserved_principal\"", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%3#0", + "\"reserved_principal\"" + ] + }, + "2245": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "\"reserved_principal\"", + "tmp%3#0" + ] + }, + "2246": { + "op": "app_global_put", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2247": { + "block": "claim_due_cashflows_after_if_else@3", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ], + "op": "dig 5", + "defined_out": [ + "interest_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0" + ] + }, + "2249": { + "op": "dup", + "defined_out": [ + "interest_amount#0", + "interest_amount#0 (copy)" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "interest_amount#0 (copy)" + ] + }, + "2250": { + "op": "dig 6", + "defined_out": [ + "interest_amount#0", + "interest_amount#0 (copy)", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "interest_amount#0 (copy)", + "principal_amount#0" + ] + }, + "2252": { + "op": "dup", + "defined_out": [ + "interest_amount#0", + "interest_amount#0 (copy)", + "principal_amount#0", + "principal_amount#0 (copy)" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "interest_amount#0", + "interest_amount#0 (copy)", + "principal_amount#0 (copy)", + "principal_amount#0 (copy)" + ] + }, + "2253": { + "op": "cover 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "interest_amount#0 (copy)", + "principal_amount#0 (copy)" + ] + }, + "2255": { + "op": "+", + "defined_out": [ + "interest_amount#0", + "principal_amount#0", + "tmp%5#1" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "tmp%5#1" + ] + }, + "2256": { + "op": "global LatestTimestamp", + "defined_out": [ + "interest_amount#0", + "principal_amount#0", + "tmp%5#1", + "tmp%6#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "interest_amount#0", + "tmp%5#1", + "tmp%6#0" + ] + }, + "2258": { + "op": "uncover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "tmp%5#1", + "tmp%6#0", + "interest_amount#0" + ] + }, + "2260": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%1#0", + "interest_amount#0", + "principal_amount#0", + "tmp%5#1", + "tmp%6#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "principal_amount#0", + "tmp%5#1", + "tmp%6#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "2261": { + "op": "uncover 3", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%5#1", + "tmp%6#0", + "aggregate%val_as_bytes%1#0", + "principal_amount#0" + ] + }, + "2263": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%val_as_bytes%2#0", + "interest_amount#0", + "principal_amount#0", + "tmp%5#1", + "tmp%6#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%5#1", + "tmp%6#0", + "aggregate%val_as_bytes%1#0", + "aggregate%val_as_bytes%2#0" + ] + }, + "2264": { + "op": "concat", + "defined_out": [ + "aggregate%head%1#0", + "interest_amount#0", + "principal_amount#0", + "tmp%5#1", + "tmp%6#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%5#1", + "tmp%6#0", + "aggregate%head%1#0" + ] + }, + "2265": { + "op": "uncover 2", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#0", + "aggregate%head%1#0", + "tmp%5#1" + ] + }, + "2267": { + "op": "itob", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%3#0", + "interest_amount#0", + "principal_amount#0", + "tmp%6#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#0", + "aggregate%head%1#0", + "aggregate%val_as_bytes%3#0" + ] + }, + "2268": { + "op": "concat", + "defined_out": [ + "aggregate%head%2#0", + "interest_amount#0", + "principal_amount#0", + "tmp%6#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%6#0", + "aggregate%head%2#0" + ] + }, + "2269": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%2#0", + "tmp%6#0" + ] + }, + "2270": { + "op": "itob", + "defined_out": [ + "aggregate%head%2#0", + "aggregate%val_as_bytes%4#0", + "interest_amount#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%2#0", + "aggregate%val_as_bytes%4#0" + ] + }, + "2271": { + "op": "concat", + "defined_out": [ + "aggregate%head%3#0", + "interest_amount#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0" + ] + }, + "2272": { + "op": "dig 2", + "defined_out": [ + "aggregate%head%3#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "payment_info#0" + ] + }, + "2274": { + "op": "dup", + "defined_out": [ + "aggregate%head%3#0", + "interest_amount#0", + "payment_info#0", + "payment_info#0 (copy)", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "payment_info#0", + "payment_info#0 (copy)" + ] + }, + "2275": { + "op": "len", + "defined_out": [ + "aggregate%head%3#0", + "aggregate%length%0#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "payment_info#0", + "aggregate%length%0#0" + ] + }, + "2276": { + "op": "itob", + "defined_out": [ + "aggregate%as_bytes%0#0", + "aggregate%head%3#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "payment_info#0", + "aggregate%as_bytes%0#0" + ] + }, + "2277": { + "op": "extract 6 2", + "defined_out": [ + "aggregate%head%3#0", + "aggregate%length_uint16%0#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "payment_info#0", + "aggregate%length_uint16%0#0" + ] + }, + "2280": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "aggregate%length_uint16%0#0", + "payment_info#0" + ] + }, + "2281": { + "op": "concat", + "defined_out": [ + "aggregate%encoded_value%0#0", + "aggregate%head%3#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%3#0", + "aggregate%encoded_value%0#0" + ] + }, + "2282": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%encoded_value%0#0", + "aggregate%head%3#0" + ] + }, + "2283": { + "op": "pushbytes 0x0022", + "defined_out": [ + "0x0022", + "aggregate%encoded_value%0#0", + "aggregate%head%3#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%encoded_value%0#0", + "aggregate%head%3#0", + "0x0022" + ] + }, + "2287": { + "op": "concat", + "defined_out": [ + "aggregate%encoded_value%0#0", + "aggregate%head%4#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%encoded_value%0#0", + "aggregate%head%4#0" + ] + }, + "2288": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%head%4#0", + "aggregate%encoded_value%0#0" + ] + }, + "2289": { + "op": "concat", + "defined_out": [ + "aggregate%concat%0#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%concat%0#0" + ] + }, + "2290": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%concat%0#0", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "aggregate%concat%0#0", + "0x151f7c75" + ] + }, + "2291": { + "op": "swap", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "0x151f7c75", + "aggregate%concat%0#0" + ] + }, + "2292": { + "op": "concat", + "defined_out": [ + "interest_amount#0", + "payment_info#0", + "principal_amount#0", + "tmp%5#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "tmp%5#0" + ] + }, + "2293": { + "op": "log", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2294": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "interest_amount#0", + "payment_info#0", + "principal_amount#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "1" + ] + }, + "2295": { + "op": "return", + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ] + }, + "2296": { + "block": "claim_due_cashflows_bool_false@24", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ], + "op": "intc_0 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "and_result%0#0" + ] + }, + "2297": { + "op": "b claim_due_cashflows_bool_merge@25" + }, + "2300": { + "block": "claim_due_cashflows_bool_false@15", + "stack_in": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "interest_amount#0", + "principal_amount#0", + "total_amount#0", + "holding_address#0", + "payment_info#0", + "box_prefixed_key%0#4", + "or_result%0#0" + ] + }, + "2301": { + "op": "b claim_due_cashflows_bool_merge@16" + }, + "2304": { + "subroutine": "modules.transfer_agent.TransferAgent.transfer_set_schedule[routing]", + "params": {}, + "block": "transfer_set_schedule", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2307": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "2308": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0" + ] + }, + "2309": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0", + "8" + ] + }, + "2310": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "eq%0#0" + ] + }, + "2311": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "tmp%0#0" + ] + }, + "2312": { + "op": "btoi", + "defined_out": [ + "open_date#0" + ], + "stack_out": [ + "open_date#0" + ] + }, + "2313": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "open_date#0", + "tmp%2#0" + ], + "stack_out": [ + "open_date#0", + "tmp%2#0" + ] + }, + "2316": { + "op": "dup", + "defined_out": [ + "open_date#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "open_date#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "2317": { + "op": "len", + "defined_out": [ + "len%1#0", + "open_date#0", + "tmp%2#0" + ], + "stack_out": [ + "open_date#0", + "tmp%2#0", + "len%1#0" + ] + }, + "2318": { + "op": "intc_2 // 8", + "stack_out": [ + "open_date#0", + "tmp%2#0", + "len%1#0", + "8" + ] + }, + "2319": { + "op": "==", + "defined_out": [ + "eq%1#0", + "open_date#0", + "tmp%2#0" + ], + "stack_out": [ + "open_date#0", + "tmp%2#0", + "eq%1#0" + ] + }, + "2320": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "open_date#0", + "tmp%2#0" + ] + }, + "2321": { + "op": "btoi", + "defined_out": [ + "closure_date#0", + "open_date#0" + ], + "stack_out": [ + "open_date#0", + "closure_date#0" + ] + }, + "2322": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "2325": { + "op": "dup2", + "defined_out": [ + "closure_date#0", + "closure_date#0 (copy)", + "open_date#0", + "open_date#0 (copy)" + ], + "stack_out": [ + "open_date#0", + "closure_date#0", + "open_date#0 (copy)", + "closure_date#0 (copy)" + ] + }, + "2326": { + "op": "<", + "defined_out": [ + "closure_date#0", + "open_date#0", + "tmp%0#1" + ], + "stack_out": [ + "open_date#0", + "closure_date#0", + "tmp%0#1" + ] + }, + "2327": { + "error": "Time events must be sorted in strictly ascending order", + "op": "assert // Time events must be sorted in strictly ascending order", + "stack_out": [ + "open_date#0", + "closure_date#0" + ] + }, + "2328": { + "op": "bytec 29 // \"transfer_opening_date\"", + "defined_out": [ + "\"transfer_opening_date\"", + "closure_date#0", + "open_date#0" + ], + "stack_out": [ + "open_date#0", + "closure_date#0", + "\"transfer_opening_date\"" + ] + }, + "2330": { + "op": "uncover 2", + "stack_out": [ + "closure_date#0", + "\"transfer_opening_date\"", + "open_date#0" + ] + }, + "2332": { + "op": "app_global_put", + "stack_out": [ + "closure_date#0" + ] + }, + "2333": { + "op": "bytec 30 // \"transfer_closure_date\"", + "defined_out": [ + "\"transfer_closure_date\"", + "closure_date#0" + ], + "stack_out": [ + "closure_date#0", + "\"transfer_closure_date\"" + ] + }, + "2335": { + "op": "swap", + "stack_out": [ + "\"transfer_closure_date\"", + "closure_date#0" + ] + }, + "2336": { + "op": "app_global_put", + "stack_out": [] + }, + "2337": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%1#1" + ], + "stack_out": [ + "tmp%1#1" + ] + }, + "2339": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "2340": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "2341": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "2342": { + "op": "concat", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "2343": { + "op": "log", + "stack_out": [] + }, + "2344": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "2345": { + "op": "return", + "stack_out": [] + }, + "2346": { + "subroutine": "modules.transfer_agent.TransferAgent.primary_distribution[routing]", + "params": {}, + "block": "primary_distribution", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "holding_address#0" + ], + "stack_out": [ + "holding_address#0" + ] + }, + "2349": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "2350": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0" + ] + }, + "2351": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0", + "32" + ] + }, + "2352": { + "op": "==", + "defined_out": [ + "eq%0#0", + "holding_address#0" + ], + "stack_out": [ + "holding_address#0", + "eq%0#0" + ] + }, + "2353": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0" + ] + }, + "2354": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0" + ] + }, + "2357": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "2358": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%1#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "len%1#0" + ] + }, + "2359": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "holding_address#0", + "len%1#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "len%1#0", + "8" + ] + }, + "2360": { + "op": "==", + "defined_out": [ + "eq%1#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "eq%1#0" + ] + }, + "2361": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "holding_address#0", + "tmp%2#0" + ] + }, + "2362": { + "op": "btoi", + "defined_out": [ + "holding_address#0", + "units#0" + ], + "stack_out": [ + "holding_address#0", + "units#0" + ] + }, + "2363": { + "op": "dup", + "stack_out": [ + "holding_address#0", + "units#0", + "units#0" + ] + }, + "2364": { + "op": "cover 2", + "defined_out": [ + "holding_address#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0" + ] + }, + "2366": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0" + ] + }, + "2367": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "holding_address#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0", + "\"status\"" + ] + }, + "2368": { + "op": "app_global_get_ex", + "defined_out": [ + "holding_address#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2369": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "maybe_value%0#0" + ] + }, + "2370": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0" + ] + }, + "2371": { + "op": "bytec 22 // 0x523a50594423", + "defined_out": [ + "0x523a50594423", + "holding_address#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0x523a50594423" + ] + }, + "2373": { + "op": "txn Sender", + "defined_out": [ + "0x523a50594423", + "holding_address#0", + "tmp%0#3", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0x523a50594423", + "tmp%0#3" + ] + }, + "2375": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "holding_address#0", + "tmp%1#2", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "tmp%1#2" + ] + }, + "2378": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0" + ] + }, + "2379": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" + }, + "2382": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" + }, + "2385": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0" + ] + }, + "2386": { + "op": "bytec_1 // \"status\"", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0", + "\"status\"" + ] + }, + "2387": { + "op": "app_global_get_ex", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2388": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "maybe_value%0#0" + ] + }, + "2389": { + "op": "pushint 50", + "defined_out": [ + "50", + "holding_address#0", + "maybe_value%0#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "maybe_value%0#0", + "50" + ] + }, + "2391": { + "op": "==", + "defined_out": [ + "holding_address#0", + "tmp%0#4", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "tmp%0#4" + ] + }, + "2392": { + "error": "Primary distribution is closed", + "op": "assert // Primary distribution is closed", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0" + ] + }, + "2393": { + "op": "bytec 8 // 0x4123", + "defined_out": [ + "0x4123", + "holding_address#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0x4123" + ] + }, + "2395": { + "op": "dig 2", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "0x4123", + "holding_address#0 (copy)" + ] + }, + "2397": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "holding_address#0", + "units#0" + ], + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2398": { + "op": "dup", + "stack_out": [ + "units#0", + "holding_address#0", + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "2399": { + "op": "cover 3", + "defined_out": [ + "box_prefixed_key%0#1", + "holding_address#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "holding_address#0", + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2401": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "holding_address#0", + "maybe_exists%0#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "holding_address#0", + "units#0", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2402": { + "op": "bury 1", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "holding_address#0", + "units#0", + "maybe_exists%0#0" + ] + }, + "2404": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "holding_address#0", + "units#0" + ] + }, + "2405": { + "op": "swap", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "holding_address#0" + ] + }, + "2406": { + "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", + "op": "callsub _assert_is_not_account_suspended", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0" + ] + }, + "2409": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "units#0", + "units#0 (copy)" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "units#0 (copy)" + ] + }, + "2410": { + "error": "Can not distribute zero units", + "op": "assert // Can not distribute zero units", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0" + ] + }, + "2411": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "0" + ] + }, + "2412": { + "op": "bytec 11 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"", + "0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "0", + "\"reserved_units_total\"" + ] + }, + "2414": { + "op": "app_global_get_ex", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2415": { + "error": "check self.reserved_units_total exists", + "op": "assert // check self.reserved_units_total exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "maybe_value%0#0" + ] + }, + "2416": { + "op": "+", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%2#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%2#1" + ] + }, + "2417": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%2#1", + "0" + ] + }, + "2418": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0", + "box_prefixed_key%0#1", + "tmp%2#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%2#1", + "0", + "\"total_units\"" + ] + }, + "2420": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%2#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%2#1", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2421": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%2#1", + "maybe_value%1#0" + ] + }, + "2422": { + "op": "<=", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%3#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%3#1" + ] + }, + "2423": { + "error": "Insufficient remaining D-ASA units", + "op": "assert // Insufficient remaining D-ASA units", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2424": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "0" + ] + }, + "2425": { + "op": "bytec 28 // \"initial_exchange_date\"", + "defined_out": [ + "\"initial_exchange_date\"", + "0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "0", + "\"initial_exchange_date\"" + ] + }, + "2427": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%2#0", + "maybe_value%2#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "2428": { + "error": "check self.initial_exchange_date exists", + "op": "assert // check self.initial_exchange_date exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "maybe_value%2#0" + ] + }, + "2429": { + "op": "bz primary_distribution_after_if_else@3", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2432": { + "op": "global LatestTimestamp", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%5#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%5#1" + ] + }, + "2434": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%5#1", + "0" + ] + }, + "2435": { + "op": "bytec 28 // \"initial_exchange_date\"", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%5#1", + "0", + "\"initial_exchange_date\"" + ] + }, + "2437": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%3#0", + "maybe_value%3#0", + "tmp%5#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%5#1", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "2438": { + "error": "check self.initial_exchange_date exists", + "op": "assert // check self.initial_exchange_date exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%5#1", + "maybe_value%3#0" + ] + }, + "2439": { + "op": "<=", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%6#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%6#1" + ] + }, + "2440": { + "error": "Primary distribution is closed", + "op": "assert // Primary distribution is closed", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2441": { + "block": "primary_distribution_after_if_else@3", + "stack_in": [ + "units#0", + "box_prefixed_key%0#1" + ], + "op": "dupn 2", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "2443": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "2444": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0" + ] + }, + "2445": { + "op": "pushint 40", + "defined_out": [ + "40", + "aggregate%box_get%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0", + "40" + ] + }, + "2447": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "values%0#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "values%0#0" + ] + }, + "2448": { + "op": "dig 3", + "defined_out": [ + "box_prefixed_key%0#1", + "units#0", + "values%0#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "values%0#0", + "units#0" + ] + }, + "2450": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "units#0", + "units#0 (copy)", + "values%0#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1", + "values%0#0", + "units#0 (copy)", + "units#0 (copy)" + ] + }, + "2451": { + "op": "cover 3", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "box_prefixed_key%0#1", + "values%0#0", + "units#0 (copy)" + ] + }, + "2453": { + "op": "+", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%0#2", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "box_prefixed_key%0#1", + "tmp%0#2" + ] + }, + "2454": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "box_prefixed_key%0#1", + "aggregate%val_as_bytes%0#0" + ] + }, + "2455": { + "op": "pushint 40" + }, + "2457": { + "op": "swap", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "box_prefixed_key%0#1", + "40", + "aggregate%val_as_bytes%0#0" + ] + }, + "2458": { + "op": "box_replace", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0" + ] + }, + "2459": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "0" + ] + }, + "2460": { + "op": "bytec 11 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"", + "0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "0", + "\"reserved_units_total\"" + ] + }, + "2462": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%4#0", + "maybe_value%4#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "2463": { + "error": "check self.reserved_units_total exists", + "op": "assert // check self.reserved_units_total exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "units#0", + "maybe_value%4#0" + ] + }, + "2464": { + "op": "+", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%7#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0" + ] + }, + "2465": { + "op": "bytec 11 // \"reserved_units_total\"", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0", + "\"reserved_units_total\"" + ] + }, + "2467": { + "op": "dig 1", + "defined_out": [ + "\"reserved_units_total\"", + "box_prefixed_key%0#1", + "tmp%7#0", + "tmp%7#0 (copy)", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0", + "\"reserved_units_total\"", + "tmp%7#0 (copy)" + ] + }, + "2469": { + "op": "app_global_put", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0" + ] + }, + "2470": { + "op": "intc_0 // 0", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0", + "0" + ] + }, + "2471": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0", + "box_prefixed_key%0#1", + "tmp%7#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0", + "0", + "\"total_units\"" + ] + }, + "2473": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%5#0", + "maybe_value%5#0", + "tmp%7#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "2474": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%7#0", + "maybe_value%5#0" + ] + }, + "2475": { + "op": "swap", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "maybe_value%5#0", + "tmp%7#0" + ] + }, + "2476": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%8#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%8#0" + ] + }, + "2477": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%1#0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "aggregate%val_as_bytes%1#0" + ] + }, + "2478": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%1#0", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "aggregate%val_as_bytes%1#0", + "0x151f7c75" + ] + }, + "2479": { + "op": "swap", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "0x151f7c75", + "aggregate%val_as_bytes%1#0" + ] + }, + "2480": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%6#0", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "tmp%6#0" + ] + }, + "2481": { + "op": "log", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2482": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "box_prefixed_key%0#1", + "units#0" + ], + "stack_out": [ + "units#0", + "box_prefixed_key%0#1", + "1" + ] + }, + "2483": { + "op": "return", + "stack_out": [ + "units#0", + "box_prefixed_key%0#1" + ] + }, + "2484": { + "subroutine": "modules.transfer_agent.TransferAgent.transfer[routing]", + "params": {}, + "block": "transfer", + "stack_in": [], + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3" + ] + }, + "2485": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4" + ] + }, + "2486": { + "op": "txna ApplicationArgs 1" + }, + "2489": { + "op": "dup", + "defined_out": [ + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "sender_holding_address#0" + ] + }, + "2490": { + "op": "len", + "defined_out": [ + "len%0#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "len%0#0" + ] + }, + "2491": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "len%0#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "len%0#0", + "32" + ] + }, + "2492": { + "op": "==", + "defined_out": [ + "eq%0#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "eq%0#0" + ] + }, + "2493": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0" + ] + }, + "2494": { + "op": "txna ApplicationArgs 2" + }, + "2497": { + "op": "dup", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "receiver_holding_address#0" + ] + }, + "2498": { + "op": "len", + "defined_out": [ + "len%1#0", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "len%1#0" + ] + }, + "2499": { + "op": "intc_3 // 32", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "len%1#0", + "32" + ] + }, + "2500": { + "op": "==", + "defined_out": [ + "eq%1#0", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "eq%1#0" + ] + }, + "2501": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0" + ] + }, + "2502": { + "op": "txna ApplicationArgs 3" + }, + "2505": { + "op": "dupn 2", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "tmp%4#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "tmp%4#0", + "tmp%4#0 (copy)" + ] + }, + "2507": { + "op": "len", + "defined_out": [ + "len%2#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "tmp%4#0", + "len%2#0" + ] + }, + "2508": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "len%2#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "tmp%4#0", + "len%2#0", + "8" + ] + }, + "2509": { + "op": "==", + "defined_out": [ + "eq%2#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "tmp%4#0", + "eq%2#0" + ] + }, + "2510": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "tmp%4#0" + ] + }, + "2511": { + "op": "btoi", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2512": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2513": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"status\"" + ] + }, + "2514": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2515": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0" + ] + }, + "2516": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2517": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" + }, + "2520": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" + }, + "2523": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2524": { + "op": "bytec_1 // \"status\"", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"status\"" + ] + }, + "2525": { + "op": "app_global_get_ex", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2526": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0" + ] + }, + "2527": { + "op": "pushint 50", + "defined_out": [ + "50", + "maybe_value%0#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "50" + ] + }, + "2529": { + "op": "==", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%0#3", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%0#3" + ] + }, + "2530": { + "op": "!", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%1#1", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%1#1" + ] + }, + "2531": { + "error": "IED not yet executed", + "op": "assert // IED not yet executed", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2532": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2533": { + "op": "bytec 29 // \"transfer_opening_date\"", + "defined_out": [ + "\"transfer_opening_date\"", + "0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"transfer_opening_date\"" + ] + }, + "2535": { + "op": "app_global_get_ex", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2536": { + "error": "check self.transfer_opening_date exists", + "op": "assert // check self.transfer_opening_date exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0" + ] + }, + "2537": { + "op": "bz transfer_after_if_else@3", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2540": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2541": { + "op": "bytec 29 // \"transfer_opening_date\"", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"transfer_opening_date\"" + ] + }, + "2543": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2544": { + "error": "check self.transfer_opening_date exists", + "op": "assert // check self.transfer_opening_date exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%1#0" + ] + }, + "2545": { + "op": "global LatestTimestamp", + "defined_out": [ + "maybe_value%1#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%1#2", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%1#0", + "tmp%1#2" + ] + }, + "2547": { + "op": "<=", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%2#1", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%2#1" + ] + }, + "2548": { + "error": "Transfer is closed", + "op": "assert // Transfer is closed", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2549": { + "block": "transfer_after_if_else@3", + "stack_in": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2550": { + "op": "bytec 30 // \"transfer_closure_date\"", + "defined_out": [ + "\"transfer_closure_date\"", + "0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"transfer_closure_date\"" + ] + }, + "2552": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "2553": { + "error": "check self.transfer_closure_date exists", + "op": "assert // check self.transfer_closure_date exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%2#0" + ] + }, + "2554": { + "op": "bz transfer_after_if_else@5", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2557": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%4#2" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%4#2" + ] + }, + "2559": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%4#2", + "0" + ] + }, + "2560": { + "op": "bytec 30 // \"transfer_closure_date\"", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%4#2", + "0", + "\"transfer_closure_date\"" + ] + }, + "2562": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0", + "tmp%4#2" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%4#2", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "2563": { + "error": "check self.transfer_closure_date exists", + "op": "assert // check self.transfer_closure_date exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%4#2", + "maybe_value%3#0" + ] + }, + "2564": { + "op": "<", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%5#0" + ] + }, + "2565": { + "error": "Transfer is closed", + "op": "assert // Transfer is closed", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2566": { + "block": "transfer_after_if_else@5", + "stack_in": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ], + "op": "txn Sender", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%0#1" + ] + }, + "2568": { + "op": "dig 4", + "defined_out": [ + "sender_holding_address#0", + "tmp%0#1" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%0#1", + "sender_holding_address#0" + ] + }, + "2570": { + "op": "dup", + "defined_out": [ + "sender_holding_address#0", + "sender_holding_address#0 (copy)", + "tmp%0#1" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%0#1", + "sender_holding_address#0 (copy)", + "sender_holding_address#0 (copy)" + ] + }, + "2571": { + "op": "cover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "tmp%0#1", + "sender_holding_address#0 (copy)" + ] + }, + "2573": { + "op": "==", + "defined_out": [ + "sender_holding_address#0", + "tmp%1#1" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "tmp%1#1" + ] + }, + "2574": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0" + ] + }, + "2575": { + "op": "bytec 8 // 0x4123", + "defined_out": [ + "0x4123", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "0x4123" + ] + }, + "2577": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "0x4123", + "sender_holding_address#0 (copy)" + ] + }, + "2579": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#3", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3" + ] + }, + "2580": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#3" + ] + }, + "2581": { + "op": "bury 8", + "defined_out": [ + "box_prefixed_key%0#3", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3" + ] + }, + "2583": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#3 (copy)", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#3 (copy)" + ] + }, + "2584": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#3", + "maybe_exists%0#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2585": { + "op": "bury 1", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "maybe_exists%0#0" + ] + }, + "2587": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3" + ] + }, + "2588": { + "op": "bytec 8 // 0x4123", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "0x4123" + ] + }, + "2590": { + "op": "dig 5", + "defined_out": [ + "0x4123", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "0x4123", + "receiver_holding_address#0" + ] + }, + "2592": { + "op": "dup", + "defined_out": [ + "0x4123", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "receiver_holding_address#0 (copy)", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "0x4123", + "receiver_holding_address#0 (copy)", + "receiver_holding_address#0 (copy)" + ] + }, + "2593": { + "op": "cover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "0x4123", + "receiver_holding_address#0 (copy)" + ] + }, + "2595": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "box_prefixed_key%0#4" + ] + }, + "2596": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4" + ] + }, + "2597": { + "op": "bury 9", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "box_prefixed_key%0#4" + ] + }, + "2599": { + "op": "box_len", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2600": { + "op": "bury 1", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "maybe_exists%0#0" + ] + }, + "2602": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0" + ] + }, + "2603": { + "op": "dig 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0 (copy)" + ] + }, + "2605": { + "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", + "op": "callsub _assert_is_not_account_suspended", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0" + ] + }, + "2608": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "receiver_holding_address#0 (copy)" + ] + }, + "2609": { + "callsub": "modules.accounting.AccountingModule._assert_is_not_account_suspended", + "op": "callsub _assert_is_not_account_suspended", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0" + ] + }, + "2612": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0" + ] + }, + "2614": { + "op": "!=", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%2#1" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "tmp%2#1" + ] + }, + "2615": { + "error": "Sender and receiver must be different", + "op": "assert // Sender and receiver must be different", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3" + ] + }, + "2616": { + "op": "dig 1", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0" + ] + }, + "2618": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0", + "units#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "units#0 (copy)" + ] + }, + "2619": { + "error": "Transfer units must be greater than zero", + "op": "assert // Transfer units must be greater than zero", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0" + ] + }, + "2620": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#3" + ] + }, + "2621": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "2622": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "aggregate%box_get%0#0" + ] + }, + "2623": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "aggregate%box_get%0#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "aggregate%box_get%0#0", + "32" + ] + }, + "2624": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "values%0#0" + ] + }, + "2625": { + "op": "<=", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#1", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%4#1" + ] + }, + "2626": { + "error": "Insufficient sender units to transfer", + "op": "assert // Insufficient sender units to transfer", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2627": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2628": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"event_cursor\"" + ] + }, + "2629": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "maybe_exists%0#0", + "maybe_value%0#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2630": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0" + ] + }, + "2631": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "0" + ] + }, + "2632": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "maybe_value%0#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "2633": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2634": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "2635": { + "op": ">=", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%0#3", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%0#3" + ] + }, + "2636": { + "op": "bnz transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2639": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0" + ] + }, + "2640": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0", + "\"event_cursor\"" + ] + }, + "2641": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "maybe_exists%2#0", + "maybe_value%2#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "2642": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "maybe_value%2#0" + ] + }, + "2643": { + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "next_entry#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "next_entry#0" + ] + }, + "2646": { + "op": "pushint 9", + "defined_out": [ + "9", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "next_entry#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "next_entry#0", + "9" + ] + }, + "2648": { + "op": "extract_uint64", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "values%0#0" + ] + }, + "2649": { + "op": "global LatestTimestamp", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%2#3", + "units#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "values%0#0", + "tmp%2#3" + ] + }, + "2651": { + "op": ">", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%3#3", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%3#3" + ] + }, + "2652": { + "error": "ACTUS event not yet executed", + "op": "assert // ACTUS event not yet executed", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2653": { + "block": "transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10", + "stack_in": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ], + "op": "dig 3", + "defined_out": [ + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0" + ] + }, + "2655": { + "op": "dup", + "defined_out": [ + "sender_holding_address#0", + "sender_holding_address#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "sender_holding_address#0 (copy)" + ] + }, + "2656": { + "callsub": "modules.accounting.AccountingModule._ensure_units_activated", + "op": "callsub _ensure_units_activated", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0" + ] + }, + "2659": { + "op": "dig 3", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "receiver_holding_address#0" + ] + }, + "2661": { + "op": "dup", + "defined_out": [ + "receiver_holding_address#0", + "receiver_holding_address#0 (copy)", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "sender_holding_address#0", + "receiver_holding_address#0 (copy)", + "receiver_holding_address#0 (copy)" + ] + }, + "2662": { + "op": "cover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "receiver_holding_address#0", + "sender_holding_address#0", + "receiver_holding_address#0 (copy)" + ] + }, + "2664": { + "callsub": "modules.accounting.AccountingModule._ensure_units_activated", + "op": "callsub _ensure_units_activated", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "receiver_holding_address#0", + "sender_holding_address#0" + ] + }, + "2667": { + "callsub": "modules.accounting.AccountingModule._settle_position", + "op": "callsub _settle_position", + "defined_out": [ + "receiver_holding_address#0", + "sender_holding_address#0", + "{_settle_position}.0", + "{_settle_position}.1" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "receiver_holding_address#0", + "{_settle_position}.0", + "{_settle_position}.1" + ] + }, + "2670": { + "op": "popn 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "receiver_holding_address#0" + ] + }, + "2672": { + "callsub": "modules.accounting.AccountingModule._settle_position", + "op": "callsub _settle_position", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "{_settle_position}.0", + "{_settle_position}.1" + ] + }, + "2675": { + "op": "popn 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2677": { + "op": "dig 5", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3" + ] + }, + "2679": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#3 (copy)", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#3 (copy)" + ] + }, + "2680": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%2#0", + "aggregate%box_get%3#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "aggregate%box_get%2#0", + "aggregate%box_get%3#0" + ] + }, + "2681": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "aggregate%box_get%2#0" + ] + }, + "2682": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "aggregate%box_get%2#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "aggregate%box_get%2#0", + "32" + ] + }, + "2683": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "values%0#0" + ] + }, + "2684": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "values%0#0", + "units#0" + ] + }, + "2686": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0", + "units#0 (copy)", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "values%0#0", + "units#0 (copy)", + "units#0 (copy)" + ] + }, + "2687": { + "op": "cover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "values%0#0", + "units#0 (copy)" + ] + }, + "2689": { + "op": "dig 1", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0", + "units#0 (copy)", + "values%0#0", + "values%0#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "values%0#0", + "units#0 (copy)", + "values%0#0 (copy)" + ] + }, + "2691": { + "op": "<=", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%0#3", + "units#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "values%0#0", + "tmp%0#3" + ] + }, + "2692": { + "error": "Insufficient sender units to transfer", + "op": "assert // Insufficient sender units to transfer", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "values%0#0" + ] + }, + "2693": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "values%0#0", + "units#0 (copy)" + ] + }, + "2695": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%1#2", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "tmp%1#2" + ] + }, + "2696": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#3", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#3", + "units#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "2697": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#3" + ] + }, + "2699": { + "op": "intc_3 // 32", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#3", + "32" + ] + }, + "2700": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#3", + "32", + "aggregate%val_as_bytes%0#0" + ] + }, + "2702": { + "op": "box_replace", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0" + ] + }, + "2703": { + "op": "dig 5", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#4" + ] + }, + "2705": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4 (copy)", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#4", + "box_prefixed_key%0#4 (copy)" + ] + }, + "2706": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%6#0", + "aggregate%box_get%7#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#4", + "aggregate%box_get%6#0", + "aggregate%box_get%7#0" + ] + }, + "2707": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#4", + "aggregate%box_get%6#0" + ] + }, + "2708": { + "op": "intc_3 // 32", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#4", + "aggregate%box_get%6#0", + "32" + ] + }, + "2709": { + "op": "extract_uint64", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "units#0", + "box_prefixed_key%0#4", + "values%0#0" + ] + }, + "2710": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#4", + "values%0#0", + "units#0" + ] + }, + "2712": { + "op": "+", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%0#5", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#4", + "tmp%0#5" + ] + }, + "2713": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%1#0", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#4", + "aggregate%val_as_bytes%1#0" + ] + }, + "2714": { + "op": "intc_3 // 32" + }, + "2715": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "box_prefixed_key%0#4", + "32", + "aggregate%val_as_bytes%1#0" + ] + }, + "2716": { + "op": "box_replace", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2717": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0x151f7c75" + ] + }, + "2718": { + "op": "dig 2", + "defined_out": [ + "0x151f7c75", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "0x151f7c75", + "tmp%4#0" + ] + }, + "2720": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "tmp%8#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "tmp%8#0" + ] + }, + "2721": { + "op": "log", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2722": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "receiver_holding_address#0", + "sender_holding_address#0", + "tmp%4#0", + "units#0" + ], + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0", + "1" + ] + }, + "2723": { + "op": "return", + "stack_out": [ + "box_prefixed_key%0#3", + "box_prefixed_key%0#4", + "sender_holding_address#0", + "receiver_holding_address#0", + "tmp%4#0", + "units#0" + ] + }, + "2724": { + "subroutine": "modules.accounting.AccountingModule.account_suspension[routing]", + "params": {}, + "block": "account_suspension", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "holding_address#0" + ], + "stack_out": [ + "holding_address#0" + ] + }, + "2727": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "2728": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0" + ] + }, + "2729": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0", + "32" + ] + }, + "2730": { + "op": "==", + "defined_out": [ + "eq%0#0", + "holding_address#0" + ], + "stack_out": [ + "holding_address#0", + "eq%0#0" + ] + }, + "2731": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0" + ] + }, + "2732": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0" + ] + }, + "2735": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "2736": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%1#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "len%1#0" + ] + }, + "2737": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "holding_address#0", + "len%1#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "len%1#0", + "1" + ] + }, + "2738": { + "op": "==", + "defined_out": [ + "eq%1#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "eq%1#0" + ] + }, + "2739": { + "error": "invalid number of bytes for arc4.bool", + "op": "assert // invalid number of bytes for arc4.bool", + "stack_out": [ + "holding_address#0", + "tmp%2#0" + ] + }, + "2740": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "0" + ] + }, + "2741": { + "op": "getbit", + "defined_out": [ + "holding_address#0", + "suspended#0" + ], + "stack_out": [ + "holding_address#0", + "suspended#0" + ] + }, + "2742": { + "op": "bytec 21 // 0x523a41555423", + "defined_out": [ + "0x523a41555423", + "holding_address#0", + "suspended#0" + ], + "stack_out": [ + "holding_address#0", + "suspended#0", + "0x523a41555423" + ] + }, + "2744": { + "op": "txn Sender", + "defined_out": [ + "0x523a41555423", + "holding_address#0", + "suspended#0", + "tmp%0#2" + ], + "stack_out": [ + "holding_address#0", + "suspended#0", + "0x523a41555423", + "tmp%0#2" + ] + }, + "2746": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "holding_address#0", + "suspended#0", + "tmp%1#0" + ], + "stack_out": [ + "holding_address#0", + "suspended#0", + "tmp%1#0" + ] + }, + "2749": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "holding_address#0", + "suspended#0" + ] + }, + "2750": { + "op": "bytec 8 // 0x4123", + "defined_out": [ + "0x4123", + "holding_address#0", + "suspended#0" + ], + "stack_out": [ + "holding_address#0", + "suspended#0", + "0x4123" + ] + }, + "2752": { + "op": "uncover 2", + "stack_out": [ + "suspended#0", + "0x4123", + "holding_address#0" + ] + }, + "2754": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1" + ] + }, + "2755": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "2756": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2757": { + "op": "bury 1", + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "2759": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1" + ] + }, + "2760": { + "op": "dup", + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "2761": { + "op": "pushint 48", + "defined_out": [ + "48", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "48" + ] + }, + "2763": { + "op": "intc_1 // 1", + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "48", + "1" + ] + }, + "2764": { + "op": "box_extract", + "defined_out": [ + "box%box_extract%0#0", + "box_prefixed_key%0#1", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "box%box_extract%0#0" + ] + }, + "2765": { + "op": "intc_0 // 0", + "stack_out": [ + "suspended#0", + "box_prefixed_key%0#1", + "box%box_extract%0#0", + "0" + ] + }, + "2766": { + "op": "uncover 3", + "stack_out": [ + "box_prefixed_key%0#1", + "box%box_extract%0#0", + "0", + "suspended#0" + ] + }, + "2768": { + "op": "setbit", + "defined_out": [ + "aggregate%updated_target%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "aggregate%updated_target%0#0" + ] + }, + "2769": { + "op": "pushint 48" + }, + "2771": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#1", + "48", + "aggregate%updated_target%0#0" + ] + }, + "2772": { + "op": "box_replace", + "stack_out": [] + }, + "2773": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "2775": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "2776": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "2777": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "2778": { + "op": "concat", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "2779": { + "op": "log", + "stack_out": [] + }, + "2780": { + "op": "intc_1 // 1", + "stack_out": [ + "1" + ] + }, + "2781": { + "op": "return", + "stack_out": [] + }, + "2782": { + "subroutine": "modules.accounting.AccountingModule.account_open[routing]", + "params": {}, + "block": "account_open", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "holding_address#0" + ], + "stack_out": [ + "holding_address#0" + ] + }, + "2785": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "2786": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0" + ] + }, + "2787": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0", + "32" + ] + }, + "2788": { + "op": "==", + "defined_out": [ + "eq%0#0", + "holding_address#0" + ], + "stack_out": [ + "holding_address#0", + "eq%0#0" + ] + }, + "2789": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0" + ] + }, + "2790": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "holding_address#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0" + ] + }, + "2793": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "payment_address#0", + "payment_address#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "payment_address#0 (copy)" + ] + }, + "2794": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%1#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "len%1#0" + ] + }, + "2795": { + "op": "intc_3 // 32", + "stack_out": [ + "holding_address#0", + "payment_address#0", + "len%1#0", + "32" + ] + }, + "2796": { + "op": "==", + "defined_out": [ + "eq%1#0", + "holding_address#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "eq%1#0" + ] + }, + "2797": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0", + "payment_address#0" + ] + }, + "2798": { + "op": "bytec 23 // 0x523a4d4e4723", + "defined_out": [ + "0x523a4d4e4723", + "holding_address#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "0x523a4d4e4723" + ] + }, + "2800": { + "op": "txn Sender", + "defined_out": [ + "0x523a4d4e4723", + "holding_address#0", + "payment_address#0", + "tmp%0#2" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "0x523a4d4e4723", + "tmp%0#2" + ] + }, + "2802": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "holding_address#0", + "payment_address#0", + "tmp%1#1" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "tmp%1#1" + ] + }, + "2805": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "holding_address#0", + "payment_address#0" + ] + }, + "2806": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "holding_address#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "0" + ] + }, + "2807": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "holding_address#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "0", + "\"status\"" + ] + }, + "2808": { + "op": "app_global_get_ex", + "defined_out": [ + "holding_address#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2809": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "holding_address#0", + "payment_address#0", + "maybe_value%0#0" + ] + }, + "2810": { + "op": "pushint 200", + "defined_out": [ + "200", + "holding_address#0", + "maybe_value%0#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "maybe_value%0#0", + "200" + ] + }, + "2813": { + "op": "==", + "defined_out": [ + "holding_address#0", + "payment_address#0", + "tmp%0#3" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "tmp%0#3" + ] + }, + "2814": { + "op": "!", + "stack_out": [ + "holding_address#0", + "payment_address#0", + "tmp%1#1" + ] + }, + "2815": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "holding_address#0", + "payment_address#0" + ] + }, + "2816": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" + }, + "2819": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" + }, + "2822": { + "op": "bytec 8 // 0x4123", + "defined_out": [ + "0x4123", + "holding_address#0", + "payment_address#0" + ], + "stack_out": [ + "holding_address#0", + "payment_address#0", + "0x4123" + ] + }, + "2824": { + "op": "uncover 2", + "stack_out": [ + "payment_address#0", + "0x4123", + "holding_address#0" + ] + }, + "2826": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "payment_address#0" + ], + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0" + ] + }, + "2827": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "payment_address#0" + ], + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "2828": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%0#0", + "payment_address#0" + ], + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2829": { + "op": "bury 1", + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0", + "maybe_exists%0#0" + ] + }, + "2831": { + "op": "!", + "defined_out": [ + "box_prefixed_key%0#0", + "payment_address#0", + "tmp%2#1" + ], + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0", + "tmp%2#1" + ] + }, + "2832": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0" + ] + }, + "2833": { + "op": "intc_0 // 0", + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0", + "0" + ] + }, + "2834": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0", + "payment_address#0" + ], + "stack_out": [ + "payment_address#0", + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "2835": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "payment_address#0" + ] + }, + "2837": { + "op": "dig 1", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%0#0 (copy)", + "box_prefixed_key%0#0", + "payment_address#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "payment_address#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2839": { + "op": "concat", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%1#0" + ] + }, + "2840": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%1#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2842": { + "op": "concat", + "defined_out": [ + "aggregate%head%2#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%2#0" + ] + }, + "2843": { + "op": "bytec 41 // 0x00", + "defined_out": [ + "0x00", + "aggregate%head%2#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%2#0", + "0x00" + ] + }, + "2845": { + "op": "concat", + "defined_out": [ + "aggregate%head%3#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%3#0" + ] + }, + "2846": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%3#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2848": { + "op": "concat", + "defined_out": [ + "aggregate%head%4#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%4#0" + ] + }, + "2849": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%4#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2851": { + "op": "concat", + "defined_out": [ + "aggregate%head%5#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%5#0" + ] + }, + "2852": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%5#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2854": { + "op": "concat", + "defined_out": [ + "aggregate%head%6#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%6#0" + ] + }, + "2855": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%6#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "2857": { + "op": "concat", + "defined_out": [ + "aggregate%head%7#0", + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%val_as_bytes%0#0", + "aggregate%head%7#0" + ] + }, + "2858": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "2859": { + "op": "concat", + "defined_out": [ + "aggregate%head%8#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "aggregate%head%8#0" + ] + }, + "2860": { + "op": "box_put", + "stack_out": [] + }, + "2861": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%4#1" + ], + "stack_out": [ + "tmp%4#1" + ] + }, + "2863": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%7#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%7#0" + ] + }, + "2864": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%7#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%7#0", + "0x151f7c75" + ] + }, + "2865": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%7#0" + ] + }, + "2866": { + "op": "concat", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "2867": { + "op": "log", + "stack_out": [] + }, + "2868": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "2869": { + "op": "return", + "stack_out": [] + }, + "2870": { + "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", + "params": {}, + "block": "account_update_payment_address", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "holding_address#0" + ], + "stack_out": [ + "holding_address#0" + ] + }, + "2873": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "2874": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0" + ] + }, + "2875": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0", + "32" + ] + }, + "2876": { + "op": "==", + "defined_out": [ + "eq%0#0", + "holding_address#0" + ], + "stack_out": [ + "holding_address#0", + "eq%0#0" + ] + }, + "2877": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0" + ] + }, + "2878": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0" + ] + }, + "2881": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "2882": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%1#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "len%1#0" + ] + }, + "2883": { + "op": "intc_3 // 32", + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "len%1#0", + "32" + ] + }, + "2884": { + "op": "==", + "defined_out": [ + "eq%1#0", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "eq%1#0" + ] + }, + "2885": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0", + "tmp%2#0" + ] + }, + "2886": { + "op": "bytec 8 // 0x4123", + "defined_out": [ + "0x4123", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "0x4123" + ] + }, + "2888": { + "op": "dig 2", + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "0x4123", + "holding_address#0 (copy)" + ] + }, + "2890": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "box_prefixed_key%0#1" + ] + }, + "2891": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "holding_address#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "2892": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "holding_address#0", + "maybe_exists%0#0", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2893": { + "op": "bury 1", + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "2895": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "box_prefixed_key%0#1" + ] + }, + "2896": { + "op": "txn Sender", + "defined_out": [ + "box_prefixed_key%0#1", + "holding_address#0", + "tmp%0#1", + "tmp%2#0" + ], + "stack_out": [ + "holding_address#0", + "tmp%2#0", + "box_prefixed_key%0#1", + "tmp%0#1" + ] + }, + "2898": { + "op": "uncover 3", + "stack_out": [ + "tmp%2#0", + "box_prefixed_key%0#1", + "tmp%0#1", + "holding_address#0" + ] + }, + "2900": { + "op": "==", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%1#1", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "box_prefixed_key%0#1", + "tmp%1#1" + ] + }, + "2901": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "tmp%2#0", + "box_prefixed_key%0#1" + ] + }, + "2902": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" + }, + "2905": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" + }, + "2908": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "box_prefixed_key%0#1", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "box_prefixed_key%0#1", + "0" + ] + }, + "2909": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#1", + "0", + "tmp%2#0" + ] + }, + "2911": { + "op": "box_replace", + "stack_out": [] + }, + "2912": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%2#1" + ], + "stack_out": [ + "tmp%2#1" + ] + }, + "2914": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "2915": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "2916": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "2917": { + "op": "concat", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "2918": { + "op": "log", + "stack_out": [] + }, + "2919": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "2920": { + "op": "return", + "stack_out": [] + }, + "2921": { + "subroutine": "modules.accounting.AccountingModule.account_get_position[routing]", + "params": {}, + "block": "account_get_position", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "holding_address#0" + ], + "stack_out": [ + "holding_address#0" + ] + }, + "2924": { + "op": "dup", + "defined_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ], + "stack_out": [ + "holding_address#0", + "holding_address#0 (copy)" + ] + }, + "2925": { + "op": "len", + "defined_out": [ + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0" + ] + }, + "2926": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "holding_address#0", + "len%0#0" + ], + "stack_out": [ + "holding_address#0", + "len%0#0", + "32" + ] + }, + "2927": { + "op": "==", + "defined_out": [ + "eq%0#0", + "holding_address#0" + ], + "stack_out": [ + "holding_address#0", + "eq%0#0" + ] + }, + "2928": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "holding_address#0" + ] + }, + "2929": { + "op": "bytec 8 // 0x4123", + "defined_out": [ + "0x4123", + "holding_address#0" + ], + "stack_out": [ + "holding_address#0", + "0x4123" + ] + }, + "2931": { + "op": "swap", + "stack_out": [ + "0x4123", + "holding_address#0" + ] + }, + "2932": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "box_prefixed_key%0#1" + ] + }, + "2933": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "2934": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "2935": { + "op": "bury 1", + "stack_out": [ + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "2937": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "box_prefixed_key%0#1" + ] + }, + "2938": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ], + "stack_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "2939": { + "op": "pop", + "stack_out": [ + "aggregate%box_get%0#0" + ] + }, + "2940": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%box_get%0#0" + ], + "stack_out": [ + "aggregate%box_get%0#0", + "0x151f7c75" + ] + }, + "2941": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%box_get%0#0" + ] + }, + "2942": { + "op": "concat", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0" + ] + }, + "2943": { + "op": "log", + "stack_out": [] + }, + "2944": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "2945": { + "op": "return", + "stack_out": [] + }, + "2946": { + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_create[routing]", + "params": {}, + "block": "contract_create", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "arranger#0" + ], + "stack_out": [ + "arranger#0" + ] + }, + "2949": { + "op": "dup", + "defined_out": [ + "arranger#0", + "arranger#0 (copy)" + ], + "stack_out": [ + "arranger#0", + "arranger#0 (copy)" + ] + }, + "2950": { + "op": "len", + "defined_out": [ + "arranger#0", + "len%0#0" + ], + "stack_out": [ + "arranger#0", + "len%0#0" + ] + }, + "2951": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "arranger#0", + "len%0#0" + ], + "stack_out": [ + "arranger#0", + "len%0#0", + "32" + ] + }, + "2952": { + "op": "==", + "defined_out": [ + "arranger#0", + "eq%0#0" + ], + "stack_out": [ + "arranger#0", + "eq%0#0" + ] + }, + "2953": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "arranger#0" + ] + }, + "2954": { + "op": "bytec 18 // 0x523a41525223", + "defined_out": [ + "0x523a41525223", + "arranger#0" + ], + "stack_out": [ + "arranger#0", + "0x523a41525223" + ] + }, + "2956": { + "op": "swap", + "stack_out": [ + "0x523a41525223", + "arranger#0" + ] + }, + "2957": { + "op": "app_global_put", + "stack_out": [] + }, + "2958": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "2960": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "2961": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "2962": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "2963": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "2964": { + "op": "log", + "stack_out": [] + }, + "2965": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "2966": { + "op": "return", + "stack_out": [] + }, + "2967": { + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_config[routing]", + "params": {}, + "block": "contract_config", + "stack_in": [], + "op": "pushbytes \"\"", + "stack_out": [ + "day_count_convention#0" + ] + }, + "2969": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2" + ] + }, + "2970": { + "op": "txna ApplicationArgs 1" + }, + "2973": { + "op": "dupn 2", + "defined_out": [ + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "terms#0", + "terms#0 (copy)" + ] + }, + "2975": { + "op": "len", + "defined_out": [ + "len%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "terms#0", + "len%0#0" + ] + }, + "2976": { + "op": "pushint 107", + "defined_out": [ + "107", + "len%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "terms#0", + "len%0#0", + "107" + ] + }, + "2978": { + "op": "==", + "defined_out": [ + "eq%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "terms#0", + "eq%0#0" + ] + }, + "2979": { + "error": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "terms#0" + ] + }, + "2980": { + "op": "txna ApplicationArgs 2" + }, + "2983": { + "op": "dup", + "defined_out": [ + "initial_state#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "terms#0", + "initial_state#0", + "initial_state#0" + ] + }, + "2984": { + "op": "cover 2", + "defined_out": [ + "initial_state#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "terms#0", + "initial_state#0" + ] + }, + "2986": { + "op": "len", + "defined_out": [ + "initial_state#0", + "len%1#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "terms#0", + "len%1#0" + ] + }, + "2987": { + "op": "pushint 72", + "defined_out": [ + "72", + "initial_state#0", + "len%1#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "terms#0", + "len%1#0", + "72" + ] + }, + "2989": { + "op": "==", + "defined_out": [ + "eq%1#0", + "initial_state#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "terms#0", + "eq%1#0" + ] + }, + "2990": { + "error": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.InitialKernelState", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "terms#0" + ] + }, + "2991": { + "op": "txna ApplicationArgs 3" + }, + "2994": { + "op": "dup", + "defined_out": [ + "initial_state#0", + "prospectus#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "terms#0", + "prospectus#0", + "prospectus#0" + ] + }, + "2995": { + "op": "cover 2", + "defined_out": [ + "initial_state#0", + "prospectus#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0" + ] + }, + "2997": { + "op": "dup", + "defined_out": [ + "initial_state#0", + "prospectus#0", + "prospectus#0 (copy)", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "prospectus#0 (copy)" + ] + }, + "2998": { + "op": "len", + "defined_out": [ + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0" + ] + }, + "2999": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "prospectus#0 (copy)" + ] + }, + "3001": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "initial_state#0", + "prospectus#0", + "prospectus#0 (copy)", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "prospectus#0 (copy)", + "32" + ] + }, + "3002": { + "error": "invalid tuple encoding", + "op": "extract_uint16 // on error: invalid tuple encoding", + "defined_out": [ + "extract_uint16%0#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "extract_uint16%0#0" + ] + }, + "3003": { + "op": "dup", + "defined_out": [ + "extract_uint16%0#0", + "extract_uint16%0#0 (copy)", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "extract_uint16%0#0", + "extract_uint16%0#0 (copy)" + ] + }, + "3004": { + "op": "pushint 34", + "defined_out": [ + "34", + "extract_uint16%0#0", + "extract_uint16%0#0 (copy)", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "extract_uint16%0#0", + "extract_uint16%0#0 (copy)", + "34" + ] + }, + "3006": { + "op": "==", + "defined_out": [ + "eq%2#0", + "extract_uint16%0#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "extract_uint16%0#0", + "eq%2#0" + ] + }, + "3007": { + "error": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))", + "op": "assert // invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "prospectus#0", + "tuple_len%0#0", + "extract_uint16%0#0" + ] + }, + "3008": { + "op": "uncover 2", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0", + "extract_uint16%0#0", + "prospectus#0" + ] + }, + "3010": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0", + "prospectus#0", + "extract_uint16%0#0" + ] + }, + "3011": { + "op": "dig 2", + "defined_out": [ + "extract_uint16%0#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0", + "tuple_len%0#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0", + "prospectus#0", + "extract_uint16%0#0", + "tuple_len%0#0 (copy)" + ] + }, + "3013": { + "op": "substring3", + "defined_out": [ + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0", + "substring3%0#0" + ] + }, + "3014": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "tuple_len%0#0", + "substring3%0#0", + "substring3%0#0" + ] + }, + "3015": { + "op": "cover 3", + "defined_out": [ + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0", + "substring3%0#0" + ] + }, + "3017": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0", + "substring3%0#0", + "0" + ] + }, + "3018": { + "error": "invalid array length header", + "op": "extract_uint16 // on error: invalid array length header", + "defined_out": [ + "aggregate%array_length%0#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0", + "aggregate%array_length%0#0" + ] + }, + "3019": { + "op": "pushint 36", + "defined_out": [ + "36", + "aggregate%array_length%0#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0", + "aggregate%array_length%0#0", + "36" + ] + }, + "3021": { + "op": "+", + "defined_out": [ + "add%1#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tuple_len%0#0", + "add%1#0" + ] + }, + "3022": { + "op": "==", + "defined_out": [ + "eq%3#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "eq%3#0" + ] + }, + "3023": { + "error": "invalid number of bytes for smart_contracts.abi_types.Prospectus", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.Prospectus", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ] + }, + "3024": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "3027": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "0" + ] + }, + "3028": { + "op": "getbyte", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3029": { + "op": "dup", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "3030": { + "op": "bytec 10 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "\"contract_type\"" + ] + }, + "3032": { + "op": "dig 1", + "defined_out": [ + "\"contract_type\"", + "contract_type#0", + "contract_type#0 (copy)", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "\"contract_type\"", + "contract_type#0 (copy)" + ] + }, + "3034": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "3035": { + "op": "bz contract_config_bool_true@7", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3038": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "3039": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "1" + ] + }, + "3040": { + "op": "==", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%1#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%1#2" + ] + }, + "3041": { + "op": "bnz contract_config_bool_true@7", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3044": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "3045": { + "op": "pushint 2", + "defined_out": [ + "2", + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "2" + ] + }, + "3047": { + "op": "==", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%2#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%2#0" + ] + }, + "3048": { + "op": "bnz contract_config_bool_true@7", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3051": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "3052": { + "op": "pushint 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "3" + ] + }, + "3054": { + "op": "==", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%3#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%3#0" + ] + }, + "3055": { + "op": "bnz contract_config_bool_true@7", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3058": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "3059": { + "op": "pushint 4", + "defined_out": [ + "4", + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "4" + ] + }, + "3061": { + "op": "==", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%4#1" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%4#1" + ] + }, + "3062": { + "op": "bnz contract_config_bool_true@7", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3065": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "3066": { + "op": "pushint 5", + "defined_out": [ + "5", + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "5" + ] + }, + "3068": { + "op": "==", + "defined_out": [ + "contract_type#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%5#1" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%5#1" + ] + }, + "3069": { + "op": "bz contract_config_bool_false@8", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3072": { + "block": "contract_config_bool_true@7", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "or_result%0#0" + ] + }, + "3073": { + "error": "Invalid ACTUS configuration", + "block": "contract_config_bool_merge@9", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "or_result%0#0" + ], + "op": "assert // Invalid ACTUS configuration", + "defined_out": [], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3074": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0" + ] + }, + "3075": { + "op": "bytec 10 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0", + "\"contract_type\"" + ] + }, + "3077": { + "op": "app_global_get_ex", + "defined_out": [ + "contract_type#0", + "maybe_exists%1#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "maybe_exists%1#0" + ] + }, + "3078": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "maybe_exists%1#0", + "contract_type#0" + ] + }, + "3079": { + "op": "bury 2", + "defined_out": [ + "contract_type#0", + "maybe_exists%1#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "maybe_exists%1#0" + ] + }, + "3081": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3082": { + "op": "dig 4", + "defined_out": [ + "contract_type#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3084": { + "op": "dup", + "defined_out": [ + "contract_type#0", + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)" + ] + }, + "3085": { + "op": "pushint 33", + "defined_out": [ + "33", + "contract_type#0", + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)", + "33" + ] + }, + "3087": { + "op": "extract_uint64", + "defined_out": [ + "contract_type#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%0#2" + ] + }, + "3088": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%0#2", + "values%0#2" + ] + }, + "3089": { + "op": "bury 8", + "defined_out": [ + "contract_type#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%0#2" + ] + }, + "3091": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3092": { + "op": "pushint 57", + "defined_out": [ + "57", + "contract_type#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "57" + ] + }, + "3094": { + "op": "getbyte", + "defined_out": [ + "contract_type#0", + "day_count_convention#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0" + ] + }, + "3095": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0", + "day_count_convention#0" + ] + }, + "3096": { + "op": "bury 8", + "defined_out": [ + "contract_type#0", + "day_count_convention#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0" + ] + }, + "3098": { + "op": "bz contract_config_bool_true@16", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3101": { + "op": "dig 6", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0" + ] + }, + "3103": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "contract_type#0", + "day_count_convention#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0", + "1" + ] + }, + "3104": { + "op": "==", + "defined_out": [ + "contract_type#0", + "day_count_convention#0", + "terms#0", + "tmp%1#2", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%1#2" + ] + }, + "3105": { + "op": "bnz contract_config_bool_true@16", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3108": { + "op": "dig 6", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0" + ] + }, + "3110": { + "op": "pushint 2", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0", + "2" + ] + }, + "3112": { + "op": "==", + "defined_out": [ + "contract_type#0", + "day_count_convention#0", + "terms#0", + "tmp%2#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%2#0" + ] + }, + "3113": { + "op": "bnz contract_config_bool_true@16", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3116": { + "op": "dig 6", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0" + ] + }, + "3118": { + "op": "pushint 3", + "defined_out": [ + "3", + "contract_type#0", + "day_count_convention#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0", + "3" + ] + }, + "3120": { + "op": "==", + "defined_out": [ + "contract_type#0", + "day_count_convention#0", + "terms#0", + "tmp%3#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%3#0" + ] + }, + "3121": { + "op": "bnz contract_config_bool_true@16", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3124": { + "op": "dig 6", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0" + ] + }, + "3126": { + "op": "pushint 4", + "defined_out": [ + "4", + "contract_type#0", + "day_count_convention#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "day_count_convention#0", + "4" + ] + }, + "3128": { + "op": "==", + "defined_out": [ + "contract_type#0", + "day_count_convention#0", + "terms#0", + "tmp%4#1", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%4#1" + ] + }, + "3129": { + "op": "bz contract_config_bool_false@17", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3132": { + "block": "contract_config_bool_true@16", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "or_result%0#0" + ] + }, + "3133": { + "error": "Invalid day-count convention ID", + "block": "contract_config_bool_merge@18", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "or_result%0#0" + ], + "op": "assert // Invalid day-count convention ID", + "defined_out": [], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3134": { + "op": "dup", + "defined_out": [ + "contract_type#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0" + ] + }, + "3135": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "contract_type#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "contract_type#0", + "1" + ] + }, + "3136": { + "op": "!=", + "defined_out": [ + "contract_type#0", + "tmp%2#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%2#0" + ] + }, + "3137": { + "op": "bz contract_config_after_if_else@20", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3140": { + "op": "dig 4", + "defined_out": [ + "contract_type#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3142": { + "op": "pushint 786", + "defined_out": [ + "786", + "contract_type#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "786" + ] + }, + "3145": { + "op": "getbit", + "defined_out": [ + "aggregate%get_bit%0#0", + "contract_type#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "aggregate%get_bit%0#0" + ] + }, + "3146": { + "op": "!", + "defined_out": [ + "contract_type#0", + "terms#0", + "tmp%3#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%3#0" + ] + }, + "3147": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3148": { + "block": "contract_config_after_if_else@20", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0" + ] + }, + "3149": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0", + "\"status\"" + ] + }, + "3150": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#1", + "maybe_value%0#1" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "maybe_value%0#1", + "maybe_exists%0#1" + ] + }, + "3151": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "maybe_value%0#1" + ] + }, + "3152": { + "op": "!", + "defined_out": [ + "tmp%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%0#2" + ] + }, + "3153": { + "error": "D-ASA already configured", + "op": "assert // D-ASA already configured", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3154": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0" + ] + }, + "3155": { + "op": "bytec 20 // \"initial_exchange_amount\"", + "defined_out": [ + "\"initial_exchange_amount\"", + "0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0", + "\"initial_exchange_amount\"" + ] + }, + "3157": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#1" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "maybe_value%1#1", + "maybe_exists%1#0" + ] + }, + "3158": { + "error": "check self.initial_exchange_amount exists", + "op": "assert // check self.initial_exchange_amount exists", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "maybe_value%1#1" + ] + }, + "3159": { + "op": "!", + "defined_out": [ + "tmp%1#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%1#2" + ] + }, + "3160": { + "error": "D-ASA already configured", + "op": "assert // D-ASA already configured", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3161": { + "op": "dig 4", + "defined_out": [ + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3163": { + "op": "dup", + "defined_out": [ + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)" + ] + }, + "3164": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)", + "1" + ] + }, + "3165": { + "op": "extract_uint64", + "defined_out": [ + "denomination_asset_id#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0" + ] + }, + "3166": { + "op": "dup", + "defined_out": [ + "denomination_asset_id#0", + "denomination_asset_id#0 (copy)", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "denomination_asset_id#0 (copy)" + ] + }, + "3167": { + "op": "asset_params_get AssetCreator", + "defined_out": [ + "_creator#0", + "denomination_asset_id#0", + "exists#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "_creator#0", + "exists#0" + ] + }, + "3169": { + "op": "bury 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "exists#0" + ] + }, + "3171": { + "error": "Denomination asset is not properly set", + "op": "assert // Denomination asset is not properly set", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0" + ] + }, + "3172": { + "op": "bytec 44 // \"denomination_asset_id\"", + "defined_out": [ + "\"denomination_asset_id\"", + "denomination_asset_id#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "\"denomination_asset_id\"" + ] + }, + "3174": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "\"denomination_asset_id\"", + "denomination_asset_id#0 (copy)" + ] + }, + "3176": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0" + ] + }, + "3177": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "terms#0 (copy)" + ] + }, + "3179": { + "op": "pushint 9", + "defined_out": [ + "9", + "denomination_asset_id#0", + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "terms#0 (copy)", + "9" + ] + }, + "3181": { + "op": "extract_uint64", + "defined_out": [ + "denomination_asset_id#0", + "settlement_asset_id#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "settlement_asset_id#0" + ] + }, + "3182": { + "op": "dup", + "defined_out": [ + "denomination_asset_id#0", + "settlement_asset_id#0", + "settlement_asset_id#0 (copy)", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "denomination_asset_id#0", + "settlement_asset_id#0", + "settlement_asset_id#0 (copy)" + ] + }, + "3183": { + "op": "uncover 2", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "settlement_asset_id#0 (copy)", + "denomination_asset_id#0" + ] + }, + "3185": { + "op": "==", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "tmp%0#2" + ] + }, + "3186": { + "error": "Different settlement asset not supported, must be equal to denomination asset", + "op": "assert // Different settlement asset not supported, must be equal to denomination asset", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0" + ] + }, + "3187": { + "op": "bytec 19 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"", + "settlement_asset_id#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "\"settlement_asset_id\"" + ] + }, + "3189": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "\"settlement_asset_id\"", + "settlement_asset_id#0 (copy)" + ] + }, + "3191": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0" + ] + }, + "3192": { + "op": "itxn_begin" + }, + "3193": { + "op": "global MinTxnFee", + "defined_out": [ + "inner_txn_params%0%%param_Fee_idx_0#0", + "settlement_asset_id#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "3195": { + "op": "global CurrentApplicationAddress", + "defined_out": [ + "inner_txn_params%0%%param_AssetReceiver_idx_0#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "settlement_asset_id#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "inner_txn_params%0%%param_AssetReceiver_idx_0#0" + ] + }, + "3197": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "inner_txn_params%0%%param_AssetReceiver_idx_0#0", + "0" + ] + }, + "3198": { + "op": "itxn_field AssetAmount", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "inner_txn_params%0%%param_AssetReceiver_idx_0#0" + ] + }, + "3200": { + "op": "itxn_field AssetReceiver", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "settlement_asset_id#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "3202": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "settlement_asset_id#0" + ] + }, + "3203": { + "op": "itxn_field XferAsset", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "3205": { + "op": "pushint 4 // axfer", + "defined_out": [ + "axfer", + "inner_txn_params%0%%param_Fee_idx_0#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "axfer" + ] + }, + "3207": { + "op": "itxn_field TypeEnum", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "3209": { + "op": "itxn_field Fee", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3211": { + "op": "itxn_submit" + }, + "3212": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)" + ] + }, + "3213": { + "op": "pushint 17", + "defined_out": [ + "17", + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)", + "17" + ] + }, + "3215": { + "op": "extract_uint64", + "defined_out": [ + "terms#0", + "values%4#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%4#0" + ] + }, + "3216": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "terms#0", + "values%4#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%4#0", + "\"total_units\"" + ] + }, + "3218": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "\"total_units\"", + "values%4#0" + ] + }, + "3219": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3220": { + "op": "bytec 11 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "\"reserved_units_total\"" + ] + }, + "3222": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "\"reserved_units_total\"", + "0" + ] + }, + "3223": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3224": { + "op": "bytec 46 // \"day_count_convention\"", + "defined_out": [ + "\"day_count_convention\"", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "\"day_count_convention\"" + ] + }, + "3226": { + "op": "dig 8", + "defined_out": [ + "\"day_count_convention\"", + "day_count_convention#0", + "terms#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "\"day_count_convention\"", + "day_count_convention#0" + ] + }, + "3228": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0" + ] + }, + "3229": { + "op": "dup", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)" + ] + }, + "3230": { + "op": "pushint 41", + "defined_out": [ + "41", + "day_count_convention#0", + "terms#0", + "terms#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "terms#0 (copy)", + "41" + ] + }, + "3232": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "terms#0", + "values%5#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0" + ] + }, + "3233": { + "op": "bytec 28 // \"initial_exchange_date\"", + "defined_out": [ + "\"initial_exchange_date\"", + "day_count_convention#0", + "terms#0", + "values%5#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "\"initial_exchange_date\"" + ] + }, + "3235": { + "op": "dig 1", + "defined_out": [ + "\"initial_exchange_date\"", + "day_count_convention#0", + "terms#0", + "values%5#0", + "values%5#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "\"initial_exchange_date\"", + "values%5#0 (copy)" + ] + }, + "3237": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0" + ] + }, + "3238": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "terms#0 (copy)" + ] + }, + "3240": { + "op": "pushint 49", + "defined_out": [ + "49", + "day_count_convention#0", + "terms#0", + "terms#0 (copy)", + "values%5#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "terms#0 (copy)", + "49" + ] + }, + "3242": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "terms#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "values%6#0" + ] + }, + "3243": { + "op": "bytec 45 // \"maturity_date\"", + "defined_out": [ + "\"maturity_date\"", + "day_count_convention#0", + "terms#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "values%6#0", + "\"maturity_date\"" + ] + }, + "3245": { + "op": "dig 1", + "defined_out": [ + "\"maturity_date\"", + "day_count_convention#0", + "terms#0", + "values%5#0", + "values%6#0", + "values%6#0 (copy)" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "values%6#0", + "\"maturity_date\"", + "values%6#0 (copy)" + ] + }, + "3247": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "values%6#0" + ] + }, + "3248": { + "op": "dig 6", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "values%6#0", + "initial_state#0" + ] + }, + "3250": { + "op": "dup", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "values%6#0", + "initial_state#0 (copy)", + "initial_state#0 (copy)" + ] + }, + "3251": { + "op": "cover 2", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3253": { + "op": "pushint 48", + "defined_out": [ + "48", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "48" + ] + }, + "3255": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%5#0", + "values%6#0", + "values%7#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%7#0" + ] + }, + "3256": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%5#0", + "values%6#0", + "values%7#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%7#0", + "\"next_principal_redemption\"" + ] + }, + "3258": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"next_principal_redemption\"", + "values%7#0" + ] + }, + "3259": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3260": { + "op": "bytec 20 // \"initial_exchange_amount\"", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"initial_exchange_amount\"" + ] + }, + "3262": { + "op": "dig 10", + "defined_out": [ + "\"initial_exchange_amount\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"initial_exchange_amount\"", + "values%0#2" + ] + }, + "3264": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3265": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3267": { + "op": "pushint 786", + "defined_out": [ + "786", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "786" + ] + }, + "3270": { + "op": "getbit", + "defined_out": [ + "aggregate%get_bit%1#0", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "aggregate%get_bit%1#0" + ] + }, + "3271": { + "op": "bytec 35 // \"dynamic_principal_redemption\"", + "defined_out": [ + "\"dynamic_principal_redemption\"", + "aggregate%get_bit%1#0", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "aggregate%get_bit%1#0", + "\"dynamic_principal_redemption\"" + ] + }, + "3273": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"dynamic_principal_redemption\"", + "aggregate%get_bit%1#0" + ] + }, + "3274": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3275": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3277": { + "op": "pushint 16", + "defined_out": [ + "16", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "16" + ] + }, + "3279": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%10#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%10#0" + ] + }, + "3280": { + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%10#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%10#0", + "\"outstanding_principal\"" + ] + }, + "3282": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"outstanding_principal\"", + "values%10#0" + ] + }, + "3283": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3284": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3286": { + "op": "pushint 40", + "defined_out": [ + "40", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "40" + ] + }, + "3288": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%11#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%11#0" + ] + }, + "3289": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%11#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%11#0", + "\"accrued_interest\"" + ] + }, + "3291": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"accrued_interest\"", + "values%11#0" + ] + }, + "3292": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3293": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3295": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "32" + ] + }, + "3296": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%12#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%12#0" + ] + }, + "3297": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%12#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%12#0", + "\"nominal_interest_rate\"" + ] + }, + "3299": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"nominal_interest_rate\"", + "values%12#0" + ] + }, + "3300": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3301": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3303": { + "op": "pushint 24", + "defined_out": [ + "24", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "24" + ] + }, + "3305": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%13#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%13#0" + ] + }, + "3306": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%13#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%13#0", + "\"interest_calculation_base\"" + ] + }, + "3308": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"interest_calculation_base\"", + "values%13#0" + ] + }, + "3309": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3310": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3312": { + "op": "pushint 58", + "defined_out": [ + "58", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "58" + ] + }, + "3314": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%14#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%14#0" + ] + }, + "3315": { + "op": "bytec 36 // \"rate_reset_spread\"", + "defined_out": [ + "\"rate_reset_spread\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%14#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%14#0", + "\"rate_reset_spread\"" + ] + }, + "3317": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"rate_reset_spread\"", + "values%14#0" + ] + }, + "3318": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3319": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3321": { + "op": "pushint 66", + "defined_out": [ + "66", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "66" + ] + }, + "3323": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%15#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%15#0" + ] + }, + "3324": { + "op": "bytec 37 // \"rate_reset_multiplier\"", + "defined_out": [ + "\"rate_reset_multiplier\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%15#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%15#0", + "\"rate_reset_multiplier\"" + ] + }, + "3326": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"rate_reset_multiplier\"", + "values%15#0" + ] + }, + "3327": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3328": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3330": { + "op": "pushint 74", + "defined_out": [ + "74", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "74" + ] + }, + "3332": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%16#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%16#0" + ] + }, + "3333": { + "op": "bytec 31 // \"rate_reset_floor\"", + "defined_out": [ + "\"rate_reset_floor\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%16#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%16#0", + "\"rate_reset_floor\"" + ] + }, + "3335": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"rate_reset_floor\"", + "values%16#0" + ] + }, + "3336": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3337": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3339": { + "op": "pushint 82", + "defined_out": [ + "82", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "82" + ] + }, + "3341": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%17#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%17#0" + ] + }, + "3342": { + "op": "bytec 32 // \"rate_reset_cap\"", + "defined_out": [ + "\"rate_reset_cap\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%17#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%17#0", + "\"rate_reset_cap\"" + ] + }, + "3344": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"rate_reset_cap\"", + "values%17#0" + ] + }, + "3345": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3346": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3348": { + "op": "pushint 90", + "defined_out": [ + "90", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "90" + ] + }, + "3350": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%18#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%18#0" + ] + }, + "3351": { + "op": "bytec 38 // \"rate_reset_next\"", + "defined_out": [ + "\"rate_reset_next\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%18#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%18#0", + "\"rate_reset_next\"" + ] + }, + "3353": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"rate_reset_next\"", + "values%18#0" + ] + }, + "3354": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3355": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3357": { + "op": "pushint 784", + "defined_out": [ + "784", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "784" + ] + }, + "3360": { + "op": "getbit", + "defined_out": [ + "aggregate%get_bit%2#0", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "aggregate%get_bit%2#0" + ] + }, + "3361": { + "op": "bytec 39 // \"has_rate_reset_floor\"", + "defined_out": [ + "\"has_rate_reset_floor\"", + "aggregate%get_bit%2#0", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "aggregate%get_bit%2#0", + "\"has_rate_reset_floor\"" + ] + }, + "3363": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"has_rate_reset_floor\"", + "aggregate%get_bit%2#0" + ] + }, + "3364": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3365": { + "op": "dig 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)" + ] + }, + "3367": { + "op": "pushint 785", + "defined_out": [ + "785", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "terms#0 (copy)", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0 (copy)", + "785" + ] + }, + "3370": { + "op": "getbit", + "defined_out": [ + "aggregate%get_bit%3#0", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "aggregate%get_bit%3#0" + ] + }, + "3371": { + "op": "bytec 40 // \"has_rate_reset_cap\"", + "defined_out": [ + "\"has_rate_reset_cap\"", + "aggregate%get_bit%3#0", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "aggregate%get_bit%3#0", + "\"has_rate_reset_cap\"" + ] + }, + "3373": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"has_rate_reset_cap\"", + "aggregate%get_bit%3#0" + ] + }, + "3374": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "terms#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3375": { + "op": "uncover 3", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0" + ] + }, + "3377": { + "op": "pushint 99", + "defined_out": [ + "99", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "terms#0", + "99" + ] + }, + "3379": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%21#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%21#0" + ] + }, + "3380": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%21#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%21#0", + "\"fixed_point_scale\"" + ] + }, + "3382": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"fixed_point_scale\"", + "values%21#0" + ] + }, + "3383": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3384": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3386": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "8" + ] + }, + "3387": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%22#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%22#0" + ] + }, + "3388": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%22#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%22#0", + "\"event_cursor\"" + ] + }, + "3389": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"event_cursor\"", + "values%22#0" + ] + }, + "3390": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3391": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3393": { + "op": "pushint 56", + "defined_out": [ + "56", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "56" + ] + }, + "3395": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%23#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%23#0" + ] + }, + "3396": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "defined_out": [ + "\"cumulative_interest_index\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%23#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%23#0", + "\"cumulative_interest_index\"" + ] + }, + "3398": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"cumulative_interest_index\"", + "values%23#0" + ] + }, + "3399": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3400": { + "op": "dig 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)" + ] + }, + "3402": { + "op": "pushint 64", + "defined_out": [ + "64", + "day_count_convention#0", + "initial_state#0", + "initial_state#0 (copy)", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "initial_state#0 (copy)", + "64" + ] + }, + "3404": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%24#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%24#0" + ] + }, + "3405": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "defined_out": [ + "\"cumulative_principal_index\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%24#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%24#0", + "\"cumulative_principal_index\"" + ] + }, + "3407": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"cumulative_principal_index\"", + "values%24#0" + ] + }, + "3408": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3409": { + "op": "bytec 15 // \"reserved_interest\"", + "defined_out": [ + "\"reserved_interest\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"reserved_interest\"" + ] + }, + "3411": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"reserved_interest\"", + "0" + ] + }, + "3412": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3413": { + "op": "bytec 12 // \"reserved_principal\"", + "defined_out": [ + "\"reserved_principal\"", + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"reserved_principal\"" + ] + }, + "3415": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "\"reserved_principal\"", + "0" + ] + }, + "3416": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3417": { + "op": "dig 2", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%5#0 (copy)" + ] + }, + "3419": { + "op": "global LatestTimestamp", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "tmp%3#1", + "values%0#2", + "values%5#0", + "values%5#0 (copy)", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "values%5#0 (copy)", + "tmp%3#1" + ] + }, + "3421": { + "op": ">", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "tmp%4#1", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0", + "tmp%4#1" + ] + }, + "3422": { + "error": "IED must be set in the future", + "op": "assert // IED must be set in the future", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "initial_state#0", + "values%6#0" + ] + }, + "3423": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "values%6#0", + "initial_state#0" + ] + }, + "3424": { + "op": "intc_0 // 0", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "values%6#0", + "initial_state#0", + "0" + ] + }, + "3425": { + "op": "extract_uint64", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "values%0#2", + "values%27#0", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "values%6#0", + "values%27#0" + ] + }, + "3426": { + "op": "dig 2", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "values%6#0", + "values%27#0", + "values%5#0 (copy)" + ] + }, + "3428": { + "op": "<", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "tmp%5#1", + "values%0#2", + "values%5#0", + "values%6#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "values%6#0", + "tmp%5#1" + ] + }, + "3429": { + "error": "IED must be set in the future", + "op": "assert // IED must be set in the future", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%5#0", + "values%6#0" + ] + }, + "3430": { + "op": "<", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "terms#0", + "tmp%6#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%6#0" + ] + }, + "3431": { + "error": "IED must be set in the future", + "op": "assert // IED must be set in the future", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3432": { + "op": "dig 2", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "prospectus#0" + ] + }, + "3434": { + "op": "extract 0 32", + "defined_out": [ + "aggregate%extract%23#0", + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "aggregate%extract%23#0" + ] + }, + "3437": { + "op": "bytec 42 // \"prospectus_hash\"", + "defined_out": [ + "\"prospectus_hash\"", + "aggregate%extract%23#0", + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "aggregate%extract%23#0", + "\"prospectus_hash\"" + ] + }, + "3439": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "\"prospectus_hash\"", + "aggregate%extract%23#0" + ] + }, + "3440": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3441": { + "op": "dig 1", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "substring3%0#0" + ] + }, + "3443": { + "op": "extract 2 0", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "values%0#2", + "values%1#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%1#0" + ] + }, + "3446": { + "op": "bytec 43 // \"prospectus_url\"", + "defined_out": [ + "\"prospectus_url\"", + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "values%0#2", + "values%1#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "values%1#0", + "\"prospectus_url\"" + ] + }, + "3448": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "\"prospectus_url\"", + "values%1#0" + ] + }, + "3449": { + "op": "app_global_put", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3450": { + "op": "global LatestTimestamp", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%1#1", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%1#1" + ] + }, + "3452": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "3453": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0", + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "3454": { + "op": "swap", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "3455": { + "op": "concat", + "defined_out": [ + "day_count_convention#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "terms#0", + "tmp%5#0", + "values%0#2" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "tmp%5#0" + ] + }, + "3456": { + "op": "log", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3457": { + "op": "intc_1 // 1", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "1" + ] + }, + "3458": { + "op": "return", + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ] + }, + "3459": { + "block": "contract_config_bool_false@17", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "or_result%0#0" + ] + }, + "3460": { + "op": "b contract_config_bool_merge@18" + }, + "3463": { + "block": "contract_config_bool_false@8", + "stack_in": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "day_count_convention#0", + "values%0#2", + "terms#0", + "initial_state#0", + "prospectus#0", + "substring3%0#0", + "contract_type#0", + "or_result%0#0" + ] + }, + "3464": { + "op": "b contract_config_bool_merge@9" + }, + "3467": { + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_schedule[routing]", + "params": {}, + "block": "contract_schedule", + "stack_in": [], + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0" + ] + }, + "3468": { + "op": "pushbytes \"\"", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0" + ] + }, + "3470": { + "op": "dupn 2", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0" + ] + }, + "3472": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "tmp%0#0" + ] + }, + "3475": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "3476": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "tmp%0#0", + "len%0#0" + ] + }, + "3477": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "tmp%0#0", + "len%0#0", + "8" + ] + }, + "3478": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "tmp%0#0", + "eq%0#0" + ] + }, + "3479": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "tmp%0#0" + ] + }, + "3480": { + "op": "btoi", + "defined_out": [ + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0" + ] + }, + "3481": { + "op": "dup", + "defined_out": [ + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0" + ] + }, + "3482": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "schedule_page_index#0", + "tmp%2#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0" + ] + }, + "3485": { + "op": "dup", + "defined_out": [ + "schedule_page_index#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "3486": { + "op": "len", + "defined_out": [ + "len%1#0", + "schedule_page_index#0", + "tmp%2#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0", + "len%1#0" + ] + }, + "3487": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%1#0", + "schedule_page_index#0", + "tmp%2#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0", + "len%1#0", + "1" + ] + }, + "3488": { + "op": "==", + "defined_out": [ + "eq%1#0", + "schedule_page_index#0", + "tmp%2#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0", + "eq%1#0" + ] + }, + "3489": { + "error": "invalid number of bytes for arc4.bool", + "op": "assert // invalid number of bytes for arc4.bool", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0" + ] + }, + "3490": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "tmp%2#0", + "0" + ] + }, + "3491": { + "op": "getbit", + "defined_out": [ + "is_last_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "schedule_page_index#0", + "is_last_page#0" + ] + }, + "3492": { + "op": "swap", + "defined_out": [ + "is_last_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page_index#0" + ] + }, + "3493": { + "op": "txna ApplicationArgs 3" + }, + "3496": { + "op": "dup", + "defined_out": [ + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page_index#0", + "schedule_page#0", + "schedule_page#0" + ] + }, + "3497": { + "op": "cover 2", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0", + "schedule_page#0" + ] + }, + "3499": { + "op": "dup", + "defined_out": [ + "is_last_page#0", + "schedule_page#0", + "schedule_page#0 (copy)", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0", + "schedule_page#0", + "schedule_page#0 (copy)" + ] + }, + "3500": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0", + "schedule_page#0", + "schedule_page#0 (copy)", + "0" + ] + }, + "3501": { + "error": "invalid array length header", + "op": "extract_uint16 // on error: invalid array length header", + "defined_out": [ + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0" + ] + }, + "3502": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0", + "page_length#0" + ] + }, + "3503": { + "op": "cover 3", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0" + ] + }, + "3505": { + "op": "dup", + "defined_out": [ + "is_last_page#0", + "page_length#0", + "page_length#0 (copy)", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0", + "page_length#0 (copy)" + ] + }, + "3506": { + "op": "pushint 65", + "defined_out": [ + "65", + "is_last_page#0", + "page_length#0", + "page_length#0 (copy)", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0", + "page_length#0 (copy)", + "65" + ] + }, + "3508": { + "op": "*", + "defined_out": [ + "is_last_page#0", + "mul%0#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0", + "mul%0#0" + ] + }, + "3509": { + "op": "pushint 2", + "defined_out": [ + "2", + "is_last_page#0", + "mul%0#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0", + "mul%0#0", + "2" + ] + }, + "3511": { + "op": "+", + "defined_out": [ + "add%0#0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "schedule_page#0", + "page_length#0", + "add%0#0" + ] + }, + "3512": { + "op": "uncover 2", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "add%0#0", + "schedule_page#0" + ] + }, + "3514": { + "op": "len", + "defined_out": [ + "add%0#0", + "is_last_page#0", + "len%2#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "add%0#0", + "len%2#0" + ] + }, + "3515": { + "op": "==", + "defined_out": [ + "eq%2#0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "eq%2#0" + ] + }, + "3516": { + "error": "invalid number of bytes for arc4.dynamic_array", + "op": "assert // invalid number of bytes for arc4.dynamic_array", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0" + ] + }, + "3517": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "3520": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "0" + ] + }, + "3521": { + "op": "bytec 10 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "0", + "\"contract_type\"" + ] + }, + "3523": { + "op": "app_global_get_ex", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "maybe_exists%0#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "contract_type#0", + "maybe_exists%0#0" + ] + }, + "3524": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "schedule_page_index#0", + "page_length#0", + "maybe_exists%0#0", + "contract_type#0" + ] + }, + "3525": { + "op": "cover 3", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "maybe_exists%0#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "maybe_exists%0#0" + ] + }, + "3527": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0" + ] + }, + "3528": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "0" + ] + }, + "3529": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "contract_type#0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "0", + "\"status\"" + ] + }, + "3530": { + "op": "app_global_get_ex", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "maybe_exists%0#0", + "maybe_value%0#1", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "maybe_value%0#1", + "maybe_exists%0#0" + ] + }, + "3531": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "maybe_value%0#1" + ] + }, + "3532": { + "op": "!", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%0#2" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "tmp%0#2" + ] + }, + "3533": { + "error": "D-ASA already configured", + "op": "assert // D-ASA already configured", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0" + ] + }, + "3534": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "page_length#0 (copy)" + ] + }, + "3535": { + "op": "pushint 16", + "defined_out": [ + "16", + "contract_type#0", + "is_last_page#0", + "page_length#0", + "page_length#0 (copy)", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "page_length#0 (copy)", + "16" + ] + }, + "3537": { + "op": "<=", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%2#1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "tmp%2#1" + ] + }, + "3538": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0" + ] + }, + "3539": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "0" + ] + }, + "3540": { + "op": "bytec 20 // \"initial_exchange_amount\"", + "defined_out": [ + "\"initial_exchange_amount\"", + "0", + "contract_type#0", + "is_last_page#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "0", + "\"initial_exchange_amount\"" + ] + }, + "3542": { + "op": "app_global_get_ex", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "3543": { + "error": "check self.initial_exchange_amount exists", + "op": "assert // check self.initial_exchange_amount exists", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0", + "maybe_value%1#0" + ] + }, + "3544": { + "error": "D-ASA terms not configured", + "op": "assert // D-ASA terms not configured", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "schedule_page_index#0", + "page_length#0" + ] + }, + "3545": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_length#0", + "schedule_page_index#0" + ] + }, + "3546": { + "op": "pushint 16", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_length#0", + "schedule_page_index#0", + "16" + ] + }, + "3548": { + "op": "*", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_length#0", + "page_cursor#0" + ] + }, + "3549": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "page_length#0" + ] + }, + "3550": { + "op": "pushint 100", + "defined_out": [ + "100", + "contract_type#0", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "page_length#0", + "100" + ] + }, + "3552": { + "op": "*", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%6#1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "tmp%6#1" + ] + }, + "3553": { + "op": "intc 4 // 1500", + "defined_out": [ + "1500", + "contract_type#0", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%6#1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "tmp%6#1", + "1500" + ] + }, + "3555": { + "op": "+", + "defined_out": [ + "contract_type#0", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%7#1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "tmp%7#1" + ] + }, + "3556": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "tmp%7#1", + "0" + ] + }, + "3557": { + "callsub": "_puya_lib.util.ensure_budget", + "op": "callsub ensure_budget", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0" + ] + }, + "3560": { + "op": "intc_0 // 0", + "defined_out": [ + "contract_type#0", + "index#0", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3561": { + "block": "contract_schedule_while_top@2", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ], + "op": "dup", + "defined_out": [ + "index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0" + ] + }, + "3562": { + "op": "dig 4", + "defined_out": [ + "index#0", + "page_length#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "page_length#0" + ] + }, + "3564": { + "op": "<", + "defined_out": [ + "index#0", + "page_length#0", + "tmp%8#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "tmp%8#0" + ] + }, + "3565": { + "op": "bz contract_schedule_after_while@11", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3568": { + "op": "dig 4", + "defined_out": [ + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "schedule_page#0" + ] + }, + "3570": { + "op": "extract 2 0", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%array_trimmed%0#0" + ] + }, + "3573": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%array_trimmed%0#0", + "aggregate%array_trimmed%0#0" + ] + }, + "3574": { + "op": "bury 12", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%array_trimmed%0#0" + ] + }, + "3576": { + "op": "dig 1", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%array_trimmed%0#0", + "index#0" + ] + }, + "3578": { + "op": "dup", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "index#0", + "index#0 (copy)", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%array_trimmed%0#0", + "index#0 (copy)", + "index#0 (copy)" + ] + }, + "3579": { + "op": "cover 2", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "aggregate%array_trimmed%0#0", + "index#0 (copy)" + ] + }, + "3581": { + "op": "pushint 65", + "defined_out": [ + "65", + "aggregate%array_trimmed%0#0", + "index#0", + "index#0 (copy)", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "aggregate%array_trimmed%0#0", + "index#0 (copy)", + "65" + ] + }, + "3583": { + "op": "*", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%bytes_offset%0#0", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "aggregate%array_trimmed%0#0", + "aggregate%bytes_offset%0#0" + ] + }, + "3584": { + "op": "pushint 65", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "aggregate%array_trimmed%0#0", + "aggregate%bytes_offset%0#0", + "65" + ] + }, + "3586": { + "error": "index access is out of bounds", + "op": "extract3 // on error: index access is out of bounds", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "aggregate%encoded_element%0#0" + ] + }, + "3587": { + "op": "dup", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "aggregate%encoded_element%0#0 (copy)", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "aggregate%encoded_element%0#0", + "aggregate%encoded_element%0#0 (copy)" + ] + }, + "3588": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "aggregate%encoded_element%0#0 (copy)", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "aggregate%encoded_element%0#0", + "aggregate%encoded_element%0#0 (copy)", + "8" + ] + }, + "3589": { + "op": "getbyte", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0" + ] + }, + "3590": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "entry_event_type#0 (copy)" + ] + }, + "3591": { + "op": "cover 2", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0" + ] + }, + "3593": { + "op": "bury 13", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_length#0", + "schedule_page#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0" + ] + }, + "3595": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "aggregate%encoded_element%0#0 (copy)" + ] + }, + "3596": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "aggregate%encoded_element%0#0 (copy)", + "0" + ] + }, + "3597": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_length#0", + "schedule_page#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0" + ] + }, + "3598": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "values%0#0" + ] + }, + "3599": { + "op": "bury 13", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_length#0", + "schedule_page#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0" + ] + }, + "3601": { + "op": "dig 5", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "page_cursor#0" + ] + }, + "3603": { + "op": "uncover 4", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "page_cursor#0", + "index#0" + ] + }, + "3605": { + "op": "+", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "tmp%10#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "tmp%10#0" + ] + }, + "3606": { + "op": "dig 1", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "tmp%10#0", + "values%0#0", + "values%0#0 (copy)" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "tmp%10#0", + "values%0#0 (copy)" + ] + }, + "3608": { + "op": "==", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "tmp%11#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "tmp%11#0" + ] + }, + "3609": { + "error": "Invalid event id", + "op": "assert // Invalid event id", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0" + ] + }, + "3610": { + "op": "dig 5", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "entry_event_type#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "contract_type#0" + ] + }, + "3612": { + "op": "uncover 3", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%encoded_element%0#0", + "values%0#0", + "contract_type#0", + "entry_event_type#0" + ] + }, + "3614": { + "callsub": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", + "op": "callsub _assert_event_allowed_for_contract_type", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%encoded_element%0#0", + "values%0#0" + ] + }, + "3617": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "values%0#0", + "aggregate%encoded_element%0#0" + ] + }, + "3618": { + "op": "pushint 9", + "defined_out": [ + "9", + "aggregate%array_trimmed%0#0", + "aggregate%encoded_element%0#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "values%0#0", + "aggregate%encoded_element%0#0", + "9" + ] + }, + "3620": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "values%0#0", + "values%1#0" + ] + }, + "3621": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "values%0#0", + "values%1#0", + "values%1#0" + ] + }, + "3622": { + "op": "bury 10", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "values%0#0", + "values%1#0" + ] + }, + "3624": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "values%0#0" + ] + }, + "3625": { + "op": "bz contract_schedule_after_if_else@8", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3628": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0" + ] + }, + "3629": { + "op": "bz contract_schedule_else_body@6", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3632": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0" + ] + }, + "3633": { + "op": "intc_1 // 1", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "1" + ] + }, + "3634": { + "op": "-", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "tmp%15#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "tmp%15#0" + ] + }, + "3635": { + "op": "pushint 65", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "tmp%15#0", + "65" + ] + }, + "3637": { + "op": "*", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "aggregate%bytes_offset%3#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%bytes_offset%3#0" + ] + }, + "3638": { + "op": "dig 11", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%bytes_offset%3#0", + "aggregate%array_trimmed%0#0" + ] + }, + "3640": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%array_trimmed%0#0", + "aggregate%bytes_offset%3#0" + ] + }, + "3641": { + "op": "pushint 65", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%array_trimmed%0#0", + "aggregate%bytes_offset%3#0", + "65" + ] + }, + "3643": { + "error": "index access is out of bounds", + "op": "extract3 // on error: index access is out of bounds", + "defined_out": [ + "aggregate%array_trimmed%0#0", + "contract_type#0", + "entry_event_type#0", + "index#0", + "page_cursor#0", + "page_length#0", + "previous_entry#0", + "schedule_page#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "previous_entry#0" + ] + }, + "3644": { + "block": "contract_schedule_after_if_else@7", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "previous_entry#0" + ], + "op": "pushint 9", + "defined_out": [ + "9", + "previous_entry#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "previous_entry#0", + "9" + ] + }, + "3646": { + "op": "extract_uint64", + "defined_out": [ + "values%3#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "values%3#0" + ] + }, + "3647": { + "op": "dig 8", + "defined_out": [ + "values%1#0", + "values%3#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "values%3#0", + "values%1#0" + ] + }, + "3649": { + "op": "<=", + "defined_out": [ + "tmp%22#0", + "values%1#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "tmp%22#0" + ] + }, + "3650": { + "error": "Time events must be sorted in strictly ascending order", + "op": "assert // Time events must be sorted in strictly ascending order", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3651": { + "block": "contract_schedule_after_if_else@8", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ], + "op": "dig 8", + "defined_out": [ + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "values%0#0" + ] + }, + "3653": { + "op": "bnz contract_schedule_after_if_else@10", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3656": { + "op": "dig 9", + "defined_out": [ + "entry_event_type#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "entry_event_type#0" + ] + }, + "3658": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "entry_event_type#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "entry_event_type#0", + "1" + ] + }, + "3659": { + "op": "==", + "defined_out": [ + "entry_event_type#0", + "tmp%24#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "tmp%24#0" + ] + }, + "3660": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3661": { + "block": "contract_schedule_after_if_else@10", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ], + "op": "dup", + "defined_out": [ + "index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0" + ] + }, + "3662": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0", + "1" + ] + }, + "3663": { + "op": "+", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "index#0" + ] + }, + "3664": { + "op": "bury 1", + "defined_out": [ + "index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3666": { + "op": "b contract_schedule_while_top@2" + }, + "3669": { + "block": "contract_schedule_else_body@6", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ], + "op": "dig 6", + "defined_out": [ + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "schedule_page_index#0" + ] + }, + "3671": { + "op": "dup", + "defined_out": [ + "schedule_page_index#0", + "schedule_page_index#0 (copy)" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "schedule_page_index#0", + "schedule_page_index#0 (copy)" + ] + }, + "3672": { + "error": "Invalid event id", + "op": "assert // Invalid event id", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "schedule_page_index#0" + ] + }, + "3673": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "schedule_page_index#0", + "1" + ] + }, + "3674": { + "op": "-", + "defined_out": [ + "previous_page_index#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "previous_page_index#0" + ] + }, + "3675": { + "op": "itob", + "defined_out": [ + "encoded_value%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "encoded_value%0#0" + ] + }, + "3676": { + "op": "bytec 24 // 0x5323", + "defined_out": [ + "0x5323", + "encoded_value%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "encoded_value%0#0", + "0x5323" + ] + }, + "3678": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "0x5323", + "encoded_value%0#0" + ] + }, + "3679": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0" + ] + }, + "3680": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "3681": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%2#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "_%0#0", + "maybe_exists%2#0" + ] + }, + "3682": { + "op": "bury 1", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "maybe_exists%2#0" + ] + }, + "3684": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0" + ] + }, + "3685": { + "op": "dup", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "3686": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "0" + ] + }, + "3687": { + "op": "pushint 2", + "defined_out": [ + "0", + "2", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "0", + "2" + ] + }, + "3689": { + "op": "box_extract", + "defined_out": [ + "box%box_extract%0#0", + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box%box_extract%0#0" + ] + }, + "3690": { + "op": "btoi", + "defined_out": [ + "box%array_length%0#0", + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box%array_length%0#0" + ] + }, + "3691": { + "op": "dup", + "defined_out": [ + "box%array_length%0#0", + "box%array_length%0#0 (copy)", + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box%array_length%0#0", + "box%array_length%0#0 (copy)" + ] + }, + "3692": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box%array_length%0#0" + ] + }, + "3693": { + "op": "intc_1 // 1", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box%array_length%0#0", + "1" + ] + }, + "3694": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#0", + "schedule_page_index#0", + "tmp%21#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "tmp%21#0" + ] + }, + "3695": { + "op": "pushint 65", + "defined_out": [ + "65", + "box_prefixed_key%0#0", + "schedule_page_index#0", + "tmp%21#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "tmp%21#0", + "65" + ] + }, + "3697": { + "op": "*", + "defined_out": [ + "box%element_offset%0#0", + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box%element_offset%0#0" + ] + }, + "3698": { + "op": "pushint 2", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box%element_offset%0#0", + "2" + ] + }, + "3700": { + "op": "+", + "defined_out": [ + "box%offset%0#0", + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box%offset%0#0" + ] + }, + "3701": { + "op": "pushint 65", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box%offset%0#0", + "65" + ] + }, + "3703": { + "op": "box_extract", + "defined_out": [ + "previous_entry#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "previous_entry#0" + ] + }, + "3704": { + "op": "b contract_schedule_after_if_else@7" + }, + "3707": { + "block": "contract_schedule_after_while@11", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ], + "op": "dig 6", + "defined_out": [ + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "schedule_page_index#0" + ] + }, + "3709": { + "op": "itob", + "defined_out": [ + "encoded_value%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "encoded_value%0#0" + ] + }, + "3710": { + "op": "bytec 24 // 0x5323", + "defined_out": [ + "0x5323", + "encoded_value%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "encoded_value%0#0", + "0x5323" + ] + }, + "3712": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "0x5323", + "encoded_value%0#0" + ] + }, + "3713": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0" + ] + }, + "3714": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "3715": { + "op": "box_del", + "defined_out": [ + "box_prefixed_key%0#0", + "schedule_page_index#0", + "{box_del}" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "{box_del}" + ] + }, + "3716": { + "op": "pop", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0" + ] + }, + "3717": { + "op": "dig 5", + "defined_out": [ + "box_prefixed_key%0#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "box_prefixed_key%0#0", + "schedule_page#0" + ] + }, + "3719": { + "op": "box_put", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3720": { + "op": "dig 5", + "defined_out": [ + "is_last_page#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "is_last_page#0" + ] + }, + "3722": { + "op": "bz contract_schedule_after_if_else@13", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3725": { + "op": "dig 1", + "defined_out": [ + "is_last_page#0", + "page_cursor#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "page_cursor#0" + ] + }, + "3727": { + "op": "dig 4", + "defined_out": [ + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "page_cursor#0", + "page_length#0" + ] + }, + "3729": { + "op": "+", + "defined_out": [ + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%27#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "tmp%27#0" + ] + }, + "3730": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0", + "tmp%27#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "tmp%27#0", + "\"schedule_entry_count\"" + ] + }, + "3731": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "\"schedule_entry_count\"", + "tmp%27#0" + ] + }, + "3732": { + "op": "app_global_put", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3733": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "\"status\"" + ] + }, + "3734": { + "op": "pushint 50", + "defined_out": [ + "\"status\"", + "50", + "is_last_page#0", + "page_cursor#0", + "page_length#0", + "schedule_page#0", + "schedule_page_index#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "\"status\"", + "50" + ] + }, + "3736": { + "op": "app_global_put", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3737": { + "block": "contract_schedule_after_if_else@13", + "stack_in": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ], + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "tmp%0#1" + ] + }, + "3739": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "3740": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "3741": { + "op": "swap", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "3742": { + "op": "concat", + "defined_out": [ + "tmp%7#0" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "tmp%7#0" + ] + }, + "3743": { + "op": "log", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3744": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0", + "1" + ] + }, + "3745": { + "op": "return", + "stack_out": [ + "aggregate%array_trimmed%0#0", + "entry_event_type#0", + "values%0#0", + "values%1#0", + "schedule_page_index#0", + "is_last_page#0", + "schedule_page#0", + "page_length#0", + "contract_type#0", + "page_cursor#0", + "index#0" + ] + }, + "3746": { + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_execute_ied[routing]", + "params": {}, + "block": "contract_execute_ied", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "3747": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "0", + "\"status\"" + ] + }, + "3748": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "3749": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "3750": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [] + }, + "3751": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "3754": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" + }, + "3757": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" + }, + "3760": { + "op": "intc_0 // 0", + "stack_out": [ + "0" + ] + }, + "3761": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0" + ], + "stack_out": [ + "0", + "\"event_cursor\"" + ] + }, + "3762": { + "op": "app_global_get_ex", + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "3763": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "3764": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#0", + "0" + ] + }, + "3765": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "3766": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "3767": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "3768": { + "op": "dig 1", + "defined_out": [ + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_value%0#0 (copy)" + ] + }, + "3770": { + "op": ">", + "defined_out": [ + "maybe_value%0#0", + "tmp%0#1" + ], + "stack_out": [ + "maybe_value%0#0", + "tmp%0#1" + ] + }, + "3771": { + "error": "Invalid event cursor", + "op": "assert // Invalid event cursor", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "3772": { + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "entry#0" + ] + }, + "3775": { + "op": "dup", + "defined_out": [ + "entry#0", + "entry#0 (copy)" + ], + "stack_out": [ + "entry#0", + "entry#0 (copy)" + ] + }, + "3776": { + "op": "extract 8 1", + "defined_out": [ + "aggregate%extract%0#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0" + ] + }, + "3779": { + "op": "dup", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%0#0 (copy)", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%0#0 (copy)" + ] + }, + "3780": { + "op": "pushbytes 0x01", + "defined_out": [ + "0x01", + "aggregate%extract%0#0", + "aggregate%extract%0#0 (copy)", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%0#0 (copy)", + "0x01" + ] + }, + "3783": { + "op": "b==", + "defined_out": [ + "aggregate%extract%0#0", + "entry#0", + "tmp%2#1" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "tmp%2#1" + ] + }, + "3784": { + "error": "Invalid event type", + "op": "assert // Invalid event type", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0" + ] + }, + "3785": { + "op": "dig 1", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "entry#0 (copy)" + ] + }, + "3787": { + "op": "extract 0 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0" + ] + }, + "3790": { + "op": "dig 2", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "entry#0 (copy)" + ] + }, + "3792": { + "op": "extract 9 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0" + ] + }, + "3795": { + "op": "dig 3", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "entry#0 (copy)" + ] + }, + "3797": { + "op": "extract 17 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0" + ] + }, + "3800": { + "op": "dig 4", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "entry#0 (copy)" + ] + }, + "3802": { + "op": "extract 25 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0" + ] + }, + "3805": { + "op": "dig 5", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "entry#0 (copy)" + ] + }, + "3807": { + "op": "extract 33 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0" + ] + }, + "3810": { + "op": "dig 6", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "entry#0 (copy)" + ] + }, + "3812": { + "op": "extract 41 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0" + ] + }, + "3815": { + "op": "dig 7", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "entry#0 (copy)" + ] + }, + "3817": { + "op": "extract 49 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0" + ] + }, + "3820": { + "op": "dig 8", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "entry#0 (copy)" + ] + }, + "3822": { + "op": "extract 57 8", + "defined_out": [ + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0" + ] + }, + "3825": { + "op": "uncover 7", + "stack_out": [ + "entry#0", + "aggregate%extract%0#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%1#0" + ] + }, + "3827": { + "op": "uncover 8", + "stack_out": [ + "entry#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%1#0", + "aggregate%extract%0#0" + ] + }, + "3829": { + "op": "concat", + "defined_out": [ + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%1#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%1#0" + ] + }, + "3830": { + "op": "uncover 7", + "stack_out": [ + "entry#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%1#0", + "aggregate%extract%2#0" + ] + }, + "3832": { + "op": "concat", + "defined_out": [ + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%2#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%2#0" + ] + }, + "3833": { + "op": "uncover 6", + "stack_out": [ + "entry#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%2#0", + "aggregate%extract%3#0" + ] + }, + "3835": { + "op": "concat", + "defined_out": [ + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%3#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%3#0" + ] + }, + "3836": { + "op": "uncover 5", + "stack_out": [ + "entry#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%3#0", + "aggregate%extract%4#0" + ] + }, + "3838": { + "op": "concat", + "defined_out": [ + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0" + ] + }, + "3839": { + "op": "intc_0 // 0", + "stack_out": [ + "entry#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0", + "0" + ] + }, + "3840": { + "op": "itob", + "defined_out": [ + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0", + "aggregate%val_as_bytes%4#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0", + "aggregate%val_as_bytes%4#0" + ] + }, + "3841": { + "op": "concat", + "defined_out": [ + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%5#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%5#0" + ] + }, + "3842": { + "op": "uncover 4", + "stack_out": [ + "entry#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%5#0", + "aggregate%extract%5#0" + ] + }, + "3844": { + "op": "concat", + "defined_out": [ + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%6#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%6#0" + ] + }, + "3845": { + "op": "uncover 3", + "stack_out": [ + "entry#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%6#0", + "aggregate%extract%6#0" + ] + }, + "3847": { + "op": "concat", + "defined_out": [ + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%7#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%7#0" + ] + }, + "3848": { + "op": "uncover 2", + "stack_out": [ + "entry#0", + "aggregate%extract%8#0", + "aggregate%head%7#0", + "aggregate%extract%7#0" + ] + }, + "3850": { + "op": "concat", + "defined_out": [ + "aggregate%extract%8#0", + "aggregate%head%8#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%extract%8#0", + "aggregate%head%8#0" + ] + }, + "3851": { + "op": "swap", + "stack_out": [ + "entry#0", + "aggregate%head%8#0", + "aggregate%extract%8#0" + ] + }, + "3852": { + "op": "concat", + "defined_out": [ + "aggregate%head%9#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "aggregate%head%9#0" + ] + }, + "3853": { + "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", + "op": "callsub _apply_non_cash_schedule_entry", + "defined_out": [ + "_apply_non_cash_schedule_entry%1#0", + "entry#0" + ], + "stack_out": [ + "entry#0", + "_apply_non_cash_schedule_entry%1#0" + ] + }, + "3856": { + "op": "popn 2", + "stack_out": [] + }, + "3858": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "3860": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%9#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%9#0" + ] + }, + "3861": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%9#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%9#0", + "0x151f7c75" + ] + }, + "3862": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%9#0" + ] + }, + "3863": { + "op": "concat", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "3864": { + "op": "log", + "stack_out": [] + }, + "3865": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "3866": { + "op": "return", + "stack_out": [] + }, + "3867": { + "subroutine": "modules.actus_kernel.ActusKernelModule.apply_non_cash_event[routing]", + "params": {}, + "block": "apply_non_cash_event", + "stack_in": [], + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0" + ] + }, + "3868": { + "op": "dupn 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0" + ] + }, + "3870": { + "op": "pushbytes \"\"", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0" + ] + }, + "3872": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1" + ] + }, + "3873": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "tmp%0#0" + ] + }, + "3876": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "3877": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "tmp%0#0", + "len%0#0" + ] + }, + "3878": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "tmp%0#0", + "len%0#0", + "8" + ] + }, + "3879": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "tmp%0#0", + "eq%0#0" + ] + }, + "3880": { + "error": "invalid number of bytes for arc4.uint64", + "op": "assert // invalid number of bytes for arc4.uint64", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "tmp%0#0" + ] + }, + "3881": { + "op": "btoi", + "defined_out": [ + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0" + ] + }, + "3882": { + "op": "txna ApplicationArgs 2" + }, + "3885": { + "op": "dupn 2", + "defined_out": [ + "event_id#0", + "payload#0", + "payload#0 (copy)" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "3887": { + "op": "len", + "defined_out": [ + "event_id#0", + "len%1#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "len%1#0" + ] + }, + "3888": { + "op": "pushint 73", + "defined_out": [ + "73", + "event_id#0", + "len%1#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "len%1#0", + "73" + ] + }, + "3890": { + "op": "==", + "defined_out": [ + "eq%1#0", + "event_id#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "eq%1#0" + ] + }, + "3891": { + "error": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0" + ] + }, + "3892": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "0" + ] + }, + "3893": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "event_id#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "0", + "\"status\"" + ] + }, + "3894": { + "op": "app_global_get_ex", + "defined_out": [ + "event_id#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "3895": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "maybe_value%0#0" + ] + }, + "3896": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0" + ] + }, + "3897": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" + }, + "3900": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" + }, + "3903": { + "op": "pushint 65", + "defined_out": [ + "65", + "event_id#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "payload#0", + "65" + ] + }, + "3905": { + "op": "extract_uint64", + "defined_out": [ + "event_id#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "3906": { + "op": "dup", + "defined_out": [ + "event_id#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "values%0#0" + ] + }, + "3907": { + "op": "pushint 4", + "defined_out": [ + "4", + "event_id#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "values%0#0", + "4" + ] + }, + "3909": { + "op": "&", + "defined_out": [ + "event_id#0", + "payload#0", + "tmp%0#1", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%0#1" + ] + }, + "3910": { + "op": "bz apply_non_cash_event_after_if_else@3", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "3913": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0" + ] + }, + "3914": { + "op": "bytec 10 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "0", + "event_id#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0", + "\"contract_type\"" + ] + }, + "3916": { + "op": "app_global_get_ex", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "3917": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0" + ] + }, + "3918": { + "op": "pushint 5", + "defined_out": [ + "5", + "event_id#0", + "maybe_value%0#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "5" + ] + }, + "3920": { + "op": "==", + "defined_out": [ + "event_id#0", + "payload#0", + "tmp%0#3", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%0#3" + ] + }, + "3921": { + "error": "Observed event required to execute this action", + "op": "assert // Observed event required to execute this action", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "3922": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "3925": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0" + ] + }, + "3926": { + "op": "bytec 10 // \"contract_type\"", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0", + "\"contract_type\"" + ] + }, + "3928": { + "op": "app_global_get_ex", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "3929": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0" + ] + }, + "3930": { + "op": "dup", + "defined_out": [ + "event_id#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)" + ] + }, + "3931": { + "op": "pushint 5", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "5" + ] + }, + "3933": { + "op": "==", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "tmp%0#3" + ] + }, + "3934": { + "error": "Observed event required to execute this action", + "op": "assert // Observed event required to execute this action", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0" + ] + }, + "3935": { + "op": "dig 2", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0" + ] + }, + "3937": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "3938": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "payload#0 (copy)", + "0" + ] + }, + "3939": { + "op": "extract_uint64", + "defined_out": [ + "event_id#0", + "maybe_value%0#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1" + ] + }, + "3940": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1", + "values%0#1" + ] + }, + "3941": { + "op": "bury 7", + "defined_out": [ + "event_id#0", + "maybe_value%0#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1" + ] + }, + "3943": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1", + "0" + ] + }, + "3944": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "event_id#0", + "maybe_value%0#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1", + "0", + "\"schedule_entry_count\"" + ] + }, + "3945": { + "op": "app_global_get_ex", + "defined_out": [ + "event_id#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "maybe_value%0#1", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1", + "maybe_value%0#1", + "maybe_exists%0#0" + ] + }, + "3946": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "values%0#1", + "maybe_value%0#1" + ] + }, + "3947": { + "op": "==", + "defined_out": [ + "event_id#0", + "maybe_value%0#0", + "payload#0", + "tmp%1#2", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "tmp%1#2" + ] + }, + "3948": { + "error": "Invalid event id", + "op": "assert // Invalid event id", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0" + ] + }, + "3949": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "3950": { + "op": "extract 8 1", + "defined_out": [ + "aggregate%extract%2#0", + "event_id#0", + "maybe_value%0#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "aggregate%extract%2#0" + ] + }, + "3953": { + "op": "bury 12", + "defined_out": [ + "aggregate%extract%2#0", + "event_id#0", + "maybe_value%0#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0" + ] + }, + "3955": { + "op": "intc_2 // 8", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "payload#0", + "8" + ] + }, + "3956": { + "op": "getbyte", + "defined_out": [ + "aggregate%extract%2#0", + "event_id#0", + "maybe_value%0#0", + "payload#0", + "tmp%2#3", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "tmp%2#3" + ] + }, + "3957": { + "callsub": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", + "op": "callsub _assert_event_allowed_for_contract_type", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "3960": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0" + ] + }, + "3961": { + "op": "bytec_3 // \"schedule_entry_count\"", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "3962": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%extract%2#0", + "event_id#0", + "event_id#1", + "maybe_exists%2#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_id#1", + "maybe_exists%2#0" + ] + }, + "3963": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_id#1" + ] + }, + "3964": { + "op": "pushint 16", + "defined_out": [ + "16", + "aggregate%extract%2#0", + "event_id#0", + "event_id#1", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_id#1", + "16" + ] + }, + "3966": { + "op": "/", + "defined_out": [ + "aggregate%extract%2#0", + "event_id#0", + "page_index#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page_index#0" + ] + }, + "3967": { + "op": "bytec 48 // 0x0000", + "defined_out": [ + "aggregate%extract%2#0", + "event_id#0", + "page#0", + "page_index#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page_index#0", + "page#0" + ] + }, + "3969": { + "op": "bury 7", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page_index#0" + ] + }, + "3971": { + "op": "itob", + "defined_out": [ + "aggregate%extract%2#0", + "encoded_value%0#0", + "event_id#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "encoded_value%0#0" + ] + }, + "3972": { + "op": "bytec 24 // 0x5323", + "defined_out": [ + "0x5323", + "aggregate%extract%2#0", + "encoded_value%0#0", + "event_id#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "encoded_value%0#0", + "0x5323" + ] + }, + "3974": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0x5323", + "encoded_value%0#0" + ] + }, + "3975": { + "op": "concat", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "event_id#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "box_prefixed_key%0#0" + ] + }, + "3976": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0" + ] + }, + "3977": { + "op": "bury 9", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "event_id#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "box_prefixed_key%0#0" + ] + }, + "3979": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "event_id#0", + "maybe_exists%3#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "_%0#0", + "maybe_exists%3#0" + ] + }, + "3980": { + "op": "bury 1", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_exists%3#0" + ] + }, + "3982": { + "op": "bz apply_non_cash_event_after_if_else@27", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "3985": { + "op": "dig 7", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "box_prefixed_key%0#0" + ] + }, + "3987": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%1#0", + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "event_id#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%box_get%1#0" + ] + }, + "3988": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%box_get%1#0", + "page#0" + ] + }, + "3989": { + "op": "bury 7", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%box_get%1#0" + ] + }, + "3991": { + "error": "check self.schedule_page entry exists", + "op": "assert // check self.schedule_page entry exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "3992": { + "block": "apply_non_cash_event_after_if_else@27", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "dig 5", + "defined_out": [ + "page#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0" + ] + }, + "3994": { + "op": "dup", + "defined_out": [ + "page#0", + "page#0 (copy)" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "page#0 (copy)" + ] + }, + "3995": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "page#0", + "page#0 (copy)" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "page#0 (copy)", + "0" + ] + }, + "3996": { + "error": "invalid array length header", + "op": "extract_uint16 // on error: invalid array length header", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0" + ] + }, + "3997": { + "op": "dup", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)", + "page#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)" + ] + }, + "3998": { + "op": "pushint 16", + "defined_out": [ + "16", + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)", + "page#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)", + "16" + ] + }, + "4000": { + "op": "<", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0", + "tmp%5#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "tmp%5#2" + ] + }, + "4001": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0" + ] + }, + "4002": { + "op": "dig 3", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0" + ] + }, + "4004": { + "op": "dup", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0", + "payload#0", + "payload#0 (copy)" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "4005": { + "op": "extract 9 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0" + ] + }, + "4008": { + "op": "dig 1", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "payload#0 (copy)" + ] + }, + "4010": { + "op": "extract 17 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0" + ] + }, + "4013": { + "op": "dig 2", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "payload#0 (copy)" + ] + }, + "4015": { + "op": "extract 25 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0" + ] + }, + "4018": { + "op": "dig 3", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "payload#0 (copy)" + ] + }, + "4020": { + "op": "extract 41 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0" + ] + }, + "4023": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "payload#0 (copy)" + ] + }, + "4025": { + "op": "extract 49 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0" + ] + }, + "4028": { + "op": "uncover 5", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "payload#0" + ] + }, + "4030": { + "op": "extract 57 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0" + ] + }, + "4033": { + "op": "dig 11", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "values%0#1" + ] + }, + "4035": { + "op": "itob", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%val_as_bytes%0#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "4036": { + "op": "dig 18", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%val_as_bytes%0#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%val_as_bytes%0#0", + "aggregate%extract%2#0" + ] + }, + "4038": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%1#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%3#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%1#0" + ] + }, + "4039": { + "op": "uncover 6", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%1#0", + "aggregate%extract%3#0" + ] + }, + "4041": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%2#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%4#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%2#0" + ] + }, + "4042": { + "op": "uncover 5", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%2#0", + "aggregate%extract%4#0" + ] + }, + "4044": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%3#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%3#0" + ] + }, + "4045": { + "op": "uncover 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%3#0", + "aggregate%extract%5#0" + ] + }, + "4047": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0" + ] + }, + "4048": { + "op": "uncover 3", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%4#0", + "aggregate%extract%6#0" + ] + }, + "4050": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%5#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%head%5#0" + ] + }, + "4051": { + "op": "uncover 2", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%8#0", + "aggregate%head%5#0", + "aggregate%extract%7#0" + ] + }, + "4053": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%extract%8#0", + "aggregate%head%6#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%8#0", + "aggregate%head%6#0" + ] + }, + "4054": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%6#0", + "aggregate%extract%8#0" + ] + }, + "4055": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%head%7#0", + "page#0", + "payload#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%7#0" + ] + }, + "4056": { + "op": "dig 3", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%head%7#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%7#0", + "values%0#0" + ] + }, + "4058": { + "op": "itob", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%7#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%7#0" + ] + }, + "4059": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "aggregate%head%8#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%8#0" + ] + }, + "4060": { + "op": "uncover 2", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%array_length%0#0", + "aggregate%head%8#0", + "page#0" + ] + }, + "4062": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%array_length%0#0", + "page#0", + "aggregate%head%8#0" + ] + }, + "4063": { + "error": "max array length exceeded", + "op": "concat // on error: max array length exceeded", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%array_length%0#0", + "concat%0#0" + ] + }, + "4064": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "concat%0#0", + "aggregate%array_length%0#0" + ] + }, + "4065": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "aggregate%array_length%0#0", + "aggregate%extract%2#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "concat%0#0", + "aggregate%array_length%0#0", + "1" + ] + }, + "4066": { + "op": "+", + "defined_out": [ + "add%0#0", + "aggregate%extract%2#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "concat%0#0", + "add%0#0" + ] + }, + "4067": { + "op": "itob", + "defined_out": [ + "aggregate%extract%2#0", + "as_bytes%0#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "concat%0#0", + "as_bytes%0#0" + ] + }, + "4068": { + "op": "extract 6 2", + "defined_out": [ + "aggregate%extract%2#0", + "as_u16_bytes%0#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "concat%0#0", + "as_u16_bytes%0#0" + ] + }, + "4071": { + "op": "replace2 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0" + ] + }, + "4073": { + "op": "dig 8", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "box_prefixed_key%0#0" + ] + }, + "4075": { + "op": "dup", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "4076": { + "op": "box_del", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1", + "{box_del}" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "box_prefixed_key%0#0", + "{box_del}" + ] + }, + "4077": { + "op": "pop", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "page#0", + "box_prefixed_key%0#0" + ] + }, + "4078": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "box_prefixed_key%0#0", + "page#0" + ] + }, + "4079": { + "op": "box_put", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4080": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0" + ] + }, + "4081": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4082": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "maybe_exists%4#0", + "maybe_value%3#0", + "page#0", + "payload#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%3#0", + "maybe_exists%4#0" + ] + }, + "4083": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%3#0" + ] + }, + "4084": { + "op": "intc_1 // 1", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%3#0", + "1" + ] + }, + "4085": { + "op": "+", + "defined_out": [ + "aggregate%extract%2#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "tmp%8#0", + "values%0#0", + "values%0#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%8#0" + ] + }, + "4086": { + "op": "bytec_3 // \"schedule_entry_count\"", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%8#0", + "\"schedule_entry_count\"" + ] + }, + "4087": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "\"schedule_entry_count\"", + "tmp%8#0" + ] + }, + "4088": { + "op": "app_global_put", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4089": { + "block": "apply_non_cash_event_after_if_else@3", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0" + ] + }, + "4090": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0", + "\"event_cursor\"" + ] + }, + "4091": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4092": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0" + ] + }, + "4093": { + "op": "dig 3", + "defined_out": [ + "event_id#0", + "maybe_value%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "event_id#0" + ] + }, + "4095": { + "op": "dup" + }, + "4096": { + "op": "uncover 2", + "defined_out": [ + "event_id#0", + "event_id#0 (copy)", + "maybe_value%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_id#0", + "event_id#0 (copy)", + "maybe_value%0#0" + ] + }, + "4098": { + "op": "==", + "defined_out": [ + "event_id#0", + "tmp%3#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_id#0", + "tmp%3#1" + ] + }, + "4099": { + "error": "Invalid event cursor", + "op": "assert // Invalid event cursor", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_id#0" + ] + }, + "4100": { + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "entry#0", + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0" + ] + }, + "4103": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0", + "entry#0" + ] + }, + "4104": { + "op": "bury 8", + "defined_out": [ + "entry#0", + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0" + ] + }, + "4106": { + "op": "dup", + "defined_out": [ + "entry#0", + "entry#0 (copy)", + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0", + "entry#0 (copy)" + ] + }, + "4107": { + "op": "extract 8 1", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0", + "aggregate%extract%9#0" + ] + }, + "4110": { + "op": "bury 10", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0" + ] + }, + "4112": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "aggregate%extract%9#0", + "entry#0", + "event_id#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0", + "8" + ] + }, + "4113": { + "op": "getbyte", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4114": { + "op": "dup", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "event_type#0" + ] + }, + "4115": { + "op": "bury 6", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4117": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "1" + ] + }, + "4118": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0", + "tmp%0#3" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%0#3" + ] + }, + "4119": { + "op": "bnz apply_non_cash_event_bool_true@15", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4122": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4124": { + "op": "pushint 4", + "defined_out": [ + "4", + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "4" + ] + }, + "4126": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0", + "tmp%1#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%1#2" + ] + }, + "4127": { + "op": "bnz apply_non_cash_event_bool_true@15", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4130": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4132": { + "op": "pushint 12", + "defined_out": [ + "12", + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "12" + ] + }, + "4134": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0", + "tmp%2#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%2#2" + ] + }, + "4135": { + "op": "bnz apply_non_cash_event_bool_true@15", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4138": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4140": { + "op": "pushint 11", + "defined_out": [ + "11", + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "11" + ] + }, + "4142": { + "op": "==", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%3#1" + ] + }, + "4143": { + "op": "bnz apply_non_cash_event_bool_true@15", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4146": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4148": { + "op": "pushint 18", + "defined_out": [ + "18", + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "18" + ] + }, + "4150": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0", + "tmp%4#1" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%4#1" + ] + }, + "4151": { + "op": "bnz apply_non_cash_event_bool_true@15", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4154": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4156": { + "op": "pushint 5", + "defined_out": [ + "5", + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "5" + ] + }, + "4158": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "entry#0", + "event_id#0", + "event_type#0", + "tmp%5#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%5#2" + ] + }, + "4159": { + "op": "bz apply_non_cash_event_bool_false@16", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4162": { + "block": "apply_non_cash_event_bool_true@15", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ] + }, + "4163": { + "error": "Invalid event type", + "block": "apply_non_cash_event_bool_merge@17", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ], + "op": "assert // Invalid event type", + "defined_out": [], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4164": { + "op": "dig 8", + "defined_out": [ + "aggregate%extract%9#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%extract%9#0" + ] + }, + "4166": { + "op": "pushbytes 0x01", + "defined_out": [ + "0x01", + "aggregate%extract%9#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%extract%9#0", + "0x01" + ] + }, + "4169": { + "op": "b!=", + "defined_out": [ + "aggregate%extract%9#0", + "tmp%7#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%7#0" + ] + }, + "4170": { + "error": "Invalid event type", + "op": "assert // Invalid event type", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4171": { + "op": "dig 4", + "defined_out": [ + "aggregate%extract%9#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4173": { + "op": "pushint 12", + "defined_out": [ + "12", + "aggregate%extract%9#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "12" + ] + }, + "4175": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "event_type#0", + "tmp%0#3" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%0#3" + ] + }, + "4176": { + "op": "bnz apply_non_cash_event_bool_true@21", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4179": { + "op": "dig 4", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0" + ] + }, + "4181": { + "op": "pushint 11", + "defined_out": [ + "11", + "aggregate%extract%9#0", + "event_type#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "event_type#0", + "11" + ] + }, + "4183": { + "op": "==", + "defined_out": [ + "aggregate%extract%9#0", + "event_type#0", + "tmp%1#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%1#2" + ] + }, + "4184": { + "op": "bz apply_non_cash_event_bool_false@22", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4187": { + "block": "apply_non_cash_event_bool_true@21", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ] + }, + "4188": { + "block": "apply_non_cash_event_bool_merge@23", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ], + "op": "bz apply_non_cash_event_else_body@5", + "defined_out": [], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4191": { + "op": "bytec 25 // 0x523a4d4f4323", + "defined_out": [ + "0x523a4d4f4323" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0x523a4d4f4323" + ] + }, + "4193": { + "op": "txn Sender", + "defined_out": [ + "0x523a4d4f4323", + "tmp%0#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0x523a4d4f4323", + "tmp%0#2" + ] + }, + "4195": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "tmp%1#2" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%1#2" + ] + }, + "4198": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4199": { + "block": "apply_non_cash_event_after_if_else@6", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "dig 6", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0" + ] + }, + "4201": { + "op": "dig 2", + "defined_out": [ + "entry#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "entry#0", + "payload#0" + ] + }, + "4203": { + "callsub": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", + "op": "callsub _apply_non_cash_schedule_entry" + }, + "4206": { + "op": "popn 2", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4208": { + "op": "global LatestTimestamp", + "defined_out": [ + "entry#0", + "payload#0", + "tmp%10#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%10#0" + ] + }, + "4210": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%8#0", + "entry#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%val_as_bytes%8#0" + ] + }, + "4211": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%8#0", + "entry#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "aggregate%val_as_bytes%8#0", + "0x151f7c75" + ] + }, + "4212": { + "op": "swap", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "0x151f7c75", + "aggregate%val_as_bytes%8#0" + ] + }, + "4213": { + "op": "concat", + "defined_out": [ + "entry#0", + "payload#0", + "tmp%5#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "tmp%5#0" + ] + }, + "4214": { + "op": "log", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4215": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "entry#0", + "payload#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "1" + ] + }, + "4216": { + "op": "return", + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ] + }, + "4217": { + "block": "apply_non_cash_event_else_body@5", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4220": { + "op": "b apply_non_cash_event_after_if_else@6" + }, + "4223": { + "block": "apply_non_cash_event_bool_false@22", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ] + }, + "4224": { + "op": "b apply_non_cash_event_bool_merge@23" + }, + "4227": { + "block": "apply_non_cash_event_bool_false@16", + "stack_in": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "aggregate%extract%2#0", + "aggregate%extract%9#0", + "box_prefixed_key%0#0", + "entry#0", + "page#0", + "event_type#0", + "values%0#1", + "event_id#0", + "payload#0", + "values%0#0", + "or_result%0#0" + ] + }, + "4228": { + "op": "b apply_non_cash_event_bool_merge@17" + }, + "4231": { + "subroutine": "modules.actus_kernel.ActusKernelModule.append_observed_cash_event[routing]", + "params": {}, + "block": "append_observed_cash_event", + "stack_in": [], + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0" + ] + }, + "4232": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0" + ] + }, + "4233": { + "op": "txna ApplicationArgs 1" + }, + "4236": { + "op": "dupn 2", + "defined_out": [ + "payload#0", + "payload#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "4238": { + "op": "len", + "defined_out": [ + "len%0#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "len%0#0" + ] + }, + "4239": { + "op": "pushint 65", + "defined_out": [ + "65", + "len%0#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "len%0#0", + "65" + ] + }, + "4241": { + "op": "==", + "defined_out": [ + "eq%0#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "eq%0#0" + ] + }, + "4242": { + "error": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0" + ] + }, + "4243": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "0" + ] + }, + "4244": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "0", + "\"status\"" + ] + }, + "4245": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4246": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0" + ] + }, + "4247": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0" + ] + }, + "4248": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4251": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" + }, + "4254": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "op": "callsub _assert_is_not_contract_suspended" + }, + "4257": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "0" + ] + }, + "4258": { + "op": "bytec_1 // \"status\"", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "0", + "\"status\"" + ] + }, + "4259": { + "op": "app_global_get_ex", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4260": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0" + ] + }, + "4261": { + "op": "pushint 50", + "defined_out": [ + "50", + "maybe_value%0#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0", + "50" + ] + }, + "4263": { + "op": "==", + "defined_out": [ + "payload#0", + "tmp%0#5" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "tmp%0#5" + ] + }, + "4264": { + "op": "!", + "defined_out": [ + "payload#0", + "tmp%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "tmp%1#0" + ] + }, + "4265": { + "error": "IED not yet executed", + "op": "assert // IED not yet executed", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0" + ] + }, + "4266": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "0" + ] + }, + "4267": { + "op": "bytec 10 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "0", + "\"contract_type\"" + ] + }, + "4269": { + "op": "app_global_get_ex", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4270": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0" + ] + }, + "4271": { + "op": "pushint 5", + "defined_out": [ + "5", + "maybe_value%0#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "maybe_value%0#0", + "5" + ] + }, + "4273": { + "op": "==", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "tmp%0#5" + ] + }, + "4274": { + "error": "Observed event required to execute this action", + "op": "assert // Observed event required to execute this action", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0" + ] + }, + "4275": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "4276": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "payload#0 (copy)", + "0" + ] + }, + "4277": { + "op": "extract_uint64", + "defined_out": [ + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "values%0#0" + ] + }, + "4278": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "payload#0", + "values%0#0", + "values%0#0" + ] + }, + "4279": { + "op": "cover 2", + "defined_out": [ + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "values%0#0" + ] + }, + "4281": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "values%0#0", + "0" + ] + }, + "4282": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "values%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4283": { + "op": "app_global_get_ex", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "values%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4284": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "values%0#0", + "maybe_value%0#0" + ] + }, + "4285": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0", + "values%0#0" + ] + }, + "4286": { + "op": "dig 1", + "defined_out": [ + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0", + "values%0#0", + "maybe_value%0#0 (copy)" + ] + }, + "4288": { + "op": "==", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0", + "tmp%1#0" + ] + }, + "4289": { + "error": "Invalid event id", + "op": "assert // Invalid event id", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0" + ] + }, + "4290": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0", + "payload#0 (copy)" + ] + }, + "4292": { + "op": "extract 8 1", + "defined_out": [ + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0", + "aggregate%extract%1#0" + ] + }, + "4295": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "payload#0", + "maybe_value%0#0", + "aggregate%extract%1#0", + "aggregate%extract%1#0" + ] + }, + "4296": { + "op": "cover 3", + "defined_out": [ + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "payload#0", + "maybe_value%0#0", + "aggregate%extract%1#0" + ] + }, + "4298": { + "op": "pushbytes 0x03", + "defined_out": [ + "0x03", + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "payload#0", + "maybe_value%0#0", + "aggregate%extract%1#0", + "0x03" + ] + }, + "4301": { + "op": "b==", + "defined_out": [ + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "tmp%2#1", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "payload#0", + "maybe_value%0#0", + "tmp%2#1" + ] + }, + "4302": { + "error": "Invalid event type", + "op": "assert // Invalid event type", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "payload#0", + "maybe_value%0#0" + ] + }, + "4303": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0" + ] + }, + "4304": { + "op": "pushint 57", + "defined_out": [ + "57", + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "57" + ] + }, + "4306": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "maybe_value%0#0", + "values%1#0" + ] + }, + "4307": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "maybe_value%0#0", + "values%1#0", + "values%1#0" + ] + }, + "4308": { + "op": "cover 2", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%0#0", + "values%1#0" + ] + }, + "4310": { + "op": "intc_1 // 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%0#0", + "values%1#0", + "1" + ] + }, + "4311": { + "op": "&", + "defined_out": [ + "aggregate%extract%1#0", + "maybe_value%0#0", + "payload#0", + "tmp%3#1", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%0#0", + "tmp%3#1" + ] + }, + "4312": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%0#0" + ] + }, + "4313": { + "op": "bz append_observed_cash_event_after_if_else@3", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4316": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0" + ] + }, + "4317": { + "op": "bytec_3 // \"schedule_entry_count\"", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4318": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%extract%1#0", + "maybe_exists%2#0", + "maybe_value%2#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "4319": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%2#0" + ] + }, + "4320": { + "op": "intc_1 // 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%2#0", + "1" + ] + }, + "4321": { + "op": "-", + "defined_out": [ + "aggregate%extract%1#0", + "payload#0", + "tmp%6#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "tmp%6#0" + ] + }, + "4322": { + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "aggregate%extract%1#0", + "payload#0", + "previous_entry#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "previous_entry#0" + ] + }, + "4325": { + "op": "pushint 9", + "defined_out": [ + "9", + "aggregate%extract%1#0", + "payload#0", + "previous_entry#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "previous_entry#0", + "9" + ] + }, + "4327": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%extract%1#0", + "payload#0", + "values%0#0", + "values%1#0", + "values%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "values%2#0" + ] + }, + "4328": { + "op": "dig 4", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "values%2#0", + "payload#0" + ] + }, + "4330": { + "op": "pushint 9", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "values%2#0", + "payload#0", + "9" + ] + }, + "4332": { + "op": "extract_uint64", + "defined_out": [ + "aggregate%extract%1#0", + "payload#0", + "values%0#0", + "values%1#0", + "values%2#0", + "values%3#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "values%2#0", + "values%3#0" + ] + }, + "4333": { + "op": "<=", + "defined_out": [ + "aggregate%extract%1#0", + "payload#0", + "tmp%8#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "tmp%8#0" + ] + }, + "4334": { + "error": "Time events must be sorted in strictly ascending order", + "op": "assert // Time events must be sorted in strictly ascending order", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4335": { + "block": "append_observed_cash_event_after_if_else@3", + "stack_in": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0" + ] + }, + "4336": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4337": { + "op": "app_global_get_ex", + "defined_out": [ + "event_id#0", + "maybe_exists%3#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "event_id#0", + "maybe_exists%3#0" + ] + }, + "4338": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "event_id#0" + ] + }, + "4339": { + "op": "pushint 16", + "defined_out": [ + "16", + "event_id#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "event_id#0", + "16" + ] + }, + "4341": { + "op": "/", + "defined_out": [ + "page_index#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page_index#0" + ] + }, + "4342": { + "op": "bytec 48 // 0x0000", + "defined_out": [ + "page#0", + "page_index#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page_index#0", + "page#0" + ] + }, + "4344": { + "op": "bury 6", + "defined_out": [ + "page#0", + "page_index#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page_index#0" + ] + }, + "4346": { + "op": "itob", + "defined_out": [ + "encoded_value%0#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "encoded_value%0#0" + ] + }, + "4347": { + "op": "bytec 24 // 0x5323", + "defined_out": [ + "0x5323", + "encoded_value%0#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "encoded_value%0#0", + "0x5323" + ] + }, + "4349": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0x5323", + "encoded_value%0#0" + ] + }, + "4350": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "box_prefixed_key%0#0" + ] + }, + "4351": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0" + ] + }, + "4352": { + "op": "bury 7", + "defined_out": [ + "box_prefixed_key%0#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "box_prefixed_key%0#0" + ] + }, + "4354": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%4#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "_%0#0", + "maybe_exists%4#0" + ] + }, + "4355": { + "op": "bury 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_exists%4#0" + ] + }, + "4357": { + "op": "bz append_observed_cash_event_after_if_else@5", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4360": { + "op": "dig 5", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "box_prefixed_key%0#0" + ] + }, + "4362": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%1#0", + "box_prefixed_key%0#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%box_get%1#0" + ] + }, + "4363": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "aggregate%box_get%1#0", + "page#0" + ] + }, + "4364": { + "op": "bury 6", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "aggregate%box_get%1#0" + ] + }, + "4366": { + "error": "check self.schedule_page entry exists", + "op": "assert // check self.schedule_page entry exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4367": { + "block": "append_observed_cash_event_after_if_else@5", + "stack_in": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ], + "op": "dig 4", + "defined_out": [ + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0" + ] + }, + "4369": { + "op": "dup", + "defined_out": [ + "page#0", + "page#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "page#0 (copy)" + ] + }, + "4370": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "page#0", + "page#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "page#0 (copy)", + "0" + ] + }, + "4371": { + "error": "invalid array length header", + "op": "extract_uint16 // on error: invalid array length header", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0" + ] + }, + "4372": { + "op": "dup", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)" + ] + }, + "4373": { + "op": "pushint 16", + "defined_out": [ + "16", + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)", + "page#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%array_length%0#0 (copy)", + "16" + ] + }, + "4375": { + "op": "<", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0", + "tmp%11#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "tmp%11#0" + ] + }, + "4376": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0" + ] + }, + "4377": { + "op": "dig 5", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0" + ] + }, + "4379": { + "op": "dup", + "defined_out": [ + "aggregate%array_length%0#0", + "page#0", + "payload#0", + "payload#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "payload#0 (copy)" + ] + }, + "4380": { + "op": "extract 9 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0" + ] + }, + "4383": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "payload#0 (copy)" + ] + }, + "4385": { + "op": "extract 17 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0" + ] + }, + "4388": { + "op": "dig 2", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "payload#0 (copy)" + ] + }, + "4390": { + "op": "extract 25 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0" + ] + }, + "4393": { + "op": "dig 3", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "payload#0 (copy)" + ] + }, + "4395": { + "op": "extract 33 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0" + ] + }, + "4398": { + "op": "dig 4", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "payload#0 (copy)" + ] + }, + "4400": { + "op": "extract 41 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "payload#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0" + ] + }, + "4403": { + "op": "uncover 5", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "payload#0" + ] + }, + "4405": { + "op": "extract 49 8", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%10#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "page#0", + "payload#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0" + ] + }, + "4408": { + "op": "dig 10", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%10#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "values%0#0" + ] + }, + "4410": { + "op": "itob", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%10#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%val_as_bytes%0#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "4411": { + "op": "dig 10", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%val_as_bytes%0#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%val_as_bytes%0#0", + "aggregate%extract%1#0" + ] + }, + "4413": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%head%1#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%5#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%1#0" + ] + }, + "4414": { + "op": "uncover 6", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%1#0", + "aggregate%extract%5#0" + ] + }, + "4416": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%head%2#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%6#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%2#0" + ] + }, + "4417": { + "op": "uncover 5", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%2#0", + "aggregate%extract%6#0" + ] + }, + "4419": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%head%3#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%7#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%3#0" + ] + }, + "4420": { + "op": "uncover 4", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%3#0", + "aggregate%extract%7#0" + ] + }, + "4422": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%head%4#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%8#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%4#0" + ] + }, + "4423": { + "op": "uncover 3", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%4#0", + "aggregate%extract%8#0" + ] + }, + "4425": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%extract%9#0", + "aggregate%head%5#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%9#0", + "aggregate%extract%10#0", + "aggregate%head%5#0" + ] + }, + "4426": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%10#0", + "aggregate%head%5#0", + "aggregate%extract%9#0" + ] + }, + "4428": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%extract%10#0", + "aggregate%head%6#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%extract%10#0", + "aggregate%head%6#0" + ] + }, + "4429": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%6#0", + "aggregate%extract%10#0" + ] + }, + "4430": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%head%7#0", + "page#0", + "payload#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%7#0" + ] + }, + "4431": { + "op": "dig 3", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%head%7#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%7#0", + "values%1#0" + ] + }, + "4433": { + "op": "itob", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%7#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%7#0" + ] + }, + "4434": { + "op": "concat", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "aggregate%head%8#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "aggregate%array_length%0#0", + "aggregate%head%8#0" + ] + }, + "4435": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "aggregate%array_length%0#0", + "aggregate%head%8#0", + "page#0" + ] + }, + "4437": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "aggregate%array_length%0#0", + "page#0", + "aggregate%head%8#0" + ] + }, + "4438": { + "error": "max array length exceeded", + "op": "concat // on error: max array length exceeded", + "defined_out": [ + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "aggregate%array_length%0#0", + "concat%0#0" + ] + }, + "4439": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "concat%0#0", + "aggregate%array_length%0#0" + ] + }, + "4440": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "aggregate%array_length%0#0", + "aggregate%extract%1#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "concat%0#0", + "aggregate%array_length%0#0", + "1" + ] + }, + "4441": { + "op": "+", + "defined_out": [ + "add%0#0", + "aggregate%extract%1#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "concat%0#0", + "add%0#0" + ] + }, + "4442": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "as_bytes%0#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "concat%0#0", + "as_bytes%0#0" + ] + }, + "4443": { + "op": "extract 6 2", + "defined_out": [ + "aggregate%extract%1#0", + "as_u16_bytes%0#0", + "concat%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "concat%0#0", + "as_u16_bytes%0#0" + ] + }, + "4446": { + "op": "replace2 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0" + ] + }, + "4448": { + "op": "dig 6", + "defined_out": [ + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "box_prefixed_key%0#0" + ] + }, + "4450": { + "op": "dup", + "defined_out": [ + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "4451": { + "op": "box_del", + "defined_out": [ + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0", + "{box_del}" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "box_prefixed_key%0#0", + "{box_del}" + ] + }, + "4452": { + "op": "pop", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "page#0", + "box_prefixed_key%0#0" + ] + }, + "4453": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "box_prefixed_key%0#0", + "page#0" + ] + }, + "4454": { + "op": "box_put", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4455": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0" + ] + }, + "4456": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4457": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "maybe_exists%5#0", + "maybe_value%4#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%4#0", + "maybe_exists%5#0" + ] + }, + "4458": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%4#0" + ] + }, + "4459": { + "op": "intc_1 // 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "maybe_value%4#0", + "1" + ] + }, + "4460": { + "op": "+", + "defined_out": [ + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "tmp%14#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "tmp%14#0" + ] + }, + "4461": { + "op": "bytec_3 // \"schedule_entry_count\"", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "tmp%14#0", + "\"schedule_entry_count\"" + ] + }, + "4462": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "\"schedule_entry_count\"", + "tmp%14#0" + ] + }, + "4463": { + "op": "app_global_put", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4464": { + "op": "global LatestTimestamp", + "defined_out": [ + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "tmp%0#1", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "tmp%0#1" + ] + }, + "4466": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%val_as_bytes%8#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "aggregate%val_as_bytes%8#0" + ] + }, + "4467": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%extract%1#0", + "aggregate%val_as_bytes%8#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "aggregate%val_as_bytes%8#0", + "0x151f7c75" + ] + }, + "4468": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "0x151f7c75", + "aggregate%val_as_bytes%8#0" + ] + }, + "4469": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "tmp%3#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "tmp%3#0" + ] + }, + "4470": { + "op": "log", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4471": { + "op": "intc_1 // 1", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0", + "1" + ] + }, + "4472": { + "op": "return", + "stack_out": [ + "box_prefixed_key%0#0", + "page#0", + "payload#0", + "values%0#0", + "aggregate%extract%1#0", + "values%1#0" + ] + }, + "4473": { + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_get_state[routing]", + "params": {}, + "block": "contract_get_state", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "4474": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "0", + "\"status\"" + ] + }, + "4475": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "maybe_exists%0#0" + ] + }, + "4476": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "maybe_value%0#1" + ] + }, + "4477": { + "op": "dup", + "defined_out": [ + "maybe_value%0#1", + "maybe_value%0#1 (copy)" + ], + "stack_out": [ + "maybe_value%0#1", + "maybe_value%0#1 (copy)" + ] + }, + "4478": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [ + "maybe_value%0#1" + ] + }, + "4479": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "0" + ] + }, + "4480": { + "op": "bytec 10 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "0", + "\"contract_type\"" + ] + }, + "4482": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4483": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "maybe_value%0#1", + "maybe_value%0#0" + ] + }, + "4484": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%val_as_bytes%0#0" + ] + }, + "4485": { + "op": "dup", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%0#0 (copy)", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "4486": { + "op": "bitlen", + "defined_out": [ + "aggregate%bitlen%0#0", + "aggregate%val_as_bytes%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%val_as_bytes%0#0", + "aggregate%bitlen%0#0" + ] + }, + "4487": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "aggregate%bitlen%0#0", + "aggregate%val_as_bytes%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%val_as_bytes%0#0", + "aggregate%bitlen%0#0", + "8" + ] + }, + "4488": { + "op": "<=", + "defined_out": [ + "aggregate%no_overflow%0#0", + "aggregate%val_as_bytes%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%val_as_bytes%0#0", + "aggregate%no_overflow%0#0" + ] + }, + "4489": { + "error": "overflow", + "op": "assert // overflow", + "stack_out": [ + "maybe_value%0#1", + "aggregate%val_as_bytes%0#0" + ] + }, + "4490": { + "op": "extract 7 1", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0" + ] + }, + "4493": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "0" + ] + }, + "4494": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "0", + "\"total_units\"" + ] + }, + "4496": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%2#0", + "maybe_value%0#1", + "maybe_value%2#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "4497": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0" + ] + }, + "4498": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "0" + ] + }, + "4499": { + "op": "bytec 11 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "0", + "\"reserved_units_total\"" + ] + }, + "4501": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%3#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "4502": { + "error": "check self.reserved_units_total exists", + "op": "assert // check self.reserved_units_total exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0" + ] + }, + "4503": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "0" + ] + }, + "4504": { + "op": "bytec 20 // \"initial_exchange_amount\"", + "defined_out": [ + "\"initial_exchange_amount\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "0", + "\"initial_exchange_amount\"" + ] + }, + "4506": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%4#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "4507": { + "error": "check self.initial_exchange_amount exists", + "op": "assert // check self.initial_exchange_amount exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0" + ] + }, + "4508": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "0" + ] + }, + "4509": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "0", + "\"event_cursor\"" + ] + }, + "4510": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%5#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "4511": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0" + ] + }, + "4512": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "0" + ] + }, + "4513": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4514": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%6#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_exists%6#0" + ] + }, + "4515": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0" + ] + }, + "4516": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "0" + ] + }, + "4517": { + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "0", + "\"outstanding_principal\"" + ] + }, + "4519": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%7#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_exists%7#0" + ] + }, + "4520": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0" + ] + }, + "4521": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "0" + ] + }, + "4522": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "0", + "\"interest_calculation_base\"" + ] + }, + "4524": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%8#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_exists%8#0" + ] + }, + "4525": { + "error": "check self.interest_calculation_base exists", + "op": "assert // check self.interest_calculation_base exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0" + ] + }, + "4526": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "0" + ] + }, + "4527": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "0", + "\"nominal_interest_rate\"" + ] + }, + "4529": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%9#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_exists%9#0" + ] + }, + "4530": { + "error": "check self.nominal_interest_rate exists", + "op": "assert // check self.nominal_interest_rate exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ] + }, + "4531": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "0" + ] + }, + "4532": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "0", + "\"accrued_interest\"" + ] + }, + "4534": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%10#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_exists%10#0" + ] + }, + "4535": { + "error": "check self.accrued_interest exists", + "op": "assert // check self.accrued_interest exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0" + ] + }, + "4536": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "0" + ] + }, + "4537": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "defined_out": [ + "\"cumulative_interest_index\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "0", + "\"cumulative_interest_index\"" + ] + }, + "4539": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%11#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_exists%11#0" + ] + }, + "4540": { + "error": "check self.cumulative_interest_index exists", + "op": "assert // check self.cumulative_interest_index exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0" + ] + }, + "4541": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "0" + ] + }, + "4542": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "defined_out": [ + "\"cumulative_principal_index\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "0", + "\"cumulative_principal_index\"" + ] + }, + "4544": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%12#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_exists%12#0" + ] + }, + "4545": { + "error": "check self.cumulative_principal_index exists", + "op": "assert // check self.cumulative_principal_index exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0" + ] + }, + "4546": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "0" + ] + }, + "4547": { + "op": "bytec 15 // \"reserved_interest\"", + "defined_out": [ + "\"reserved_interest\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "0", + "\"reserved_interest\"" + ] + }, + "4549": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%13#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_exists%13#0" + ] + }, + "4550": { + "error": "check self.reserved_interest exists", + "op": "assert // check self.reserved_interest exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0" + ] + }, + "4551": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "0" + ] + }, + "4552": { + "op": "bytec 12 // \"reserved_principal\"", + "defined_out": [ + "\"reserved_principal\"", + "0", + "aggregate%uint8%0#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "0", + "\"reserved_principal\"" + ] + }, + "4554": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%14#0", + "maybe_value%0#1", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_exists%14#0" + ] + }, + "4555": { + "error": "check self.reserved_principal exists", + "op": "assert // check self.reserved_principal exists", + "stack_out": [ + "maybe_value%0#1", + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ] + }, + "4556": { + "op": "uncover 14", + "stack_out": [ + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%0#1" + ] + }, + "4558": { + "op": "itob", + "defined_out": [ + "aggregate%uint8%0#0", + "aggregate%val_as_bytes%1#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "aggregate%uint8%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "4559": { + "op": "uncover 14", + "stack_out": [ + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%val_as_bytes%1#0", + "aggregate%uint8%0#0" + ] + }, + "4561": { + "op": "swap", + "stack_out": [ + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%uint8%0#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "4562": { + "op": "concat", + "defined_out": [ + "aggregate%head%1#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%1#0" + ] + }, + "4563": { + "op": "uncover 13", + "stack_out": [ + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%1#0", + "maybe_value%2#0" + ] + }, + "4565": { + "op": "itob", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%2#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%1#0", + "aggregate%val_as_bytes%2#0" + ] + }, + "4566": { + "op": "concat", + "defined_out": [ + "aggregate%head%2#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%2#0" + ] + }, + "4567": { + "op": "uncover 12", + "stack_out": [ + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%2#0", + "maybe_value%3#0" + ] + }, + "4569": { + "op": "itob", + "defined_out": [ + "aggregate%head%2#0", + "aggregate%val_as_bytes%3#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%2#0", + "aggregate%val_as_bytes%3#0" + ] + }, + "4570": { + "op": "concat", + "defined_out": [ + "aggregate%head%3#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%4#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%3#0" + ] + }, + "4571": { + "op": "uncover 11", + "stack_out": [ + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%3#0", + "maybe_value%4#0" + ] + }, + "4573": { + "op": "itob", + "defined_out": [ + "aggregate%head%3#0", + "aggregate%val_as_bytes%4#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%3#0", + "aggregate%val_as_bytes%4#0" + ] + }, + "4574": { + "op": "concat", + "defined_out": [ + "aggregate%head%4#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%4#0" + ] + }, + "4575": { + "op": "uncover 10", + "stack_out": [ + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%4#0", + "maybe_value%5#0" + ] + }, + "4577": { + "op": "itob", + "defined_out": [ + "aggregate%head%4#0", + "aggregate%val_as_bytes%5#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%4#0", + "aggregate%val_as_bytes%5#0" + ] + }, + "4578": { + "op": "concat", + "defined_out": [ + "aggregate%head%5#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%6#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%5#0" + ] + }, + "4579": { + "op": "uncover 9", + "stack_out": [ + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%5#0", + "maybe_value%6#0" + ] + }, + "4581": { + "op": "itob", + "defined_out": [ + "aggregate%head%5#0", + "aggregate%val_as_bytes%6#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%5#0", + "aggregate%val_as_bytes%6#0" + ] + }, + "4582": { + "op": "concat", + "defined_out": [ + "aggregate%head%6#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%6#0" + ] + }, + "4583": { + "op": "uncover 8", + "stack_out": [ + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%6#0", + "maybe_value%7#0" + ] + }, + "4585": { + "op": "itob", + "defined_out": [ + "aggregate%head%6#0", + "aggregate%val_as_bytes%7#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%6#0", + "aggregate%val_as_bytes%7#0" + ] + }, + "4586": { + "op": "concat", + "defined_out": [ + "aggregate%head%7#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%8#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%8#0", + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%7#0" + ] + }, + "4587": { + "op": "uncover 7", + "stack_out": [ + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%7#0", + "maybe_value%8#0" + ] + }, + "4589": { + "op": "itob", + "defined_out": [ + "aggregate%head%7#0", + "aggregate%val_as_bytes%8#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%8#0" + ] + }, + "4590": { + "op": "concat", + "defined_out": [ + "aggregate%head%8#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "maybe_value%9#0" + ], + "stack_out": [ + "maybe_value%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%8#0" + ] + }, + "4591": { + "op": "uncover 6", + "stack_out": [ + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%8#0", + "maybe_value%9#0" + ] + }, + "4593": { + "op": "itob", + "defined_out": [ + "aggregate%head%8#0", + "aggregate%val_as_bytes%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%8#0", + "aggregate%val_as_bytes%9#0" + ] + }, + "4594": { + "op": "concat", + "defined_out": [ + "aggregate%head%9#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%9#0" + ] + }, + "4595": { + "op": "uncover 5", + "stack_out": [ + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%9#0", + "maybe_value%10#0" + ] + }, + "4597": { + "op": "itob", + "defined_out": [ + "aggregate%head%9#0", + "aggregate%val_as_bytes%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%9#0", + "aggregate%val_as_bytes%10#0" + ] + }, + "4598": { + "op": "concat", + "defined_out": [ + "aggregate%head%10#0", + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%10#0" + ] + }, + "4599": { + "op": "uncover 4", + "stack_out": [ + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%10#0", + "maybe_value%11#0" + ] + }, + "4601": { + "op": "itob", + "defined_out": [ + "aggregate%head%10#0", + "aggregate%val_as_bytes%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%10#0", + "aggregate%val_as_bytes%11#0" + ] + }, + "4602": { + "op": "concat", + "defined_out": [ + "aggregate%head%11#0", + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%12#0", + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%11#0" + ] + }, + "4603": { + "op": "uncover 3", + "stack_out": [ + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%11#0", + "maybe_value%12#0" + ] + }, + "4605": { + "op": "itob", + "defined_out": [ + "aggregate%head%11#0", + "aggregate%val_as_bytes%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%11#0", + "aggregate%val_as_bytes%12#0" + ] + }, + "4606": { + "op": "concat", + "defined_out": [ + "aggregate%head%12#0", + "maybe_value%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%13#0", + "maybe_value%14#0", + "aggregate%head%12#0" + ] + }, + "4607": { + "op": "uncover 2", + "stack_out": [ + "maybe_value%14#0", + "aggregate%head%12#0", + "maybe_value%13#0" + ] + }, + "4609": { + "op": "itob", + "defined_out": [ + "aggregate%head%12#0", + "aggregate%val_as_bytes%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%14#0", + "aggregate%head%12#0", + "aggregate%val_as_bytes%13#0" + ] + }, + "4610": { + "op": "concat", + "defined_out": [ + "aggregate%head%13#0", + "maybe_value%14#0" + ], + "stack_out": [ + "maybe_value%14#0", + "aggregate%head%13#0" + ] + }, + "4611": { + "op": "swap", + "stack_out": [ + "aggregate%head%13#0", + "maybe_value%14#0" + ] + }, + "4612": { + "op": "itob", + "defined_out": [ + "aggregate%head%13#0", + "aggregate%val_as_bytes%14#0" + ], + "stack_out": [ + "aggregate%head%13#0", + "aggregate%val_as_bytes%14#0" + ] + }, + "4613": { + "op": "concat", + "defined_out": [ + "aggregate%head%14#0" + ], + "stack_out": [ + "aggregate%head%14#0" + ] + }, + "4614": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%head%14#0" + ], + "stack_out": [ + "aggregate%head%14#0", + "0x151f7c75" + ] + }, + "4615": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%head%14#0" + ] + }, + "4616": { + "op": "concat", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "4617": { + "op": "log", + "stack_out": [] + }, + "4618": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "4619": { + "op": "return", + "stack_out": [] + }, + "4620": { + "subroutine": "modules.actus_kernel.ActusKernelModule.contract_get_next_due_event[routing]", + "params": {}, + "block": "contract_get_next_due_event", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "4621": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "0", + "\"status\"" + ] + }, + "4622": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4623": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "4624": { + "error": "D-ASA not configured", + "op": "assert // D-ASA not configured", + "stack_out": [] + }, + "4625": { + "op": "intc_0 // 0", + "stack_out": [ + "0" + ] + }, + "4626": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0" + ], + "stack_out": [ + "0", + "\"event_cursor\"" + ] + }, + "4627": { + "op": "app_global_get_ex", + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "4628": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "4629": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#0", + "0" + ] + }, + "4630": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "4631": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "4632": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "4633": { + "op": ">=", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "4634": { + "op": "bz contract_get_next_due_event_after_if_else@3", + "stack_out": [] + }, + "4637": { + "op": "intc_0 // 0", + "stack_out": [ + "0" + ] + }, + "4638": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "0", + "\"event_cursor\"" + ] + }, + "4639": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0" + ], + "stack_out": [ + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "4640": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "maybe_value%2#0" + ] + }, + "4641": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "4642": { + "op": "bytec 41 // 0x00", + "defined_out": [ + "0x00", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x00" + ] + }, + "4644": { + "op": "concat", + "defined_out": [ + "aggregate%head%1#0" + ], + "stack_out": [ + "aggregate%head%1#0" + ] + }, + "4645": { + "op": "intc_0 // 0", + "stack_out": [ + "aggregate%head%1#0", + "0" + ] + }, + "4646": { + "op": "itob", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "4647": { + "op": "swap", + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%1#0" + ] + }, + "4648": { + "op": "dig 1", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%val_as_bytes%1#0", + "aggregate%val_as_bytes%1#0 (copy)" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%1#0", + "aggregate%val_as_bytes%1#0 (copy)" + ] + }, + "4650": { + "op": "concat", + "defined_out": [ + "aggregate%head%2#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%2#0" + ] + }, + "4651": { + "op": "dig 1", + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%2#0", + "aggregate%val_as_bytes%1#0 (copy)" + ] + }, + "4653": { + "op": "concat", + "defined_out": [ + "aggregate%head%3#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%3#0" + ] + }, + "4654": { + "op": "dig 1", + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%3#0", + "aggregate%val_as_bytes%1#0 (copy)" + ] + }, + "4656": { + "op": "concat", + "defined_out": [ + "aggregate%head%4#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%4#0" + ] + }, + "4657": { + "op": "dig 1", + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%4#0", + "aggregate%val_as_bytes%1#0 (copy)" + ] + }, + "4659": { + "op": "concat", + "defined_out": [ + "aggregate%head%5#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%5#0" + ] + }, + "4660": { + "op": "dig 1", + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%5#0", + "aggregate%val_as_bytes%1#0 (copy)" + ] + }, + "4662": { + "op": "concat", + "defined_out": [ + "aggregate%head%6#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%6#0" + ] + }, + "4663": { + "op": "dig 1", + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%6#0", + "aggregate%val_as_bytes%1#0 (copy)" + ] + }, + "4665": { + "op": "concat", + "defined_out": [ + "aggregate%head%7#0", + "aggregate%val_as_bytes%1#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%1#0", + "aggregate%head%7#0" + ] + }, + "4666": { + "op": "swap", + "stack_out": [ + "aggregate%head%7#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "4667": { + "op": "concat", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "4668": { + "block": "contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4", + "stack_in": [ + "tmp%0#0" + ], + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75" + ], + "stack_out": [ + "tmp%0#0", + "0x151f7c75" + ] + }, + "4669": { + "op": "swap", + "defined_out": [ + "0x151f7c75", + "tmp%0#0" + ], + "stack_out": [ + "0x151f7c75", + "tmp%0#0" + ] + }, + "4670": { + "op": "concat", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "4671": { + "op": "log", + "stack_out": [] + }, + "4672": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "4673": { + "op": "return", + "stack_out": [] + }, + "4674": { + "block": "contract_get_next_due_event_after_if_else@3", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "4675": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0" + ], + "stack_out": [ + "0", + "\"event_cursor\"" + ] + }, + "4676": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0" + ], + "stack_out": [ + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "4677": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "maybe_value%3#0" + ] + }, + "4678": { + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "4681": { + "op": "b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4" + }, + "4684": { + "subroutine": "modules.rbac.RbacModule.contract_update[routing]", + "params": {}, + "block": "contract_update", + "stack_in": [], + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4687": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "4688": { + "op": "return", + "stack_out": [] + }, + "4689": { + "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", + "params": {}, + "block": "rbac_rotate_arranger", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0" + ] + }, + "4692": { + "op": "dup", + "defined_out": [ + "new_arranger#0", + "new_arranger#0 (copy)" + ], + "stack_out": [ + "new_arranger#0", + "new_arranger#0 (copy)" + ] + }, + "4693": { + "op": "len", + "defined_out": [ + "len%0#0", + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0", + "len%0#0" + ] + }, + "4694": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "len%0#0", + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0", + "len%0#0", + "32" + ] + }, + "4695": { + "op": "==", + "defined_out": [ + "eq%0#0", + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0", + "eq%0#0" + ] + }, + "4696": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "new_arranger#0" + ] + }, + "4697": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4700": { + "op": "bytec 18 // 0x523a41525223", + "defined_out": [ + "0x523a41525223", + "new_arranger#0" + ], + "stack_out": [ + "new_arranger#0", + "0x523a41525223" + ] + }, + "4702": { + "op": "swap", + "stack_out": [ + "0x523a41525223", + "new_arranger#0" + ] + }, + "4703": { + "op": "app_global_put", + "stack_out": [] + }, + "4704": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "4706": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "4707": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "4708": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "4709": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "4710": { + "op": "log", + "stack_out": [] + }, + "4711": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "4712": { + "op": "return", + "stack_out": [] + }, + "4713": { + "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", + "params": {}, + "block": "rbac_set_op_daemon", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "address#0" + ], + "stack_out": [ + "address#0" + ] + }, + "4716": { + "op": "dup", + "defined_out": [ + "address#0", + "address#0 (copy)" + ], + "stack_out": [ + "address#0", + "address#0 (copy)" + ] + }, + "4717": { + "op": "len", + "defined_out": [ + "address#0", + "len%0#0" + ], + "stack_out": [ + "address#0", + "len%0#0" + ] + }, + "4718": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "address#0", + "len%0#0" + ], + "stack_out": [ + "address#0", + "len%0#0", + "32" + ] + }, + "4719": { + "op": "==", + "defined_out": [ + "address#0", + "eq%0#0" + ], + "stack_out": [ + "address#0", + "eq%0#0" + ] + }, + "4720": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "address#0" + ] + }, + "4721": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4724": { + "op": "bytec 27 // 0x523a4f504423", + "defined_out": [ + "0x523a4f504423", + "address#0" + ], + "stack_out": [ + "address#0", + "0x523a4f504423" + ] + }, + "4726": { + "op": "swap", + "stack_out": [ + "0x523a4f504423", + "address#0" + ] + }, + "4727": { + "op": "app_global_put", + "stack_out": [] + }, + "4728": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "4730": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "4731": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "4732": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "4733": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "4734": { + "op": "log", + "stack_out": [] + }, + "4735": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "4736": { + "op": "return", + "stack_out": [] + }, + "4737": { + "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", + "params": {}, + "block": "rbac_assign_role", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "role_id#0" + ], + "stack_out": [ + "role_id#0" + ] + }, + "4740": { + "op": "dup", + "defined_out": [ + "role_id#0", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0", + "role_id#0 (copy)" + ] + }, + "4741": { + "op": "len", + "defined_out": [ + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0" + ] + }, + "4742": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0", + "1" + ] + }, + "4743": { + "op": "==", + "defined_out": [ + "eq%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "eq%0#0" + ] + }, + "4744": { + "error": "invalid number of bytes for arc4.uint8", + "op": "assert // invalid number of bytes for arc4.uint8", + "stack_out": [ + "role_id#0" + ] + }, + "4745": { + "op": "txna ApplicationArgs 2" + }, + "4748": { + "op": "dup", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "role_address#0", + "role_address#0" + ] + }, + "4749": { + "op": "cover 2", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "role_address#0" + ] + }, + "4751": { + "op": "len", + "defined_out": [ + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0" + ] + }, + "4752": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0", + "32" + ] + }, + "4753": { + "op": "==", + "defined_out": [ + "eq%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "eq%1#0" + ] + }, + "4754": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "role_address#0", + "role_id#0" + ] + }, + "4755": { + "op": "txna ApplicationArgs 3" + }, + "4758": { + "op": "dup", + "defined_out": [ + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "validity#0", + "validity#0" + ] + }, + "4759": { + "op": "cover 2", + "defined_out": [ + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0", + "validity#0" + ] + }, + "4761": { + "op": "len", + "defined_out": [ + "len%2#0", + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0", + "len%2#0" + ] + }, + "4762": { + "op": "pushint 16", + "defined_out": [ + "16", + "len%2#0", + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0", + "len%2#0", + "16" + ] + }, + "4764": { + "op": "==", + "defined_out": [ + "eq%2#0", + "role_address#0", + "role_id#0", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0", + "eq%2#0" + ] + }, + "4765": { + "error": "invalid number of bytes for smart_contracts.abi_types.RoleValidity", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#0" + ] + }, + "4766": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4769": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" + }, + "4772": { + "op": "btoi", + "defined_out": [ + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4773": { + "op": "dupn 2", + "defined_out": [ + "role_address#0", + "role_id#1", + "role_id#1 (copy)", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "role_id#1 (copy)" + ] + }, + "4775": { + "callsub": "modules.rbac.RbacModule._assert_valid_role", + "op": "callsub _assert_valid_role", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "4778": { + "op": "pushint 20", + "defined_out": [ + "20", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "20" + ] + }, + "4780": { + "op": "==", + "defined_out": [ + "role_address#0", + "role_id#1", + "tmp%0#2", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%0#2" + ] + }, + "4781": { + "op": "bz rbac_assign_role_after_if_else@3", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4784": { + "op": "bytec 18 // 0x523a41525223", + "defined_out": [ + "0x523a41525223", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x523a41525223" + ] + }, + "4786": { + "op": "dig 3", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x523a41525223", + "role_address#0" + ] + }, + "4788": { + "op": "app_global_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4789": { + "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%2#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%2#1" + ] + }, + "4791": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "aggregate%val_as_bytes%0#0" + ] + }, + "4792": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "4793": { + "op": "swap", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "4794": { + "op": "concat", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%6#0" + ] + }, + "4795": { + "op": "log", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4796": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "1" + ] + }, + "4797": { + "op": "return", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4798": { + "block": "rbac_assign_role_after_if_else@3", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "4799": { + "op": "pushint 40", + "defined_out": [ + "40", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "40" + ] + }, + "4801": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%1#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%1#1" + ] + }, + "4802": { + "op": "bz rbac_assign_role_after_if_else@5", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4805": { + "op": "bytec 23 // 0x523a4d4e4723", + "defined_out": [ + "0x523a4d4e4723", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x523a4d4e4723" + ] + }, + "4807": { + "op": "dig 3", + "defined_out": [ + "0x523a4d4e4723", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x523a4d4e4723", + "role_address#0" + ] + }, + "4809": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0" + ] + }, + "4810": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "4811": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%0#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "4812": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "maybe_exists%0#0" + ] + }, + "4814": { + "op": "!", + "defined_out": [ + "box_prefixed_key%0#0", + "role_address#0", + "role_id#1", + "tmp%2#2" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "tmp%2#2" + ] + }, + "4815": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0" + ] + }, + "4816": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%0#0", + "validity#0" + ] + }, + "4818": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4819": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "4822": { + "block": "rbac_assign_role_after_if_else@5", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "4823": { + "op": "pushint 50", + "defined_out": [ + "50", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "50" + ] + }, + "4825": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%3#0" + ] + }, + "4826": { + "op": "bz rbac_assign_role_after_if_else@7", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4829": { + "op": "bytec 22 // 0x523a50594423", + "defined_out": [ + "0x523a50594423", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x523a50594423" + ] + }, + "4831": { + "op": "dig 3", + "defined_out": [ + "0x523a50594423", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x523a50594423", + "role_address#0" + ] + }, + "4833": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%2#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0" + ] + }, + "4834": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%2#0", + "box_prefixed_key%2#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "box_prefixed_key%2#0 (copy)" + ] + }, + "4835": { + "op": "box_len", + "defined_out": [ + "_%1#0", + "box_prefixed_key%2#0", + "maybe_exists%1#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "_%1#0", + "maybe_exists%1#0" + ] + }, + "4836": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "maybe_exists%1#0" + ] + }, + "4838": { + "op": "!", + "defined_out": [ + "box_prefixed_key%2#0", + "role_address#0", + "role_id#1", + "tmp%4#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "tmp%4#0" + ] + }, + "4839": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0" + ] + }, + "4840": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%2#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%2#0", + "validity#0" + ] + }, + "4842": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4843": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "4846": { + "block": "rbac_assign_role_after_if_else@7", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "4847": { + "op": "pushint 60", + "defined_out": [ + "60", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "60" + ] + }, + "4849": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%5#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%5#1" + ] + }, + "4850": { + "op": "bz rbac_assign_role_after_if_else@9", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4853": { + "op": "bytec 26 // 0x523a54525323", + "defined_out": [ + "0x523a54525323", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x523a54525323" + ] + }, + "4855": { + "op": "dig 3", + "defined_out": [ + "0x523a54525323", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x523a54525323", + "role_address#0" + ] + }, + "4857": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%4#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0" + ] + }, + "4858": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%4#0", + "box_prefixed_key%4#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "box_prefixed_key%4#0 (copy)" + ] + }, + "4859": { + "op": "box_len", + "defined_out": [ + "_%2#0", + "box_prefixed_key%4#0", + "maybe_exists%2#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "_%2#0", + "maybe_exists%2#0" + ] + }, + "4860": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "maybe_exists%2#0" + ] + }, + "4862": { + "op": "!", + "defined_out": [ + "box_prefixed_key%4#0", + "role_address#0", + "role_id#1", + "tmp%6#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "tmp%6#1" + ] + }, + "4863": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0" + ] + }, + "4864": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%4#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%4#0", + "validity#0" + ] + }, + "4866": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4867": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "4870": { + "block": "rbac_assign_role_after_if_else@9", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "4871": { + "op": "pushint 70", + "defined_out": [ + "70", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "70" + ] + }, + "4873": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%7#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%7#0" + ] + }, + "4874": { + "op": "bz rbac_assign_role_after_if_else@11", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4877": { + "op": "bytec 21 // 0x523a41555423", + "defined_out": [ + "0x523a41555423", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x523a41555423" + ] + }, + "4879": { + "op": "dig 3", + "defined_out": [ + "0x523a41555423", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x523a41555423", + "role_address#0" + ] + }, + "4881": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%6#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0" + ] + }, + "4882": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%6#0", + "box_prefixed_key%6#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "box_prefixed_key%6#0 (copy)" + ] + }, + "4883": { + "op": "box_len", + "defined_out": [ + "_%3#0", + "box_prefixed_key%6#0", + "maybe_exists%3#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "_%3#0", + "maybe_exists%3#0" + ] + }, + "4884": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "maybe_exists%3#0" + ] + }, + "4886": { + "op": "!", + "defined_out": [ + "box_prefixed_key%6#0", + "role_address#0", + "role_id#1", + "tmp%8#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "tmp%8#0" + ] + }, + "4887": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0" + ] + }, + "4888": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%6#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%6#0", + "validity#0" + ] + }, + "4890": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4891": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "4894": { + "block": "rbac_assign_role_after_if_else@11", + "stack_in": [ + "role_address#0", + "validity#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1" + ] + }, + "4895": { + "op": "pushint 80", + "defined_out": [ + "80", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "role_id#1", + "80" + ] + }, + "4897": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%9#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "tmp%9#0" + ] + }, + "4898": { + "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4901": { + "op": "bytec 25 // 0x523a4d4f4323", + "defined_out": [ + "0x523a4d4f4323", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x523a4d4f4323" + ] + }, + "4903": { + "op": "dig 3", + "defined_out": [ + "0x523a4d4f4323", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "0x523a4d4f4323", + "role_address#0" + ] + }, + "4905": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%8#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0" + ] + }, + "4906": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%8#0", + "box_prefixed_key%8#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "box_prefixed_key%8#0 (copy)" + ] + }, + "4907": { + "op": "box_len", + "defined_out": [ + "_%4#0", + "box_prefixed_key%8#0", + "maybe_exists%4#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "_%4#0", + "maybe_exists%4#0" + ] + }, + "4908": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "maybe_exists%4#0" + ] + }, + "4910": { + "op": "!", + "defined_out": [ + "box_prefixed_key%8#0", + "role_address#0", + "role_id#1", + "tmp%10#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "tmp%10#0" + ] + }, + "4911": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0" + ] + }, + "4912": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%8#0", + "role_address#0", + "role_id#1", + "validity#0" + ], + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1", + "box_prefixed_key%8#0", + "validity#0" + ] + }, + "4914": { + "op": "box_put", + "stack_out": [ + "role_address#0", + "validity#0", + "role_id#1" + ] + }, + "4915": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" + }, + "4918": { + "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", + "params": {}, + "block": "rbac_revoke_role", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "role_id#0" + ], + "stack_out": [ + "role_id#0" + ] + }, + "4921": { + "op": "dup", + "defined_out": [ + "role_id#0", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0", + "role_id#0 (copy)" + ] + }, + "4922": { + "op": "len", + "defined_out": [ + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0" + ] + }, + "4923": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0", + "1" + ] + }, + "4924": { + "op": "==", + "defined_out": [ + "eq%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "eq%0#0" + ] + }, + "4925": { + "error": "invalid number of bytes for arc4.uint8", + "op": "assert // invalid number of bytes for arc4.uint8", + "stack_out": [ + "role_id#0" + ] + }, + "4926": { + "op": "txna ApplicationArgs 2" + }, + "4929": { + "op": "dup", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "role_address#0", + "role_address#0" + ] + }, + "4930": { + "op": "cover 2", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "role_address#0" + ] + }, + "4932": { + "op": "len", + "defined_out": [ + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0" + ] + }, + "4933": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0", + "32" + ] + }, + "4934": { + "op": "==", + "defined_out": [ + "eq%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "eq%1#0" + ] + }, + "4935": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "role_address#0", + "role_id#0" + ] + }, + "4936": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "4939": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" + }, + "4942": { + "op": "btoi", + "defined_out": [ + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4943": { + "op": "dupn 2", + "defined_out": [ + "role_address#0", + "role_id#1", + "role_id#1 (copy)" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "role_id#1 (copy)" + ] + }, + "4945": { + "callsub": "modules.rbac.RbacModule._assert_valid_role", + "op": "callsub _assert_valid_role", + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "4948": { + "op": "dup", + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "role_id#1 (copy)" + ] + }, + "4949": { + "op": "pushint 20", + "defined_out": [ + "20", + "role_address#0", + "role_id#1", + "role_id#1 (copy)" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "role_id#1 (copy)", + "20" + ] + }, + "4951": { + "op": "!=", + "defined_out": [ + "role_address#0", + "role_id#1", + "tmp%0#2" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "tmp%0#2" + ] + }, + "4952": { + "error": "Invalid role identifier", + "op": "assert // Invalid role identifier", + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "4953": { + "op": "pushint 40", + "defined_out": [ + "40", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "40" + ] + }, + "4955": { + "op": "==", + "defined_out": [ + "role_address#0", + "role_id#1", + "tmp%1#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%1#1" + ] + }, + "4956": { + "op": "bz rbac_revoke_role_after_if_else@3", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4959": { + "op": "bytec 23 // 0x523a4d4e4723", + "defined_out": [ + "0x523a4d4e4723", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x523a4d4e4723" + ] + }, + "4961": { + "op": "dig 2", + "stack_out": [ + "role_address#0", + "role_id#1", + "0x523a4d4e4723", + "role_address#0" + ] + }, + "4963": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0" + ] + }, + "4964": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "4965": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%0#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "4966": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0", + "maybe_exists%0#0" + ] + }, + "4968": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%0#0" + ] + }, + "4969": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "4970": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4971": { + "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%2#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%2#1" + ] + }, + "4973": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "aggregate%val_as_bytes%0#0" + ] + }, + "4974": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "4975": { + "op": "swap", + "stack_out": [ + "role_address#0", + "role_id#1", + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "4976": { + "op": "concat", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%5#0" + ] + }, + "4977": { + "op": "log", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4978": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "1" + ] + }, + "4979": { + "op": "return", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4980": { + "block": "rbac_revoke_role_after_if_else@3", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "4981": { + "op": "pushint 50", + "defined_out": [ + "50", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "50" + ] + }, + "4983": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%2#2" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%2#2" + ] + }, + "4984": { + "op": "bz rbac_revoke_role_after_if_else@5", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4987": { + "op": "bytec 22 // 0x523a50594423", + "defined_out": [ + "0x523a50594423", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x523a50594423" + ] + }, + "4989": { + "op": "dig 2", + "defined_out": [ + "0x523a50594423", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x523a50594423", + "role_address#0" + ] + }, + "4991": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%2#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0" + ] + }, + "4992": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%2#0", + "box_prefixed_key%2#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0", + "box_prefixed_key%2#0 (copy)" + ] + }, + "4993": { + "op": "box_len", + "defined_out": [ + "_%1#0", + "box_prefixed_key%2#0", + "maybe_exists%1#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0", + "_%1#0", + "maybe_exists%1#0" + ] + }, + "4994": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0", + "maybe_exists%1#0" + ] + }, + "4996": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%2#0" + ] + }, + "4997": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "4998": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "4999": { + "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" + }, + "5002": { + "block": "rbac_revoke_role_after_if_else@5", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "5003": { + "op": "pushint 60", + "defined_out": [ + "60", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "60" + ] + }, + "5005": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%3#0" + ] + }, + "5006": { + "op": "bz rbac_revoke_role_after_if_else@7", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "5009": { + "op": "bytec 26 // 0x523a54525323", + "defined_out": [ + "0x523a54525323", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x523a54525323" + ] + }, + "5011": { + "op": "dig 2", + "defined_out": [ + "0x523a54525323", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x523a54525323", + "role_address#0" + ] + }, + "5013": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%4#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0" + ] + }, + "5014": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%4#0", + "box_prefixed_key%4#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0", + "box_prefixed_key%4#0 (copy)" + ] + }, + "5015": { + "op": "box_len", + "defined_out": [ + "_%2#0", + "box_prefixed_key%4#0", + "maybe_exists%2#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0", + "_%2#0", + "maybe_exists%2#0" + ] + }, + "5016": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0", + "maybe_exists%2#0" + ] + }, + "5018": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%4#0" + ] + }, + "5019": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "5020": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "5021": { + "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" + }, + "5024": { + "block": "rbac_revoke_role_after_if_else@7", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "5025": { + "op": "pushint 70", + "defined_out": [ + "70", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "70" + ] + }, + "5027": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%4#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%4#1" + ] + }, + "5028": { + "op": "bz rbac_revoke_role_after_if_else@9", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "5031": { + "op": "bytec 21 // 0x523a41555423", + "defined_out": [ + "0x523a41555423", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x523a41555423" + ] + }, + "5033": { + "op": "dig 2", + "defined_out": [ + "0x523a41555423", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x523a41555423", + "role_address#0" + ] + }, + "5035": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%6#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0" + ] + }, + "5036": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%6#0", + "box_prefixed_key%6#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0", + "box_prefixed_key%6#0 (copy)" + ] + }, + "5037": { + "op": "box_len", + "defined_out": [ + "_%3#0", + "box_prefixed_key%6#0", + "maybe_exists%3#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0", + "_%3#0", + "maybe_exists%3#0" + ] + }, + "5038": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0", + "maybe_exists%3#0" + ] + }, + "5040": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%6#0" + ] + }, + "5041": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "5042": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "5043": { + "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" + }, + "5046": { + "block": "rbac_revoke_role_after_if_else@9", + "stack_in": [ + "role_address#0", + "role_id#1" + ], + "op": "dup", + "defined_out": [ + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1" + ] + }, + "5047": { + "op": "pushint 80", + "defined_out": [ + "80", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "role_id#1", + "80" + ] + }, + "5049": { + "op": "==", + "defined_out": [ + "role_id#1", + "tmp%5#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "tmp%5#1" + ] + }, + "5050": { + "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "5053": { + "op": "bytec 25 // 0x523a4d4f4323", + "defined_out": [ + "0x523a4d4f4323", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x523a4d4f4323" + ] + }, + "5055": { + "op": "dig 2", + "defined_out": [ + "0x523a4d4f4323", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "0x523a4d4f4323", + "role_address#0" + ] + }, + "5057": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%8#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0" + ] + }, + "5058": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%8#0", + "box_prefixed_key%8#0 (copy)", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0", + "box_prefixed_key%8#0 (copy)" + ] + }, + "5059": { + "op": "box_len", + "defined_out": [ + "_%4#0", + "box_prefixed_key%8#0", + "maybe_exists%4#0", + "role_address#0", + "role_id#1" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0", + "_%4#0", + "maybe_exists%4#0" + ] + }, + "5060": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0", + "maybe_exists%4#0" + ] + }, + "5062": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "role_id#1", + "box_prefixed_key%8#0" + ] + }, + "5063": { + "op": "box_del", + "defined_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ], + "stack_out": [ + "role_address#0", + "role_id#1", + "{box_del}" + ] + }, + "5064": { + "op": "pop", + "stack_out": [ + "role_address#0", + "role_id#1" + ] + }, + "5065": { + "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" + }, + "5068": { + "subroutine": "modules.rbac.RbacModule.rbac_contract_suspension[routing]", + "params": {}, + "block": "rbac_contract_suspension", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5071": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "5072": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0" + ] + }, + "5073": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0", + "1" + ] + }, + "5074": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "eq%0#0" + ] + }, + "5075": { + "error": "invalid number of bytes for arc4.bool", + "op": "assert // invalid number of bytes for arc4.bool", + "stack_out": [ + "tmp%0#0" + ] + }, + "5076": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0" + ] + }, + "5077": { + "op": "getbit", + "defined_out": [ + "suspended#0" + ], + "stack_out": [ + "suspended#0" + ] + }, + "5078": { + "op": "bytec 21 // 0x523a41555423", + "defined_out": [ + "0x523a41555423", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "0x523a41555423" + ] + }, + "5080": { + "op": "txn Sender", + "defined_out": [ + "0x523a41555423", + "suspended#0", + "tmp%0#2" + ], + "stack_out": [ + "suspended#0", + "0x523a41555423", + "tmp%0#2" + ] + }, + "5082": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "suspended#0", + "tmp%1#0" + ], + "stack_out": [ + "suspended#0", + "tmp%1#0" + ] + }, + "5085": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "suspended#0" + ] + }, + "5086": { + "op": "bytec 33 // \"contract_suspended\"", + "defined_out": [ + "\"contract_suspended\"", + "suspended#0" + ], + "stack_out": [ + "suspended#0", + "\"contract_suspended\"" + ] + }, + "5088": { + "op": "swap", + "stack_out": [ + "\"contract_suspended\"", + "suspended#0" + ] + }, + "5089": { + "op": "app_global_put", + "stack_out": [] + }, + "5090": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "5092": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "5093": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "5094": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "5095": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "5096": { + "op": "log", + "stack_out": [] + }, + "5097": { + "op": "intc_1 // 1", + "stack_out": [ + "1" + ] + }, + "5098": { + "op": "return", + "stack_out": [] + }, + "5099": { + "subroutine": "modules.rbac.RbacModule.rbac_contract_default[routing]", + "params": {}, + "block": "rbac_contract_default", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5102": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "5103": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0" + ] + }, + "5104": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0", + "1" + ] + }, + "5105": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "eq%0#0" + ] + }, + "5106": { + "error": "invalid number of bytes for arc4.bool", + "op": "assert // invalid number of bytes for arc4.bool", + "stack_out": [ + "tmp%0#0" + ] + }, + "5107": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0" + ] + }, + "5108": { + "op": "getbit", + "defined_out": [ + "defaulted#0" + ], + "stack_out": [ + "defaulted#0" + ] + }, + "5109": { + "op": "bytec 26 // 0x523a54525323", + "defined_out": [ + "0x523a54525323", + "defaulted#0" + ], + "stack_out": [ + "defaulted#0", + "0x523a54525323" + ] + }, + "5111": { + "op": "txn Sender", + "defined_out": [ + "0x523a54525323", + "defaulted#0", + "tmp%0#2" + ], + "stack_out": [ + "defaulted#0", + "0x523a54525323", + "tmp%0#2" + ] + }, + "5113": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "defaulted#0", + "tmp%1#0" + ], + "stack_out": [ + "defaulted#0", + "tmp%1#0" + ] + }, + "5116": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "defaulted#0" + ] + }, + "5117": { + "op": "bytec 34 // \"defaulted\"", + "defined_out": [ + "\"defaulted\"", + "defaulted#0" + ], + "stack_out": [ + "defaulted#0", + "\"defaulted\"" + ] + }, + "5119": { + "op": "swap", + "stack_out": [ + "\"defaulted\"", + "defaulted#0" + ] + }, + "5120": { + "op": "app_global_put", + "stack_out": [] + }, + "5121": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "5123": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "5124": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "5125": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "5126": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "5127": { + "op": "log", + "stack_out": [] + }, + "5128": { + "op": "intc_1 // 1", + "stack_out": [ + "1" + ] + }, + "5129": { + "op": "return", + "stack_out": [] + }, + "5130": { + "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", + "params": {}, + "block": "rbac_get_arranger", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5131": { + "op": "bytec 18 // 0x523a41525223", + "defined_out": [ + "0", + "0x523a41525223" + ], + "stack_out": [ + "0", + "0x523a41525223" + ] + }, + "5133": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5134": { + "error": "check self.arranger exists", + "op": "assert // check self.arranger exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5135": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0x151f7c75" + ] + }, + "5136": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "maybe_value%0#0" + ] + }, + "5137": { + "op": "concat", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "5138": { + "op": "log", + "stack_out": [] + }, + "5139": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "5140": { + "op": "return", + "stack_out": [] + }, + "5141": { + "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", + "params": {}, + "block": "rbac_get_address_roles", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "address#0" + ], + "stack_out": [ + "address#0" + ] + }, + "5144": { + "op": "dup", + "defined_out": [ + "address#0", + "address#0 (copy)" + ], + "stack_out": [ + "address#0", + "address#0 (copy)" + ] + }, + "5145": { + "op": "len", + "defined_out": [ + "address#0", + "len%0#0" + ], + "stack_out": [ + "address#0", + "len%0#0" + ] + }, + "5146": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "address#0", + "len%0#0" + ], + "stack_out": [ + "address#0", + "len%0#0", + "32" + ] + }, + "5147": { + "op": "==", + "defined_out": [ + "address#0", + "eq%0#0" + ], + "stack_out": [ + "address#0", + "eq%0#0" + ] + }, + "5148": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "address#0" + ] + }, + "5149": { + "op": "bytec 23 // 0x523a4d4e4723", + "defined_out": [ + "0x523a4d4e4723", + "address#0" + ], + "stack_out": [ + "address#0", + "0x523a4d4e4723" + ] + }, + "5151": { + "op": "dig 1", + "stack_out": [ + "address#0", + "0x523a4d4e4723", + "address#0 (copy)" + ] + }, + "5153": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "address#0", + "tmp%0#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1" + ] + }, + "5156": { + "op": "bytec 22 // 0x523a50594423", + "defined_out": [ + "0x523a50594423", + "address#0", + "tmp%0#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "0x523a50594423" + ] + }, + "5158": { + "op": "dig 2", + "stack_out": [ + "address#0", + "tmp%0#1", + "0x523a50594423", + "address#0 (copy)" + ] + }, + "5160": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1" + ] + }, + "5163": { + "op": "bytec 26 // 0x523a54525323", + "defined_out": [ + "0x523a54525323", + "address#0", + "tmp%0#1", + "tmp%1#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "0x523a54525323" + ] + }, + "5165": { + "op": "dig 3", + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "0x523a54525323", + "address#0 (copy)" + ] + }, + "5167": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1" + ] + }, + "5170": { + "op": "bytec 21 // 0x523a41555423", + "defined_out": [ + "0x523a41555423", + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "0x523a41555423" + ] + }, + "5172": { + "op": "dig 4", + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "0x523a41555423", + "address#0 (copy)" + ] + }, + "5174": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1" + ] + }, + "5177": { + "op": "bytec 25 // 0x523a4d4f4323", + "defined_out": [ + "0x523a4d4f4323", + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1" + ], + "stack_out": [ + "address#0", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "0x523a4d4f4323" + ] + }, + "5179": { + "op": "uncover 5", + "stack_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "0x523a4d4f4323", + "address#0" + ] + }, + "5181": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ] + }, + "5184": { + "op": "bytec 41 // 0x00", + "defined_out": [ + "0x00", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "0x00" + ] + }, + "5186": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "0x00", + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%0#1", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "0x00", + "0" + ] + }, + "5187": { + "op": "uncover 6", + "stack_out": [ + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "0x00", + "0", + "tmp%0#1" + ] + }, + "5189": { + "op": "setbit", + "defined_out": [ + "aggregate%encoded_bool%0#0", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%encoded_bool%0#0" + ] + }, + "5190": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "aggregate%encoded_bool%0#0", + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%1#1", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%encoded_bool%0#0", + "1" + ] + }, + "5191": { + "op": "uncover 5", + "stack_out": [ + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%encoded_bool%0#0", + "1", + "tmp%1#1" + ] + }, + "5193": { + "op": "setbit", + "defined_out": [ + "aggregate%set_bit%0#0", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%0#0" + ] + }, + "5194": { + "op": "pushint 2", + "defined_out": [ + "2", + "aggregate%set_bit%0#0", + "tmp%2#1", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%2#1", + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%0#0", + "2" + ] + }, + "5196": { + "op": "uncover 4", + "stack_out": [ + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%0#0", + "2", + "tmp%2#1" + ] + }, + "5198": { + "op": "setbit", + "defined_out": [ + "aggregate%set_bit%1#0", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%1#0" + ] + }, + "5199": { + "op": "pushint 3", + "defined_out": [ + "3", + "aggregate%set_bit%1#0", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "tmp%3#1", + "tmp%4#1", + "aggregate%set_bit%1#0", + "3" + ] + }, + "5201": { + "op": "uncover 3", + "stack_out": [ + "tmp%4#1", + "aggregate%set_bit%1#0", + "3", + "tmp%3#1" + ] + }, + "5203": { + "op": "setbit", + "defined_out": [ + "aggregate%set_bit%2#0", + "tmp%4#1" + ], + "stack_out": [ + "tmp%4#1", + "aggregate%set_bit%2#0" + ] + }, + "5204": { + "op": "pushint 4", + "defined_out": [ + "4", + "aggregate%set_bit%2#0", + "tmp%4#1" + ], + "stack_out": [ + "tmp%4#1", + "aggregate%set_bit%2#0", + "4" + ] + }, + "5206": { + "op": "uncover 2", + "stack_out": [ + "aggregate%set_bit%2#0", + "4", + "tmp%4#1" + ] + }, + "5208": { + "op": "setbit", + "defined_out": [ + "aggregate%set_bit%3#0" + ], + "stack_out": [ + "aggregate%set_bit%3#0" + ] + }, + "5209": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%set_bit%3#0" + ], + "stack_out": [ + "aggregate%set_bit%3#0", + "0x151f7c75" + ] + }, + "5210": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%set_bit%3#0" + ] + }, + "5211": { + "op": "concat", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "tmp%8#0" + ] + }, + "5212": { + "op": "log", + "stack_out": [] + }, + "5213": { + "op": "intc_1 // 1", + "stack_out": [ + "1" + ] + }, + "5214": { + "op": "return", + "stack_out": [] + }, + "5215": { + "subroutine": "modules.rbac.RbacModule.rbac_get_role_validity[routing]", + "params": {}, + "block": "rbac_get_role_validity", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "role_id#0" + ], + "stack_out": [ + "role_id#0" + ] + }, + "5218": { + "op": "dup", + "defined_out": [ + "role_id#0", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0", + "role_id#0 (copy)" + ] + }, + "5219": { + "op": "len", + "defined_out": [ + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0" + ] + }, + "5220": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "len%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "len%0#0", + "1" + ] + }, + "5221": { + "op": "==", + "defined_out": [ + "eq%0#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "eq%0#0" + ] + }, + "5222": { + "error": "invalid number of bytes for arc4.uint8", + "op": "assert // invalid number of bytes for arc4.uint8", + "stack_out": [ + "role_id#0" + ] + }, + "5223": { + "op": "txna ApplicationArgs 2" + }, + "5226": { + "op": "dup", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_id#0", + "role_address#0", + "role_address#0" + ] + }, + "5227": { + "op": "cover 2", + "defined_out": [ + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "role_address#0" + ] + }, + "5229": { + "op": "len", + "defined_out": [ + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0" + ] + }, + "5230": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "len%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "len%1#0", + "32" + ] + }, + "5231": { + "op": "==", + "defined_out": [ + "eq%1#0", + "role_address#0", + "role_id#0" + ], + "stack_out": [ + "role_address#0", + "role_id#0", + "eq%1#0" + ] + }, + "5232": { + "error": "invalid number of bytes for arc4.static_array", + "op": "assert // invalid number of bytes for arc4.static_array", + "stack_out": [ + "role_address#0", + "role_id#0" + ] + }, + "5233": { + "op": "btoi", + "defined_out": [ + "role#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "role#0" + ] + }, + "5234": { + "op": "dup", + "defined_out": [ + "role#0", + "role#0 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "role#0", + "role#0 (copy)" + ] + }, + "5235": { + "callsub": "modules.rbac.RbacModule._assert_valid_role", + "op": "callsub _assert_valid_role", + "stack_out": [ + "role_address#0", + "role#0" + ] + }, + "5238": { + "op": "pushints 20 40 50 60 70 80", + "defined_out": [ + "20", + "40", + "50", + "60", + "70", + "80", + "role#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "role#0", + "20", + "40", + "50", + "60", + "70", + "80" + ] + }, + "5246": { + "op": "uncover 6", + "stack_out": [ + "role_address#0", + "20", + "40", + "50", + "60", + "70", + "80", + "role#0" + ] + }, + "5248": { + "op": "match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7", + "stack_out": [ + "role_address#0" + ] + }, + "5262": { + "error": "Invalid role identifier", + "op": "err // Invalid role identifier" + }, + "5263": { + "block": "rbac_get_role_validity_switch_case_5@7", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 25 // 0x523a4d4f4323", + "defined_out": [ + "0x523a4d4f4323" + ], + "stack_out": [ + "role_address#0", + "0x523a4d4f4323" + ] + }, + "5265": { + "op": "dig 1", + "defined_out": [ + "0x523a4d4f4323", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x523a4d4f4323", + "role_address#0" + ] + }, + "5267": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5268": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5269": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5270": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5272": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5273": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%8#0", + "aggregate%box_get%9#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%8#0", + "aggregate%box_get%9#0" + ] + }, + "5274": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "5275": { + "block": "rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9", + "stack_in": [ + "role_address#0", + "tmp%3#0" + ], + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0", + "0x151f7c75" + ] + }, + "5276": { + "op": "swap", + "defined_out": [ + "0x151f7c75", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "0x151f7c75", + "tmp%3#0" + ] + }, + "5277": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "role_address#0", + "tmp%4#0" + ] + }, + "5278": { + "op": "log", + "stack_out": [ + "role_address#0" + ] + }, + "5279": { + "op": "intc_1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "role_address#0", + "1" + ] + }, + "5280": { + "op": "return", + "stack_out": [ + "role_address#0" + ] + }, + "5281": { + "block": "rbac_get_role_validity_switch_case_4@6", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 21 // 0x523a41555423", + "defined_out": [ + "0x523a41555423" + ], + "stack_out": [ + "role_address#0", + "0x523a41555423" + ] + }, + "5283": { + "op": "dig 1", + "defined_out": [ + "0x523a41555423", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x523a41555423", + "role_address#0" + ] + }, + "5285": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5286": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5287": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5288": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5290": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5291": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%6#0", + "aggregate%box_get%7#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%6#0", + "aggregate%box_get%7#0" + ] + }, + "5292": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "5293": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "5296": { + "block": "rbac_get_role_validity_switch_case_3@5", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 26 // 0x523a54525323", + "defined_out": [ + "0x523a54525323" + ], + "stack_out": [ + "role_address#0", + "0x523a54525323" + ] + }, + "5298": { + "op": "dig 1", + "defined_out": [ + "0x523a54525323", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x523a54525323", + "role_address#0" + ] + }, + "5300": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5301": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5302": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5303": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5305": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5306": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%4#0", + "aggregate%box_get%5#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%4#0", + "aggregate%box_get%5#0" + ] + }, + "5307": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "5308": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "5311": { + "block": "rbac_get_role_validity_switch_case_2@4", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 22 // 0x523a50594423", + "defined_out": [ + "0x523a50594423" + ], + "stack_out": [ + "role_address#0", + "0x523a50594423" + ] + }, + "5313": { + "op": "dig 1", + "defined_out": [ + "0x523a50594423", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x523a50594423", + "role_address#0" + ] + }, + "5315": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5316": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5317": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5318": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5320": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5321": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%2#0", + "aggregate%box_get%3#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%2#0", + "aggregate%box_get%3#0" + ] + }, + "5322": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "5323": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "5326": { + "block": "rbac_get_role_validity_switch_case_1@3", + "stack_in": [ + "role_address#0" + ], + "op": "bytec 23 // 0x523a4d4e4723", + "defined_out": [ + "0x523a4d4e4723" + ], + "stack_out": [ + "role_address#0", + "0x523a4d4e4723" + ] + }, + "5328": { + "op": "dig 1", + "defined_out": [ + "0x523a4d4e4723", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0x523a4d4e4723", + "role_address#0" + ] + }, + "5330": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5331": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5332": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5333": { + "op": "bury 1", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5335": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "role_address#0", + "box_prefixed_key%0#1" + ] + }, + "5336": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "5337": { + "op": "pop", + "defined_out": [ + "role_address#0", + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "5338": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "5341": { + "block": "rbac_get_role_validity_switch_case_0@2", + "stack_in": [ + "role_address#0" + ], + "op": "pushbytes 0x00000000000000000000000000000000", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "role_address#0", + "tmp%3#0" + ] + }, + "5359": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" + }, + "5362": { + "subroutine": "modules.accounting.AccountingModule._assert_is_not_account_suspended", + "params": { + "holding_address#0": "bytes" + }, + "block": "_assert_is_not_account_suspended", + "stack_in": [], + "op": "proto 1 0" + }, + "5365": { + "op": "bytec 8 // 0x4123", + "defined_out": [ + "0x4123" + ], + "stack_out": [ + "0x4123" + ] + }, + "5367": { + "op": "frame_dig -1", + "defined_out": [ + "0x4123", + "holding_address#0 (copy)" + ], + "stack_out": [ + "0x4123", + "holding_address#0 (copy)" + ] + }, + "5369": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0" + ] + }, + "5370": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ], + "stack_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "5371": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "aggregate%box_get%0#0" + ] + }, + "5372": { + "op": "pushint 384", + "defined_out": [ + "384", + "aggregate%box_get%0#0" + ], + "stack_out": [ + "aggregate%box_get%0#0", + "384" + ] + }, + "5375": { + "op": "getbit", + "defined_out": [ + "aggregate%get_bit%0#0" + ], + "stack_out": [ + "aggregate%get_bit%0#0" + ] + }, + "5376": { + "op": "!", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5377": { + "error": "Suspended operations", + "op": "assert // Suspended operations", + "stack_out": [] + }, + "5378": { + "retsub": true, + "op": "retsub" + }, + "5379": { + "subroutine": "modules.accounting.AccountingModule._settle_position", + "params": { + "holding_address#0": "bytes" + }, + "block": "_settle_position", + "stack_in": [], + "op": "proto 1 2" + }, + "5382": { + "op": "bytec 8 // 0x4123", + "defined_out": [ + "0x4123" + ], + "stack_out": [ + "0x4123" + ] + }, + "5384": { + "op": "frame_dig -1", + "defined_out": [ + "0x4123", + "holding_address#0 (copy)" + ], + "stack_out": [ + "0x4123", + "holding_address#0 (copy)" + ] + }, + "5386": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "box_prefixed_key%0#1" + ] + }, + "5387": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5388": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5389": { + "op": "bury 1", + "stack_out": [ + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5391": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "box_prefixed_key%0#1" + ] + }, + "5392": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#1", + "box_prefixed_key%0#1 (copy)" + ] + }, + "5393": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%1#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "aggregate%box_get%1#0" + ] + }, + "5394": { + "op": "pop", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0" + ] + }, + "5395": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "0" + ] + }, + "5396": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "defined_out": [ + "\"cumulative_interest_index\"", + "0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "0", + "\"cumulative_interest_index\"" + ] + }, + "5398": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "maybe_value%0#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5399": { + "error": "check self.cumulative_interest_index exists", + "op": "assert // check self.cumulative_interest_index exists", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "maybe_value%0#0" + ] + }, + "5400": { + "op": "dig 1", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_value%0#0", + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "maybe_value%0#0", + "position#0 (copy)" + ] + }, + "5402": { + "op": "pushint 57", + "defined_out": [ + "57", + "box_prefixed_key%0#1", + "maybe_value%0#0", + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "maybe_value%0#0", + "position#0 (copy)", + "57" + ] + }, + "5404": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_value%0#0", + "position#0", + "values%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "maybe_value%0#0", + "values%0#0" + ] + }, + "5405": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0" + ] + }, + "5406": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "0" + ] + }, + "5407": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "defined_out": [ + "\"cumulative_principal_index\"", + "0", + "box_prefixed_key%0#1", + "interest_delta#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "0", + "\"cumulative_principal_index\"" + ] + }, + "5409": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5410": { + "error": "check self.cumulative_principal_index exists", + "op": "assert // check self.cumulative_principal_index exists", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "maybe_value%1#0" + ] + }, + "5411": { + "op": "dig 2", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "maybe_value%1#0", + "position#0 (copy)" + ] + }, + "5413": { + "op": "pushint 65", + "defined_out": [ + "65", + "box_prefixed_key%0#1", + "interest_delta#0", + "maybe_value%1#0", + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "maybe_value%1#0", + "position#0 (copy)", + "65" + ] + }, + "5415": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "maybe_value%1#0", + "position#0", + "values%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "maybe_value%1#0", + "values%1#0" + ] + }, + "5416": { + "op": "-", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "position#0", + "principal_delta#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0" + ] + }, + "5417": { + "op": "dig 2", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "position#0 (copy)" + ] + }, + "5419": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "box_prefixed_key%0#1", + "interest_delta#0", + "position#0", + "position#0 (copy)", + "principal_delta#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "position#0 (copy)", + "32" + ] + }, + "5420": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "position#0", + "principal_delta#0", + "values%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "values%2#0" + ] + }, + "5421": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "values%2#0", + "0" + ] + }, + "5422": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "box_prefixed_key%0#1", + "interest_delta#0", + "position#0", + "principal_delta#0", + "values%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "values%2#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5424": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "maybe_exists%2#0", + "maybe_value%2#0", + "position#0", + "principal_delta#0", + "values%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "values%2#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "5425": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "interest_delta#0", + "principal_delta#0", + "values%2#0", + "maybe_value%2#0" + ] + }, + "5426": { + "op": "uncover 3", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "maybe_value%2#0", + "interest_delta#0" + ] + }, + "5428": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#1", + "interest_delta#0", + "maybe_value%2#0", + "position#0", + "principal_delta#0", + "values%2#0", + "values%2#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "maybe_value%2#0", + "interest_delta#0", + "values%2#0 (copy)" + ] + }, + "5430": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "interest_delta#0", + "values%2#0 (copy)", + "maybe_value%2#0" + ] + }, + "5432": { + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "position#0", + "principal_delta#0", + "values%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "claimable_interest#0" + ] + }, + "5435": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "claimable_interest#0", + "0" + ] + }, + "5436": { + "op": "bytec 5 // \"fixed_point_scale\"", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "claimable_interest#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5438": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "maybe_exists%3#0", + "maybe_value%3#0", + "position#0", + "principal_delta#0", + "values%2#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "claimable_interest#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "5439": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "principal_delta#0", + "values%2#0", + "claimable_interest#0", + "maybe_value%3#0" + ] + }, + "5440": { + "op": "uncover 3", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "values%2#0", + "claimable_interest#0", + "maybe_value%3#0", + "principal_delta#0" + ] + }, + "5442": { + "op": "uncover 3", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "maybe_value%3#0", + "principal_delta#0", + "values%2#0" + ] + }, + "5444": { + "op": "uncover 2", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "principal_delta#0", + "values%2#0", + "maybe_value%3#0" + ] + }, + "5446": { + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0" + ] + }, + "5449": { + "op": "dig 2", + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0", + "position#0 (copy)" + ] + }, + "5451": { + "op": "pushint 73", + "defined_out": [ + "73", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0", + "position#0 (copy)", + "73" + ] + }, + "5453": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "values%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0", + "values%4#0" + ] + }, + "5454": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_interest#0 (copy)", + "claimable_principal#0", + "position#0", + "values%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0", + "values%4#0", + "claimable_interest#0 (copy)" + ] + }, + "5456": { + "op": "+", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "tmp%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0", + "tmp%4#0" + ] + }, + "5457": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "position#0", + "claimable_interest#0", + "claimable_principal#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "5458": { + "op": "uncover 3", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "aggregate%val_as_bytes%0#0", + "position#0" + ] + }, + "5460": { + "op": "swap", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "5461": { + "op": "replace2 73", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ] + }, + "5463": { + "op": "dup", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "position#0 (copy)" + ] + }, + "5464": { + "op": "pushint 81", + "defined_out": [ + "81", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "position#0 (copy)", + "81" + ] + }, + "5466": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "values%5#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "values%5#0" + ] + }, + "5467": { + "op": "dig 2", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "claimable_principal#0 (copy)", + "position#0", + "values%5#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "values%5#0", + "claimable_principal#0 (copy)" + ] + }, + "5469": { + "op": "+", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "tmp%5#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "tmp%5#0" + ] + }, + "5470": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%1#0", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "5471": { + "op": "replace2 81", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ] + }, + "5473": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "0" + ] + }, + "5474": { + "op": "bytec 16 // \"cumulative_interest_index\"", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "0", + "\"cumulative_interest_index\"" + ] + }, + "5476": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "maybe_exists%4#0", + "maybe_value%4#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "5477": { + "error": "check self.cumulative_interest_index exists", + "op": "assert // check self.cumulative_interest_index exists", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "maybe_value%4#0" + ] + }, + "5478": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%2#0", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "aggregate%val_as_bytes%2#0" + ] + }, + "5479": { + "op": "replace2 57", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ] + }, + "5481": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "0" + ] + }, + "5482": { + "op": "bytec 17 // \"cumulative_principal_index\"", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "0", + "\"cumulative_principal_index\"" + ] + }, + "5484": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "maybe_exists%5#0", + "maybe_value%5#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "5485": { + "error": "check self.cumulative_principal_index exists", + "op": "assert // check self.cumulative_principal_index exists", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "maybe_value%5#0" + ] + }, + "5486": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%3#0", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "aggregate%val_as_bytes%3#0" + ] + }, + "5487": { + "op": "replace2 65", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ] + }, + "5489": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "0" + ] + }, + "5490": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "0", + "\"event_cursor\"" + ] + }, + "5491": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "maybe_exists%6#0", + "maybe_value%6#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "maybe_value%6#0", + "maybe_exists%6#0" + ] + }, + "5492": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "maybe_value%6#0" + ] + }, + "5493": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%4#0", + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ], + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "aggregate%val_as_bytes%4#0" + ] + }, + "5494": { + "op": "replace2 49", + "stack_out": [ + "box_prefixed_key%0#1", + "claimable_interest#0", + "claimable_principal#0", + "position#0" + ] + }, + "5496": { + "op": "uncover 3", + "stack_out": [ + "claimable_interest#0", + "claimable_principal#0", + "position#0", + "box_prefixed_key%0#1" + ] + }, + "5498": { + "op": "swap", + "stack_out": [ + "claimable_interest#0", + "claimable_principal#0", + "box_prefixed_key%0#1", + "position#0" + ] + }, + "5499": { + "op": "box_put", + "stack_out": [ + "claimable_interest#0", + "claimable_principal#0" + ] + }, + "5500": { + "retsub": true, + "op": "retsub" + }, + "5501": { + "subroutine": "modules.accounting.AccountingModule._ensure_units_activated", + "params": { + "holding_address#0": "bytes" + }, + "block": "_ensure_units_activated", + "stack_in": [], + "op": "proto 1 0" + }, + "5504": { + "op": "intc_0 // 0", + "stack_out": [ + "position#0" + ] + }, + "5505": { + "op": "pushbytes \"\"", + "stack_out": [ + "position#0", + "activated_units#0" + ] + }, + "5507": { + "op": "bytec 8 // 0x4123", + "defined_out": [ + "0x4123" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "0x4123" + ] + }, + "5509": { + "op": "frame_dig -1", + "defined_out": [ + "0x4123", + "holding_address#0 (copy)" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "0x4123", + "holding_address#0 (copy)" + ] + }, + "5511": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ] + }, + "5512": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "5513": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "5514": { + "op": "bury 1", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "5516": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ] + }, + "5517": { + "op": "intc_0 // 0", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "0" + ] + }, + "5518": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "0", + "\"status\"" + ] + }, + "5519": { + "op": "app_global_get_ex", + "defined_out": [ + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5520": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_value%0#0" + ] + }, + "5521": { + "op": "pushint 50", + "defined_out": [ + "50", + "box_prefixed_key%0#1", + "maybe_value%0#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_value%0#0", + "50" + ] + }, + "5523": { + "op": "==", + "defined_out": [ + "box_prefixed_key%0#1", + "tmp%0#1" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "tmp%0#1" + ] + }, + "5524": { + "op": "bz _ensure_units_activated_after_if_else@2", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ] + }, + "5527": { + "retsub": true, + "op": "retsub" + }, + "5528": { + "block": "_ensure_units_activated_after_if_else@2", + "stack_in": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ], + "op": "frame_dig 2", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "5530": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%1#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "aggregate%box_get%1#0" + ] + }, + "5531": { + "op": "swap", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "aggregate%box_get%1#0", + "position#0" + ] + }, + "5532": { + "op": "dup", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "aggregate%box_get%1#0", + "position#0", + "position#0 (copy)" + ] + }, + "5533": { + "op": "cover 2", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "aggregate%box_get%1#0", + "position#0" + ] + }, + "5535": { + "op": "frame_bury 0", + "defined_out": [ + "aggregate%box_get%1#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "aggregate%box_get%1#0" + ] + }, + "5537": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ] + }, + "5538": { + "op": "pushint 40", + "defined_out": [ + "40", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "40" + ] + }, + "5540": { + "op": "extract_uint64", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0" + ] + }, + "5541": { + "op": "dup", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "activated_units#0" + ] + }, + "5542": { + "op": "frame_bury 1", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0" + ] + }, + "5544": { + "op": "bnz _ensure_units_activated_after_if_else@4", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ] + }, + "5547": { + "retsub": true, + "op": "retsub" + }, + "5548": { + "block": "_ensure_units_activated_after_if_else@4", + "stack_in": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ], + "op": "frame_dig 0", + "defined_out": [ + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ] + }, + "5550": { + "op": "dup", + "defined_out": [ + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "position#0 (copy)" + ] + }, + "5551": { + "op": "intc_3 // 32", + "defined_out": [ + "32", + "position#0", + "position#0 (copy)" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "position#0 (copy)", + "32" + ] + }, + "5552": { + "op": "extract_uint64", + "defined_out": [ + "position#0", + "values%2#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "values%2#0" + ] + }, + "5553": { + "op": "frame_dig 1", + "defined_out": [ + "activated_units#0", + "position#0", + "values%2#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "values%2#0", + "activated_units#0" + ] + }, + "5555": { + "op": "dup", + "defined_out": [ + "activated_units#0", + "activated_units#0 (copy)", + "position#0", + "values%2#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "values%2#0", + "activated_units#0 (copy)", + "activated_units#0 (copy)" + ] + }, + "5556": { + "op": "cover 3", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0", + "values%2#0", + "activated_units#0 (copy)" + ] + }, + "5558": { + "op": "+", + "defined_out": [ + "activated_units#0", + "position#0", + "tmp%2#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0", + "tmp%2#0" + ] + }, + "5559": { + "op": "itob", + "defined_out": [ + "activated_units#0", + "aggregate%val_as_bytes%0#0", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "5560": { + "op": "replace2 32", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0" + ] + }, + "5562": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "activated_units#0", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0", + "0" + ] + }, + "5563": { + "op": "itob", + "defined_out": [ + "activated_units#0", + "aggregate%val_as_bytes%1#0", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "5564": { + "op": "replace2 40", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0" + ] + }, + "5566": { + "op": "frame_dig 2", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "position#0", + "box_prefixed_key%0#1" + ] + }, + "5568": { + "op": "swap", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ] + }, + "5569": { + "op": "box_put", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0" + ] + }, + "5570": { + "op": "intc_0 // 0", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "0" + ] + }, + "5571": { + "op": "bytec 11 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"", + "0", + "activated_units#0", + "box_prefixed_key%0#1", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "0", + "\"reserved_units_total\"" + ] + }, + "5573": { + "op": "app_global_get_ex", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0", + "maybe_value%0#0", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5574": { + "error": "check self.reserved_units_total exists", + "op": "assert // check self.reserved_units_total exists", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "maybe_value%0#0" + ] + }, + "5575": { + "op": "dup", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "position#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)" + ] + }, + "5576": { + "op": "dig 2", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "activated_units#0 (copy)" + ] + }, + "5578": { + "op": ">=", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_value%0#0", + "position#0", + "tmp%3#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "maybe_value%0#0", + "tmp%3#0" + ] + }, + "5579": { + "error": "Insufficient remaining D-ASA units", + "op": "assert // Insufficient remaining D-ASA units", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "activated_units#0", + "maybe_value%0#0" + ] + }, + "5580": { + "op": "swap", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "maybe_value%0#0", + "activated_units#0" + ] + }, + "5581": { + "op": "-", + "defined_out": [ + "activated_units#0", + "box_prefixed_key%0#1", + "position#0", + "tmp%4#0" + ], + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "tmp%4#0" + ] + }, + "5582": { + "op": "bytec 11 // \"reserved_units_total\"", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "tmp%4#0", + "\"reserved_units_total\"" + ] + }, + "5584": { + "op": "swap", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1", + "\"reserved_units_total\"", + "tmp%4#0" + ] + }, + "5585": { + "op": "app_global_put", + "stack_out": [ + "position#0", + "activated_units#0", + "box_prefixed_key%0#1" + ] + }, + "5586": { + "retsub": true, + "op": "retsub" + }, + "5587": { + "subroutine": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", + "params": { + "multiplicand#0": "uint64", + "multiplier#0": "uint64", + "divisor#0": "uint64" + }, + "block": "_scaled_mul_div", + "stack_in": [], + "op": "proto 3 1" + }, + "5590": { + "op": "frame_dig -3", + "defined_out": [ + "multiplicand#0 (copy)" + ], + "stack_out": [ + "multiplicand#0 (copy)" + ] + }, + "5592": { + "op": "bz _scaled_mul_div_if_body@2", + "stack_out": [] + }, + "5595": { + "op": "frame_dig -2", + "defined_out": [ + "multiplier#0 (copy)" + ], + "stack_out": [ + "multiplier#0 (copy)" + ] + }, + "5597": { + "op": "bnz _scaled_mul_div_after_if_else@3", + "stack_out": [] + }, + "5600": { + "block": "_scaled_mul_div_if_body@2", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5601": { + "retsub": true, + "op": "retsub" + }, + "5602": { + "block": "_scaled_mul_div_after_if_else@3", + "stack_in": [], + "op": "frame_dig -3", + "defined_out": [ + "multiplicand#0 (copy)" + ], + "stack_out": [ + "multiplicand#0 (copy)" + ] + }, + "5604": { + "op": "frame_dig -2", + "defined_out": [ + "multiplicand#0 (copy)", + "multiplier#0 (copy)" + ], + "stack_out": [ + "multiplicand#0 (copy)", + "multiplier#0 (copy)" + ] + }, + "5606": { + "op": "mulw", + "defined_out": [ + "high#0", + "low#0" + ], + "stack_out": [ + "high#0", + "low#0" + ] + }, + "5607": { + "op": "frame_dig -1", + "defined_out": [ + "divisor#0 (copy)", + "high#0", + "low#0" + ], + "stack_out": [ + "high#0", + "low#0", + "divisor#0 (copy)" + ] + }, + "5609": { + "op": "divw", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "5610": { + "retsub": true, + "op": "retsub" + }, + "5611": { + "subroutine": "modules.actus_kernel.ActusKernelModule._amount_to_index_delta", + "params": { + "amount#0": "uint64" + }, + "block": "_amount_to_index_delta", + "stack_in": [], + "op": "proto 1 1" + }, + "5614": { + "op": "frame_dig -1", + "defined_out": [ + "amount#0 (copy)" + ], + "stack_out": [ + "amount#0 (copy)" + ] + }, + "5616": { + "op": "bnz _amount_to_index_delta_after_if_else@2", + "stack_out": [] + }, + "5619": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5620": { + "retsub": true, + "op": "retsub" + }, + "5621": { + "block": "_amount_to_index_delta_after_if_else@2", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5622": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0" + ], + "stack_out": [ + "0", + "\"total_units\"" + ] + }, + "5624": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5625": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5626": { + "op": "dup", + "defined_out": [ + "maybe_value%0#0", + "maybe_value%0#0 (copy)" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%0#0 (copy)" + ] + }, + "5627": { + "error": "No D-ASA units", + "op": "assert // No D-ASA units", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5628": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#0", + "0" + ] + }, + "5629": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5631": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5632": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "5633": { + "op": "frame_dig -1", + "defined_out": [ + "amount#0 (copy)", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "amount#0 (copy)" + ] + }, + "5635": { + "op": "swap", + "stack_out": [ + "maybe_value%0#0", + "amount#0 (copy)", + "maybe_value%1#0" + ] + }, + "5636": { + "op": "uncover 2", + "stack_out": [ + "amount#0 (copy)", + "maybe_value%1#0", + "maybe_value%0#0" + ] + }, + "5638": { + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "5641": { + "retsub": true, + "op": "retsub" + }, + "5642": { + "subroutine": "modules.actus_kernel.ActusKernelModule._index_delta_to_amount", + "params": { + "index_delta#0": "uint64" + }, + "block": "_index_delta_to_amount", + "stack_in": [], + "op": "proto 1 1" + }, + "5645": { + "op": "frame_dig -1", + "defined_out": [ + "index_delta#0 (copy)" + ], + "stack_out": [ + "index_delta#0 (copy)" + ] + }, + "5647": { + "op": "bnz _index_delta_to_amount_after_if_else@2", + "stack_out": [] + }, + "5650": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5651": { + "retsub": true, + "op": "retsub" + }, + "5652": { + "block": "_index_delta_to_amount_after_if_else@2", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5653": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0" + ], + "stack_out": [ + "0", + "\"total_units\"" + ] + }, + "5655": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5656": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5657": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#0", + "0" + ] + }, + "5658": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5660": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5661": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "5662": { + "op": "frame_dig -1" + }, + "5664": { + "op": "swap", + "defined_out": [ + "index_delta#0 (copy)", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "index_delta#0 (copy)", + "maybe_value%1#0" + ] + }, + "5665": { + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "5668": { + "retsub": true, + "op": "retsub" + }, + "5669": { + "subroutine": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", + "params": { + "event_id#0": "uint64" + }, + "block": "_get_schedule_entry", + "stack_in": [], + "op": "proto 1 1" + }, + "5672": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5673": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0" + ], + "stack_out": [ + "0", + "\"schedule_entry_count\"" + ] + }, + "5674": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5675": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5676": { + "op": "frame_dig -1", + "defined_out": [ + "event_id#0 (copy)", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "event_id#0 (copy)" + ] + }, + "5678": { + "op": ">", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5679": { + "error": "Invalid event id", + "op": "assert // Invalid event id", + "stack_out": [] + }, + "5680": { + "op": "frame_dig -1", + "stack_out": [ + "event_id#0 (copy)" + ] + }, + "5682": { + "op": "pushint 16", + "defined_out": [ + "16", + "event_id#0 (copy)" + ], + "stack_out": [ + "event_id#0 (copy)", + "16" + ] + }, + "5684": { + "op": "/", + "defined_out": [ + "page_index#0" + ], + "stack_out": [ + "page_index#0" + ] + }, + "5685": { + "op": "itob", + "defined_out": [ + "encoded_value%0#0" + ], + "stack_out": [ + "encoded_value%0#0" + ] + }, + "5686": { + "op": "bytec 24 // 0x5323", + "defined_out": [ + "0x5323", + "encoded_value%0#0" + ], + "stack_out": [ + "encoded_value%0#0", + "0x5323" + ] + }, + "5688": { + "op": "swap", + "stack_out": [ + "0x5323", + "encoded_value%0#0" + ] + }, + "5689": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0" + ] + }, + "5690": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "5691": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#0", + "maybe_exists%1#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "_%0#0", + "maybe_exists%1#0" + ] + }, + "5692": { + "op": "bury 1", + "stack_out": [ + "box_prefixed_key%0#0", + "maybe_exists%1#0" + ] + }, + "5694": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "box_prefixed_key%0#0" + ] + }, + "5695": { + "op": "frame_dig -1", + "stack_out": [ + "box_prefixed_key%0#0", + "event_id#0 (copy)" + ] + }, + "5697": { + "op": "pushint 16", + "stack_out": [ + "box_prefixed_key%0#0", + "event_id#0 (copy)", + "16" + ] + }, + "5699": { + "op": "%", + "defined_out": [ + "box_prefixed_key%0#0", + "offset#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0" + ] + }, + "5700": { + "op": "dig 1", + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "box_prefixed_key%0#0 (copy)" + ] + }, + "5702": { + "op": "intc_0 // 0", + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "box_prefixed_key%0#0 (copy)", + "0" + ] + }, + "5703": { + "op": "pushint 2", + "defined_out": [ + "0", + "2", + "box_prefixed_key%0#0", + "box_prefixed_key%0#0 (copy)", + "offset#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "box_prefixed_key%0#0 (copy)", + "0", + "2" + ] + }, + "5705": { + "op": "box_extract", + "defined_out": [ + "box%box_extract%0#0", + "box_prefixed_key%0#0", + "offset#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "box%box_extract%0#0" + ] + }, + "5706": { + "op": "btoi", + "defined_out": [ + "box%array_length%0#0", + "box_prefixed_key%0#0", + "offset#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "box%array_length%0#0" + ] + }, + "5707": { + "op": "dig 1", + "defined_out": [ + "box%array_length%0#0", + "box_prefixed_key%0#0", + "offset#0", + "offset#0 (copy)" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "box%array_length%0#0", + "offset#0 (copy)" + ] + }, + "5709": { + "op": ">", + "defined_out": [ + "box_prefixed_key%0#0", + "offset#0", + "tmp%4#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "tmp%4#0" + ] + }, + "5710": { + "error": "Invalid schedule page", + "op": "assert // Invalid schedule page", + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0" + ] + }, + "5711": { + "op": "pushint 65", + "defined_out": [ + "65", + "box_prefixed_key%0#0", + "offset#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "offset#0", + "65" + ] + }, + "5713": { + "op": "*", + "defined_out": [ + "box%element_offset%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "box%element_offset%0#0" + ] + }, + "5714": { + "op": "pushint 2", + "stack_out": [ + "box_prefixed_key%0#0", + "box%element_offset%0#0", + "2" + ] + }, + "5716": { + "op": "+", + "defined_out": [ + "box%offset%0#0", + "box_prefixed_key%0#0" + ], + "stack_out": [ + "box_prefixed_key%0#0", + "box%offset%0#0" + ] + }, + "5717": { + "op": "pushint 65", + "stack_out": [ + "box_prefixed_key%0#0", + "box%offset%0#0", + "65" + ] + }, + "5719": { + "op": "box_extract", + "defined_out": [ + "box%box_extract%1#0" + ], + "stack_out": [ + "box%box_extract%1#0" + ] + }, + "5720": { + "retsub": true, + "op": "retsub" + }, + "5721": { + "subroutine": "modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type", + "params": { + "contract_type#0": "uint64", + "event_type#0": "uint64" + }, + "block": "_assert_event_allowed_for_contract_type", + "stack_in": [], + "op": "proto 2 0" + }, + "5724": { + "op": "frame_dig -1", + "defined_out": [ + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5726": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "1" + ] + }, + "5727": { + "op": "==", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5728": { + "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", + "stack_out": [] + }, + "5731": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5733": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "8" + ] + }, + "5734": { + "op": "==", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "5735": { + "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", + "stack_out": [] + }, + "5738": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5740": { + "op": "pushint 19", + "defined_out": [ + "19", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "19" + ] + }, + "5742": { + "op": "==", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "5743": { + "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", + "stack_out": [] + }, + "5746": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5748": { + "op": "pushint 12", + "defined_out": [ + "12", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "12" + ] + }, + "5750": { + "op": "==", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0" + ] + }, + "5751": { + "op": "bnz _assert_event_allowed_for_contract_type_if_body@6", + "stack_out": [] + }, + "5754": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5756": { + "op": "pushint 11", + "defined_out": [ + "11", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "11" + ] + }, + "5758": { + "op": "==", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "5759": { + "op": "bz _assert_event_allowed_for_contract_type_after_if_else@7", + "stack_out": [] + }, + "5762": { + "block": "_assert_event_allowed_for_contract_type_if_body@6", + "stack_in": [], + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5763": { + "error": "Invalid ACTUS configuration", + "block": "_assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "stack_in": [ + "tmp%0#0" + ], + "op": "assert // Invalid ACTUS configuration", + "defined_out": [], + "stack_out": [] + }, + "5764": { + "retsub": true, + "op": "retsub" + }, + "5765": { + "block": "_assert_event_allowed_for_contract_type_after_if_else@7", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)" + ] + }, + "5767": { + "op": "bnz _assert_event_allowed_for_contract_type_after_if_else@9", + "stack_out": [] + }, + "5770": { + "op": "intc_0 // 0", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5771": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" + }, + "5774": { + "block": "_assert_event_allowed_for_contract_type_after_if_else@9", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)" + ] + }, + "5776": { + "op": "pushint 3", + "defined_out": [ + "3", + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)", + "3" + ] + }, + "5778": { + "op": "==", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "5779": { + "op": "bnz _assert_event_allowed_for_contract_type_if_body@11", + "stack_out": [] + }, + "5782": { + "op": "frame_dig -2", + "stack_out": [ + "contract_type#0 (copy)" + ] + }, + "5784": { + "op": "pushint 2", + "defined_out": [ + "2", + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)", + "2" + ] + }, + "5786": { + "op": "==", + "defined_out": [ + "tmp%7#0" + ], + "stack_out": [ + "tmp%7#0" + ] + }, + "5787": { + "op": "bz _assert_event_allowed_for_contract_type_after_if_else@16", + "stack_out": [] + }, + "5790": { + "block": "_assert_event_allowed_for_contract_type_if_body@11", + "stack_in": [], + "op": "frame_dig -1", + "defined_out": [ + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5792": { + "op": "pushint 3", + "defined_out": [ + "3", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "3" + ] + }, + "5794": { + "op": "==", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "tmp%8#0" + ] + }, + "5795": { + "op": "bnz _assert_event_allowed_for_contract_type_bool_true@13", + "stack_out": [] + }, + "5798": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5800": { + "op": "pushint 18", + "defined_out": [ + "18", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "18" + ] + }, + "5802": { + "op": "==", + "defined_out": [ + "tmp%9#0" + ], + "stack_out": [ + "tmp%9#0" + ] + }, + "5803": { + "op": "bz _assert_event_allowed_for_contract_type_bool_false@14", + "stack_out": [] + }, + "5806": { + "block": "_assert_event_allowed_for_contract_type_bool_true@13", + "stack_in": [], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "or_result%0#0" + ] + }, + "5807": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5810": { + "block": "_assert_event_allowed_for_contract_type_bool_false@14", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "or_result%0#0" + ] + }, + "5811": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5814": { + "block": "_assert_event_allowed_for_contract_type_after_if_else@16", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)" + ] + }, + "5816": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)", + "1" + ] + }, + "5817": { + "op": "==", + "defined_out": [ + "tmp%10#0" + ], + "stack_out": [ + "tmp%10#0" + ] + }, + "5818": { + "op": "bz _assert_event_allowed_for_contract_type_after_if_else@23", + "stack_out": [] + }, + "5821": { + "op": "frame_dig -1", + "defined_out": [ + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5823": { + "op": "pushint 3", + "defined_out": [ + "3", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "3" + ] + }, + "5825": { + "op": "==", + "defined_out": [ + "tmp%11#0" + ], + "stack_out": [ + "tmp%11#0" + ] + }, + "5826": { + "op": "bnz _assert_event_allowed_for_contract_type_bool_true@20", + "stack_out": [] + }, + "5829": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5831": { + "op": "pushint 18", + "defined_out": [ + "18", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "18" + ] + }, + "5833": { + "op": "==", + "defined_out": [ + "tmp%12#0" + ], + "stack_out": [ + "tmp%12#0" + ] + }, + "5834": { + "op": "bnz _assert_event_allowed_for_contract_type_bool_true@20", + "stack_out": [] + }, + "5837": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5839": { + "op": "pushint 5", + "defined_out": [ + "5", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "5" + ] + }, + "5841": { + "op": "==", + "defined_out": [ + "tmp%13#0" + ], + "stack_out": [ + "tmp%13#0" + ] + }, + "5842": { + "op": "bz _assert_event_allowed_for_contract_type_bool_false@21", + "stack_out": [] + }, + "5845": { + "block": "_assert_event_allowed_for_contract_type_bool_true@20", + "stack_in": [], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%1#0" + ], + "stack_out": [ + "or_result%1#0" + ] + }, + "5846": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5849": { + "block": "_assert_event_allowed_for_contract_type_bool_false@21", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%1#0" + ], + "stack_out": [ + "or_result%1#0" + ] + }, + "5850": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5853": { + "block": "_assert_event_allowed_for_contract_type_after_if_else@23", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)" + ] + }, + "5855": { + "op": "pushint 4", + "defined_out": [ + "4", + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)", + "4" + ] + }, + "5857": { + "op": "==", + "defined_out": [ + "tmp%14#0" + ], + "stack_out": [ + "tmp%14#0" + ] + }, + "5858": { + "op": "bz _assert_event_allowed_for_contract_type_after_if_else@31", + "stack_out": [] + }, + "5861": { + "op": "frame_dig -1", + "defined_out": [ + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5863": { + "op": "pushint 3", + "defined_out": [ + "3", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "3" + ] + }, + "5865": { + "op": "==", + "defined_out": [ + "tmp%15#0" + ], + "stack_out": [ + "tmp%15#0" + ] + }, + "5866": { + "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", + "stack_out": [] + }, + "5869": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5871": { + "op": "pushint 4", + "stack_out": [ + "event_type#0 (copy)", + "4" + ] + }, + "5873": { + "op": "==", + "defined_out": [ + "tmp%16#0" + ], + "stack_out": [ + "tmp%16#0" + ] + }, + "5874": { + "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", + "stack_out": [] + }, + "5877": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5879": { + "op": "pushint 18", + "defined_out": [ + "18", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "18" + ] + }, + "5881": { + "op": "==", + "defined_out": [ + "tmp%17#0" + ], + "stack_out": [ + "tmp%17#0" + ] + }, + "5882": { + "op": "bnz _assert_event_allowed_for_contract_type_bool_true@28", + "stack_out": [] + }, + "5885": { + "op": "frame_dig -1", + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5887": { + "op": "pushint 5", + "defined_out": [ + "5", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "5" + ] + }, + "5889": { + "op": "==", + "defined_out": [ + "tmp%18#0" + ], + "stack_out": [ + "tmp%18#0" + ] + }, + "5890": { + "op": "bz _assert_event_allowed_for_contract_type_bool_false@29", + "stack_out": [] + }, + "5893": { + "block": "_assert_event_allowed_for_contract_type_bool_true@28", + "stack_in": [], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%2#0" + ], + "stack_out": [ + "or_result%2#0" + ] + }, + "5894": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5897": { + "block": "_assert_event_allowed_for_contract_type_bool_false@29", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%2#0" + ], + "stack_out": [ + "or_result%2#0" + ] + }, + "5898": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5901": { + "block": "_assert_event_allowed_for_contract_type_after_if_else@31", + "stack_in": [], + "op": "frame_dig -2", + "defined_out": [ + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)" + ] + }, + "5903": { + "op": "pushint 5", + "defined_out": [ + "5", + "contract_type#0 (copy)" + ], + "stack_out": [ + "contract_type#0 (copy)", + "5" + ] + }, + "5905": { + "op": "==", + "defined_out": [ + "tmp%19#0" + ], + "stack_out": [ + "tmp%19#0" + ] + }, + "5906": { + "op": "bz _assert_event_allowed_for_contract_type_after_if_else@33", + "stack_out": [] + }, + "5909": { + "op": "frame_dig -1", + "defined_out": [ + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)" + ] + }, + "5911": { + "op": "pushint 3", + "defined_out": [ + "3", + "event_type#0 (copy)" + ], + "stack_out": [ + "event_type#0 (copy)", + "3" + ] + }, + "5913": { + "op": "==", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5914": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" + }, + "5917": { + "block": "_assert_event_allowed_for_contract_type_after_if_else@33", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5918": { + "op": "b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34" + }, + "5921": { + "subroutine": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", + "params": {}, + "block": "_is_dynamic_annuity", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "5922": { + "op": "bytec 10 // \"contract_type\"", + "defined_out": [ + "\"contract_type\"", + "0" + ], + "stack_out": [ + "0", + "\"contract_type\"" + ] + }, + "5924": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5925": { + "error": "check self.contract_type exists", + "op": "assert // check self.contract_type exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "5926": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "1" + ] + }, + "5927": { + "op": "==", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "5928": { + "op": "bz _is_dynamic_annuity_bool_false@3", + "stack_out": [] + }, + "5931": { + "op": "intc_0 // 0", + "stack_out": [ + "0" + ] + }, + "5932": { + "op": "bytec 35 // \"dynamic_principal_redemption\"", + "defined_out": [ + "\"dynamic_principal_redemption\"", + "0" + ], + "stack_out": [ + "0", + "\"dynamic_principal_redemption\"" + ] + }, + "5934": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5935": { + "error": "check self.dynamic_principal_redemption exists", + "op": "assert // check self.dynamic_principal_redemption exists", + "stack_out": [ + "maybe_value%1#0" + ] + }, + "5936": { + "op": "bz _is_dynamic_annuity_bool_false@3", + "stack_out": [] + }, + "5939": { + "op": "intc_1 // 1", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "and_result%0#0" + ] + }, + "5940": { + "retsub": true, + "op": "retsub" + }, + "5941": { + "block": "_is_dynamic_annuity_bool_false@3", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "and_result%0#0" + ] + }, + "5942": { + "retsub": true, + "op": "retsub" + }, + "5943": { + "subroutine": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", + "params": { + "entry#0": "bytes" + }, + "block": "_entry_interest_segment", + "stack_in": [], + "op": "proto 1 2" + }, + "5946": { + "op": "frame_dig -1", + "defined_out": [ + "entry#0 (copy)" + ], + "stack_out": [ + "entry#0 (copy)" + ] + }, + "5948": { + "op": "pushint 17", + "defined_out": [ + "17", + "entry#0 (copy)" + ], + "stack_out": [ + "entry#0 (copy)", + "17" + ] + }, + "5950": { + "op": "extract_uint64", + "defined_out": [ + "values%0#0" + ], + "stack_out": [ + "values%0#0" + ] + }, + "5951": { + "op": "dup", + "defined_out": [ + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "values%0#0" + ] + }, + "5952": { + "op": "bz _entry_interest_segment_if_body@3", + "stack_out": [ + "values%0#0" + ] + }, + "5955": { + "op": "intc_0 // 0", + "stack_out": [ + "values%0#0", + "0" + ] + }, + "5956": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "0", + "\"nominal_interest_rate\"" + ] + }, + "5958": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "5959": { + "error": "check self.nominal_interest_rate exists", + "op": "assert // check self.nominal_interest_rate exists", + "stack_out": [ + "values%0#0", + "maybe_value%0#0" + ] + }, + "5960": { + "op": "bz _entry_interest_segment_if_body@3", + "stack_out": [ + "values%0#0" + ] + }, + "5963": { + "op": "intc_0 // 0", + "stack_out": [ + "values%0#0", + "0" + ] + }, + "5964": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "0", + "\"interest_calculation_base\"" + ] + }, + "5966": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "5967": { + "error": "check self.interest_calculation_base exists", + "op": "assert // check self.interest_calculation_base exists", + "stack_out": [ + "values%0#0", + "maybe_value%1#0" + ] + }, + "5968": { + "op": "bnz _entry_interest_segment_after_if_else@4", + "stack_out": [ + "values%0#0" + ] + }, + "5971": { + "block": "_entry_interest_segment_if_body@3", + "stack_in": [ + "values%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "values%0#0", + "0" + ] + }, + "5972": { + "op": "frame_dig -1", + "defined_out": [ + "0", + "entry#0 (copy)" + ], + "stack_out": [ + "values%0#0", + "0", + "entry#0 (copy)" + ] + }, + "5974": { + "op": "uncover 2" + }, + "5976": { + "retsub": true, + "op": "retsub" + }, + "5977": { + "block": "_entry_interest_segment_after_if_else@4", + "stack_in": [ + "values%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "values%0#0", + "0" + ] + }, + "5978": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "0" + ], + "stack_out": [ + "values%0#0", + "0", + "\"interest_calculation_base\"" + ] + }, + "5980": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "5981": { + "error": "check self.interest_calculation_base exists", + "op": "assert // check self.interest_calculation_base exists", + "stack_out": [ + "values%0#0", + "maybe_value%2#0" + ] + }, + "5982": { + "op": "intc_0 // 0", + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "0" + ] + }, + "5983": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "0", + "maybe_value%2#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "0", + "\"nominal_interest_rate\"" + ] + }, + "5985": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%2#0", + "maybe_value%3#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "5986": { + "error": "check self.nominal_interest_rate exists", + "op": "assert // check self.nominal_interest_rate exists", + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_value%3#0" + ] + }, + "5987": { + "op": "intc_0 // 0", + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "0" + ] + }, + "5988": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "maybe_value%2#0", + "maybe_value%3#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5990": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0" + ], + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "5991": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "values%0#0", + "maybe_value%2#0", + "maybe_value%3#0", + "maybe_value%4#0" + ] + }, + "5992": { + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "accrued#0" + ], + "stack_out": [ + "values%0#0", + "accrued#0" + ] + }, + "5995": { + "op": "intc_0 // 0", + "stack_out": [ + "values%0#0", + "accrued#0", + "0" + ] + }, + "5996": { + "op": "bytec 5 // \"fixed_point_scale\"", + "stack_out": [ + "values%0#0", + "accrued#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "5998": { + "op": "app_global_get_ex", + "defined_out": [ + "accrued#0", + "maybe_exists%5#0", + "maybe_value%5#0" + ], + "stack_out": [ + "values%0#0", + "accrued#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "5999": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "values%0#0", + "accrued#0", + "maybe_value%5#0" + ] + }, + "6000": { + "op": "frame_dig 0" + }, + "6002": { + "op": "swap", + "defined_out": [ + "accrued#0", + "maybe_value%5#0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "accrued#0", + "values%0#0", + "maybe_value%5#0" + ] + }, + "6003": { + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "tmp%4#0" + ] + }, + "6006": { + "op": "frame_dig -1", + "defined_out": [ + "entry#0 (copy)", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "values%0#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6008": { + "op": "uncover 2" + }, + "6010": { + "retsub": true, + "op": "retsub" + }, + "6011": { + "subroutine": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", + "params": { + "discount_factor#0": "uint64", + "redemption_factor#0": "uint64" + }, + "block": "_discount_annuity_factor", + "stack_in": [], + "op": "proto 2 1" + }, + "6014": { + "op": "frame_dig -1", + "defined_out": [ + "redemption_factor#0 (copy)" + ], + "stack_out": [ + "redemption_factor#0 (copy)" + ] + }, + "6016": { + "op": "bnz _discount_annuity_factor_after_if_else@2", + "stack_out": [] + }, + "6019": { + "op": "frame_dig -2", + "defined_out": [ + "discount_factor#0 (copy)" + ], + "stack_out": [ + "discount_factor#0 (copy)" + ] + }, + "6021": { + "retsub": true, + "op": "retsub" + }, + "6022": { + "block": "_discount_annuity_factor_after_if_else@2", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "6023": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0" + ], + "stack_out": [ + "0", + "\"fixed_point_scale\"" + ] + }, + "6025": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6026": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "6027": { + "op": "intc_0 // 0", + "stack_out": [ + "maybe_value%0#0", + "0" + ] + }, + "6028": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "0", + "\"nominal_interest_rate\"" + ] + }, + "6030": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "6031": { + "error": "check self.nominal_interest_rate exists", + "op": "assert // check self.nominal_interest_rate exists", + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "6032": { + "op": "frame_dig -1", + "defined_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "redemption_factor#0 (copy)" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "redemption_factor#0 (copy)" + ] + }, + "6034": { + "op": "dig 2", + "defined_out": [ + "maybe_value%0#0", + "maybe_value%0#0 (copy)", + "maybe_value%1#0", + "redemption_factor#0 (copy)" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_value%1#0", + "redemption_factor#0 (copy)", + "maybe_value%0#0 (copy)" + ] + }, + "6036": { + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "maybe_value%0#0", + "tmp%1#0" + ], + "stack_out": [ + "maybe_value%0#0", + "tmp%1#0" + ] + }, + "6039": { + "op": "+", + "defined_out": [ + "period_rate#0" + ], + "stack_out": [ + "period_rate#0" + ] + }, + "6040": { + "op": "dup", + "defined_out": [ + "period_rate#0", + "period_rate#0 (copy)" + ], + "stack_out": [ + "period_rate#0", + "period_rate#0 (copy)" + ] + }, + "6041": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "period_rate#0" + ] + }, + "6042": { + "op": "intc_0 // 0", + "stack_out": [ + "period_rate#0", + "0" + ] + }, + "6043": { + "op": "bytec 5 // \"fixed_point_scale\"", + "stack_out": [ + "period_rate#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "6045": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0", + "period_rate#0" + ], + "stack_out": [ + "period_rate#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "6046": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "period_rate#0", + "maybe_value%3#0" + ] + }, + "6047": { + "op": "frame_dig -2", + "defined_out": [ + "discount_factor#0 (copy)", + "maybe_value%3#0", + "period_rate#0" + ], + "stack_out": [ + "period_rate#0", + "maybe_value%3#0", + "discount_factor#0 (copy)" + ] + }, + "6049": { + "op": "swap", + "stack_out": [ + "period_rate#0", + "discount_factor#0 (copy)", + "maybe_value%3#0" + ] + }, + "6050": { + "op": "uncover 2", + "stack_out": [ + "discount_factor#0 (copy)", + "maybe_value%3#0", + "period_rate#0" + ] + }, + "6052": { + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "6055": { + "retsub": true, + "op": "retsub" + }, + "6056": { + "subroutine": "modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry", + "params": { + "entry#0": "bytes", + "payload#0": "bytes" + }, + "block": "_apply_non_cash_schedule_entry", + "stack_in": [], + "op": "proto 2 2" + }, + "6059": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0" + ] + }, + "6060": { + "op": "pushbytes \"\"", + "stack_out": [ + "future_entry#0", + "denominator#0" + ] + }, + "6062": { + "op": "dupn 8", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0" + ] + }, + "6064": { + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "entry#0 (copy)" + ] + }, + "6066": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "entry#0 (copy)", + "0" + ] + }, + "6067": { + "op": "extract_uint64", + "defined_out": [ + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%0#0" + ] + }, + "6068": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%0#0", + "0" + ] + }, + "6069": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%0#0", + "0", + "\"event_cursor\"" + ] + }, + "6070": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6071": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%0#0", + "maybe_value%0#0" + ] + }, + "6072": { + "op": "==", + "defined_out": [ + "tmp%0#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "tmp%0#0" + ] + }, + "6073": { + "error": "Invalid event cursor", + "op": "assert // Invalid event cursor", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0" + ] + }, + "6074": { + "op": "frame_dig -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "entry#0 (copy)" + ] + }, + "6076": { + "op": "pushint 9", + "defined_out": [ + "9", + "entry#0 (copy)", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "entry#0 (copy)", + "9" + ] + }, + "6078": { + "op": "extract_uint64", + "defined_out": [ + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%1#0" + ] + }, + "6079": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%1#0", + "values%0#0", + "values%1#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "values%1#0", + "tmp%1#0" + ] + }, + "6081": { + "op": "<=", + "defined_out": [ + "tmp%2#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "tmp%2#0" + ] + }, + "6082": { + "error": "No due cashflow to pay", + "op": "assert // No due cashflow to pay", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0" + ] + }, + "6083": { + "op": "frame_dig -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "entry#0 (copy)" + ] + }, + "6085": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "entry#0 (copy)", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "entry#0 (copy)", + "8" + ] + }, + "6086": { + "op": "getbyte", + "defined_out": [ + "event_type#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0" + ] + }, + "6087": { + "op": "dup", + "defined_out": [ + "event_type#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "event_type#0" + ] + }, + "6088": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "event_type#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "event_type#0", + "1" + ] + }, + "6089": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6090": { + "op": "dup", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%4#0" + ] + }, + "6091": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@6", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6094": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6095": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"status\"" + ] + }, + "6096": { + "op": "app_global_get_ex", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6097": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0" + ] + }, + "6098": { + "op": "pushint 50", + "defined_out": [ + "50", + "event_type#0", + "maybe_value%0#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "50" + ] + }, + "6100": { + "op": "==", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%0#0" + ] + }, + "6101": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6102": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6103": { + "op": "bytec 11 // \"reserved_units_total\"", + "defined_out": [ + "\"reserved_units_total\"", + "0", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"reserved_units_total\"" + ] + }, + "6105": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "6106": { + "error": "check self.reserved_units_total exists", + "op": "assert // check self.reserved_units_total exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0" + ] + }, + "6107": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "0" + ] + }, + "6108": { + "op": "bytec 13 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0", + "event_type#0", + "maybe_value%1#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "0", + "\"total_units\"" + ] + }, + "6110": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%2#0", + "maybe_value%1#0", + "maybe_value%2#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "6111": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "maybe_value%2#0" + ] + }, + "6112": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "tmp%6#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%6#0" + ] + }, + "6113": { + "error": "Primary distribution is not complete", + "op": "assert // Primary distribution is not complete", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6114": { + "op": "frame_dig -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6116": { + "op": "pushint 49", + "defined_out": [ + "49", + "entry#0 (copy)", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "49" + ] + }, + "6118": { + "op": "extract_uint64", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%2#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%2#0" + ] + }, + "6119": { + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%2#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%2#0", + "\"outstanding_principal\"" + ] + }, + "6121": { + "op": "dig 1", + "defined_out": [ + "\"outstanding_principal\"", + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%2#0", + "values%2#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%2#0", + "\"outstanding_principal\"", + "values%2#0 (copy)" + ] + }, + "6123": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%2#0" + ] + }, + "6124": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%2#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%2#0", + "\"interest_calculation_base\"" + ] + }, + "6126": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"interest_calculation_base\"", + "values%2#0" + ] + }, + "6127": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6128": { + "op": "frame_dig -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6130": { + "op": "pushint 33", + "defined_out": [ + "33", + "entry#0 (copy)", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "33" + ] + }, + "6132": { + "op": "extract_uint64", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%4#0" + ] + }, + "6133": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%4#0", + "\"nominal_interest_rate\"" + ] + }, + "6135": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"", + "values%4#0" + ] + }, + "6136": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6137": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"accrued_interest\"" + ] + }, + "6139": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"accrued_interest\"", + "0" + ] + }, + "6140": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6141": { + "op": "frame_dig -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6143": { + "op": "pushint 41", + "defined_out": [ + "41", + "entry#0 (copy)", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "41" + ] + }, + "6145": { + "op": "extract_uint64", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%5#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%5#0" + ] + }, + "6146": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%5#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%5#0", + "\"next_principal_redemption\"" + ] + }, + "6148": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"next_principal_redemption\"", + "values%5#0" + ] + }, + "6149": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6150": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6151": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"event_cursor\"" + ] + }, + "6152": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%3#0", + "maybe_value%3#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "6153": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%3#0" + ] + }, + "6154": { + "op": "intc_1 // 1", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%3#0", + "1" + ] + }, + "6155": { + "op": "+", + "defined_out": [ + "event_type#0", + "tmp%4#0", + "tmp%7#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%7#0" + ] + }, + "6156": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%7#0", + "\"event_cursor\"" + ] + }, + "6157": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"event_cursor\"", + "tmp%7#0" + ] + }, + "6158": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6159": { + "op": "bytec_1 // \"status\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"status\"" + ] + }, + "6160": { + "op": "pushint 100", + "defined_out": [ + "\"status\"", + "100", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"status\"", + "100" + ] + }, + "6162": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6163": { + "op": "frame_dig 11", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%4#0" + ] + }, + "6165": { + "error": "Not IED event", + "op": "assert // Not IED event", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6166": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6167": { + "op": "bytec 20 // \"initial_exchange_amount\"", + "defined_out": [ + "\"initial_exchange_amount\"", + "0", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"initial_exchange_amount\"" + ] + }, + "6169": { + "op": "app_global_get_ex", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6170": { + "error": "check self.initial_exchange_amount exists", + "op": "assert // check self.initial_exchange_amount exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0" + ] + }, + "6171": { + "op": "frame_dig -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "entry#0 (copy)" + ] + }, + "6173": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "maybe_value%0#0" + ] + }, + "6174": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "maybe_value%0#0", + "0" + ] + }, + "6175": { + "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", + "op": "callsub _emit_execution_event", + "defined_out": [ + "entry#0", + "event_type#0", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0" + ] + }, + "6178": { + "op": "dup" + }, + "6179": { + "op": "frame_bury -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6181": { + "op": "frame_dig -1", + "defined_out": [ + "entry#0 (copy)", + "event_type#0", + "payload#0 (copy)", + "tmp%4#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "payload#0 (copy)" + ] + }, + "6183": { + "op": "frame_bury 1" + }, + "6185": { + "op": "frame_bury 0" + }, + "6187": { + "retsub": true, + "op": "retsub" + }, + "6188": { + "block": "_apply_non_cash_schedule_entry_after_if_else@6", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6189": { + "op": "bytec_1 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"status\"" + ] + }, + "6190": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6191": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0" + ] + }, + "6192": { + "op": "pushint 50", + "defined_out": [ + "50", + "maybe_value%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "50" + ] + }, + "6194": { + "op": "==", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%0#0" + ] + }, + "6195": { + "op": "!", + "defined_out": [ + "tmp%1#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%1#1" + ] + }, + "6196": { + "error": "IED not yet executed", + "op": "assert // IED not yet executed", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6197": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6198": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"accrued_interest\"" + ] + }, + "6200": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "6201": { + "error": "check self.accrued_interest exists", + "op": "assert // check self.accrued_interest exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0" + ] + }, + "6202": { + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)", + "maybe_value%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0", + "entry#0 (copy)" + ] + }, + "6204": { + "callsub": "modules.actus_kernel.ActusKernelModule._entry_interest_segment", + "op": "callsub _entry_interest_segment", + "defined_out": [ + "_entry_interest_segment%0#0", + "entry#0", + "maybe_value%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0", + "_entry_interest_segment%0#0", + "entry#0" + ] + }, + "6207": { + "op": "frame_bury -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0", + "_entry_interest_segment%0#0" + ] + }, + "6209": { + "op": "+", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%8#0" + ] + }, + "6210": { + "op": "bytec 6 // \"accrued_interest\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%8#0", + "\"accrued_interest\"" + ] + }, + "6212": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"accrued_interest\"", + "tmp%8#0" + ] + }, + "6213": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6214": { + "op": "frame_dig 10", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0" + ] + }, + "6216": { + "op": "pushint 12", + "defined_out": [ + "12", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0", + "12" + ] + }, + "6218": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%9#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%9#0" + ] + }, + "6219": { + "op": "bz _apply_non_cash_schedule_entry_else_body@10", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6222": { + "op": "frame_dig -1", + "defined_out": [ + "event_type#0", + "payload#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "payload#0 (copy)" + ] + }, + "6224": { + "op": "pushint 33", + "defined_out": [ + "33", + "event_type#0", + "payload#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "payload#0 (copy)", + "33" + ] + }, + "6226": { + "op": "extract_uint64", + "defined_out": [ + "event_type#0", + "values%6#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0" + ] + }, + "6227": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "0" + ] + }, + "6228": { + "op": "bytec 37 // \"rate_reset_multiplier\"", + "defined_out": [ + "\"rate_reset_multiplier\"", + "0", + "event_type#0", + "values%6#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "0", + "\"rate_reset_multiplier\"" + ] + }, + "6230": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%5#0", + "maybe_value%5#0", + "values%6#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "6231": { + "error": "check self.rate_reset_multiplier exists", + "op": "assert // check self.rate_reset_multiplier exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "maybe_value%5#0" + ] + }, + "6232": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "maybe_value%5#0", + "0" + ] + }, + "6233": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "event_type#0", + "maybe_value%5#0", + "values%6#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "maybe_value%5#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "6235": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%6#0", + "maybe_value%5#0", + "maybe_value%6#0", + "values%6#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "maybe_value%5#0", + "maybe_value%6#0", + "maybe_exists%6#0" + ] + }, + "6236": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%6#0", + "maybe_value%5#0", + "maybe_value%6#0" + ] + }, + "6237": { + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "event_type#0", + "observed_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "observed_rate#0" + ] + }, + "6240": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "observed_rate#0", + "0" + ] + }, + "6241": { + "op": "bytec 36 // \"rate_reset_spread\"", + "defined_out": [ + "\"rate_reset_spread\"", + "0", + "event_type#0", + "observed_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "observed_rate#0", + "0", + "\"rate_reset_spread\"" + ] + }, + "6243": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%7#0", + "maybe_value%7#0", + "observed_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "observed_rate#0", + "maybe_value%7#0", + "maybe_exists%7#0" + ] + }, + "6244": { + "error": "check self.rate_reset_spread exists", + "op": "assert // check self.rate_reset_spread exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "observed_rate#0", + "maybe_value%7#0" + ] + }, + "6245": { + "op": "+", + "defined_out": [ + "event_type#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "rate#0" + ] + }, + "6246": { + "op": "frame_bury 6", + "defined_out": [ + "event_type#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6248": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6249": { + "op": "bytec 39 // \"has_rate_reset_floor\"", + "defined_out": [ + "\"has_rate_reset_floor\"", + "0", + "event_type#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"has_rate_reset_floor\"" + ] + }, + "6251": { + "op": "app_global_get_ex", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6252": { + "error": "check self.has_rate_reset_floor exists", + "op": "assert // check self.has_rate_reset_floor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%0#0" + ] + }, + "6253": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@55", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6256": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6257": { + "op": "bytec 31 // \"rate_reset_floor\"", + "defined_out": [ + "\"rate_reset_floor\"", + "0", + "event_type#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"rate_reset_floor\"" + ] + }, + "6259": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%1#0", + "maybe_value%1#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "6260": { + "error": "check self.rate_reset_floor exists", + "op": "assert // check self.rate_reset_floor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0" + ] + }, + "6261": { + "op": "frame_dig 6", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "rate#0" + ] + }, + "6263": { + "op": ">", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%0#0" + ] + }, + "6264": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@55", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6267": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6268": { + "op": "bytec 31 // \"rate_reset_floor\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"rate_reset_floor\"" + ] + }, + "6270": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%2#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "rate#0", + "maybe_exists%2#0" + ] + }, + "6271": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%2#0", + "rate#0" + ] + }, + "6272": { + "op": "frame_bury 6", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%2#0" + ] + }, + "6274": { + "error": "check self.rate_reset_floor exists", + "op": "assert // check self.rate_reset_floor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6275": { + "block": "_apply_non_cash_schedule_entry_after_if_else@55", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6276": { + "op": "bytec 40 // \"has_rate_reset_cap\"", + "defined_out": [ + "\"has_rate_reset_cap\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"has_rate_reset_cap\"" + ] + }, + "6278": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "6279": { + "error": "check self.has_rate_reset_cap exists", + "op": "assert // check self.has_rate_reset_cap exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%3#0" + ] + }, + "6280": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@58", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6283": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6284": { + "op": "bytec 32 // \"rate_reset_cap\"", + "defined_out": [ + "\"rate_reset_cap\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"rate_reset_cap\"" + ] + }, + "6286": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "6287": { + "error": "check self.rate_reset_cap exists", + "op": "assert // check self.rate_reset_cap exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0" + ] + }, + "6288": { + "op": "frame_dig 6", + "defined_out": [ + "maybe_value%4#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%4#0", + "rate#0" + ] + }, + "6290": { + "op": "<", + "defined_out": [ + "rate#0", + "tmp%1#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%1#1" + ] + }, + "6291": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@58", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6294": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6295": { + "op": "bytec 32 // \"rate_reset_cap\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"rate_reset_cap\"" + ] + }, + "6297": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%5#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "rate#0", + "maybe_exists%5#0" + ] + }, + "6298": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%5#0", + "rate#0" + ] + }, + "6299": { + "op": "frame_bury 6", + "defined_out": [ + "maybe_exists%5#0", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%5#0" + ] + }, + "6301": { + "error": "check self.rate_reset_cap exists", + "op": "assert // check self.rate_reset_cap exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6302": { + "block": "_apply_non_cash_schedule_entry_after_if_else@58", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"" + ] + }, + "6304": { + "op": "frame_dig 6", + "defined_out": [ + "\"nominal_interest_rate\"", + "rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"", + "rate#0" + ] + }, + "6306": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6307": { + "block": "_apply_non_cash_schedule_entry_after_if_else@18", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig 10", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0" + ] + }, + "6309": { + "op": "pushint 4", + "defined_out": [ + "4", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0", + "4" + ] + }, + "6311": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%16#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%16#0" + ] + }, + "6312": { + "op": "bz _apply_non_cash_schedule_entry_else_body@20", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6315": { + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6317": { + "op": "pushint 49", + "defined_out": [ + "49", + "entry#0 (copy)", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "49" + ] + }, + "6319": { + "op": "extract_uint64", + "defined_out": [ + "event_type#0", + "values%10#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%10#0" + ] + }, + "6320": { + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "event_type#0", + "values%10#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%10#0", + "\"outstanding_principal\"" + ] + }, + "6322": { + "op": "dig 1", + "defined_out": [ + "\"outstanding_principal\"", + "event_type#0", + "values%10#0", + "values%10#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%10#0", + "\"outstanding_principal\"", + "values%10#0 (copy)" + ] + }, + "6324": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%10#0" + ] + }, + "6325": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "event_type#0", + "values%10#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%10#0", + "\"interest_calculation_base\"" + ] + }, + "6327": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"interest_calculation_base\"", + "values%10#0" + ] + }, + "6328": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6329": { + "block": "_apply_non_cash_schedule_entry_after_if_else@23", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "callsub": "modules.actus_kernel.ActusKernelModule._is_dynamic_annuity", + "op": "callsub _is_dynamic_annuity", + "defined_out": [ + "tmp%18#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%18#0" + ] + }, + "6332": { + "op": "bz _apply_non_cash_schedule_entry_else_body@29", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6335": { + "op": "frame_dig 10", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0" + ] + }, + "6337": { + "op": "pushint 5", + "defined_out": [ + "5", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0", + "5" + ] + }, + "6339": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%19#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%19#0" + ] + }, + "6340": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@30", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6343": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6344": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "6345": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%10#0", + "maybe_value%10#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0", + "maybe_exists%10#0" + ] + }, + "6346": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0" + ] + }, + "6347": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0", + "0" + ] + }, + "6348": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0", + "event_type#0", + "maybe_value%10#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0", + "0", + "\"event_cursor\"" + ] + }, + "6349": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%11#0", + "maybe_value%10#0", + "maybe_value%11#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0", + "maybe_value%11#0", + "maybe_exists%11#0" + ] + }, + "6350": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%10#0", + "maybe_value%11#0" + ] + }, + "6351": { + "op": "-", + "defined_out": [ + "event_type#0", + "tmp%20#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%20#0" + ] + }, + "6352": { + "op": "pushint 100", + "defined_out": [ + "100", + "event_type#0", + "tmp%20#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%20#0", + "100" + ] + }, + "6354": { + "op": "*", + "defined_out": [ + "event_type#0", + "tmp%21#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%21#0" + ] + }, + "6355": { + "op": "intc 4 // 1500", + "defined_out": [ + "1500", + "event_type#0", + "tmp%21#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%21#0", + "1500" + ] + }, + "6357": { + "op": "+", + "defined_out": [ + "event_type#0", + "tmp%22#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%22#0" + ] + }, + "6358": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%22#0", + "0" + ] + }, + "6359": { + "callsub": "_puya_lib.util.ensure_budget", + "op": "callsub ensure_budget", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6362": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6363": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "6365": { + "op": "app_global_get_ex", + "defined_out": [ + "discount_factor#0", + "event_type#0", + "maybe_exists%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "maybe_exists%0#0" + ] + }, + "6366": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%0#0", + "discount_factor#0" + ] + }, + "6367": { + "op": "frame_bury 2", + "defined_out": [ + "discount_factor#0", + "event_type#0", + "maybe_exists%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%0#0" + ] + }, + "6369": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6370": { + "op": "intc_0 // 0", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "denominator#0" + ] + }, + "6371": { + "op": "frame_bury 1", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6373": { + "op": "intc_0 // 0", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "event_type#0", + "skip_first_redemption#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "skip_first_redemption#0" + ] + }, + "6374": { + "op": "frame_bury 7", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "event_type#0", + "skip_first_redemption#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6376": { + "op": "frame_dig -2", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "entry#0 (copy)", + "event_type#0", + "skip_first_redemption#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6378": { + "op": "pushint 25", + "defined_out": [ + "25", + "denominator#0", + "discount_factor#0", + "entry#0 (copy)", + "event_type#0", + "skip_first_redemption#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "25" + ] + }, + "6380": { + "op": "extract_uint64", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "event_type#0", + "skip_first_redemption#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%0#0" + ] + }, + "6381": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%0#0", + "values%0#0" + ] + }, + "6382": { + "op": "frame_bury 8", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "event_type#0", + "skip_first_redemption#0", + "values%0#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%0#0" + ] + }, + "6384": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@35", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6387": { + "op": "frame_dig 2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0" + ] + }, + "6389": { + "op": "frame_dig 8", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "values%0#0" + ] + }, + "6391": { + "callsub": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", + "op": "callsub _discount_annuity_factor", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0" + ] + }, + "6394": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "discount_factor#0" + ] + }, + "6395": { + "op": "frame_bury 2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0" + ] + }, + "6397": { + "op": "intc_1 // 1", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "skip_first_redemption#0" + ] + }, + "6398": { + "op": "frame_bury 7", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "denominator#0" + ] + }, + "6400": { + "op": "frame_bury 1", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6402": { + "block": "_apply_non_cash_schedule_entry_after_if_else@35", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6403": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"event_cursor\"" + ] + }, + "6404": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "6405": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0" + ] + }, + "6406": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "maybe_value%1#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%1#0", + "1" + ] + }, + "6407": { + "op": "+", + "defined_out": [ + "future_event_id#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_id#0" + ] + }, + "6408": { + "op": "frame_bury 3", + "defined_out": [ + "future_event_id#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6410": { + "block": "_apply_non_cash_schedule_entry_while_top@36", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6411": { + "op": "bytec_3 // \"schedule_entry_count\"", + "defined_out": [ + "\"schedule_entry_count\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"schedule_entry_count\"" + ] + }, + "6412": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "6413": { + "error": "check self.schedule_entry_count exists", + "op": "assert // check self.schedule_entry_count exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%2#0" + ] + }, + "6414": { + "op": "frame_dig 3", + "defined_out": [ + "future_event_id#0", + "maybe_value%2#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%2#0", + "future_event_id#0" + ] + }, + "6416": { + "op": ">", + "defined_out": [ + "future_event_id#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%4#0" + ] + }, + "6417": { + "op": "bz _apply_non_cash_schedule_entry_after_while@48", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6420": { + "op": "frame_dig 3", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_id#0" + ] + }, + "6422": { + "callsub": "modules.actus_kernel.ActusKernelModule._get_schedule_entry", + "op": "callsub _get_schedule_entry", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0" + ] + }, + "6425": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0", + "future_entry#0" + ] + }, + "6426": { + "op": "frame_bury 0", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0" + ] + }, + "6428": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "future_entry#0", + "future_event_id#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0", + "8" + ] + }, + "6429": { + "op": "getbyte", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_type#0" + ] + }, + "6430": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_type#0", + "future_event_type#0" + ] + }, + "6431": { + "op": "frame_bury 4", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_type#0" + ] + }, + "6433": { + "op": "pushint 3", + "defined_out": [ + "3", + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_type#0", + "3" + ] + }, + "6435": { + "op": "==", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0", + "tmp%7#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%7#1" + ] + }, + "6436": { + "op": "bnz _apply_non_cash_schedule_entry_bool_true@40", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6439": { + "op": "frame_dig 4", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_type#0" + ] + }, + "6441": { + "op": "pushint 19", + "defined_out": [ + "19", + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_type#0", + "19" + ] + }, + "6443": { + "op": "==", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0", + "tmp%8#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%8#1" + ] + }, + "6444": { + "op": "bz _apply_non_cash_schedule_entry_bool_false@41", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6447": { + "op": "frame_dig 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0" + ] + }, + "6449": { + "op": "pushint 25", + "defined_out": [ + "25", + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0", + "25" + ] + }, + "6451": { + "op": "extract_uint64", + "defined_out": [ + "future_entry#0", + "future_event_id#0", + "future_event_type#0", + "tmp%4#0", + "values%2#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%2#0" + ] + }, + "6452": { + "op": "bz _apply_non_cash_schedule_entry_bool_false@41", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6455": { + "block": "_apply_non_cash_schedule_entry_bool_true@40", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "is_redemption_event#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "is_redemption_event#0" + ] + }, + "6456": { + "block": "_apply_non_cash_schedule_entry_bool_merge@42", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "is_redemption_event#0" + ], + "op": "bz _apply_non_cash_schedule_entry_after_if_else@47", + "defined_out": [], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6459": { + "op": "frame_dig 7", + "defined_out": [ + "skip_first_redemption#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "skip_first_redemption#0" + ] + }, + "6461": { + "op": "bz _apply_non_cash_schedule_entry_else_body@45", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6464": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "skip_first_redemption#0" + ] + }, + "6465": { + "op": "frame_bury 7", + "defined_out": [ + "skip_first_redemption#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6467": { + "block": "_apply_non_cash_schedule_entry_after_if_else@47", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig 3", + "defined_out": [ + "future_event_id#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_id#0" + ] + }, + "6469": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "future_event_id#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_id#0", + "1" + ] + }, + "6470": { + "op": "+", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_event_id#0" + ] + }, + "6471": { + "op": "frame_bury 3", + "defined_out": [ + "future_event_id#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6473": { + "op": "b _apply_non_cash_schedule_entry_while_top@36" + }, + "6476": { + "block": "_apply_non_cash_schedule_entry_else_body@45", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig 0", + "defined_out": [ + "future_entry#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0" + ] + }, + "6478": { + "op": "pushint 25", + "defined_out": [ + "25", + "future_entry#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "future_entry#0", + "25" + ] + }, + "6480": { + "op": "extract_uint64", + "defined_out": [ + "future_entry#0", + "values%3#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%3#1" + ] + }, + "6481": { + "op": "frame_dig 2", + "defined_out": [ + "discount_factor#0", + "future_entry#0", + "values%3#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%3#1", + "discount_factor#0" + ] + }, + "6483": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "values%3#1" + ] + }, + "6484": { + "callsub": "modules.actus_kernel.ActusKernelModule._discount_annuity_factor", + "op": "callsub _discount_annuity_factor", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0" + ] + }, + "6487": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "discount_factor#0" + ] + }, + "6488": { + "op": "frame_bury 2", + "defined_out": [ + "discount_factor#0", + "future_entry#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0" + ] + }, + "6490": { + "op": "frame_dig 1", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "future_entry#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "discount_factor#0", + "denominator#0" + ] + }, + "6492": { + "op": "+", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "denominator#0" + ] + }, + "6493": { + "op": "frame_bury 1", + "defined_out": [ + "denominator#0", + "discount_factor#0", + "future_entry#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6495": { + "op": "b _apply_non_cash_schedule_entry_after_if_else@47" + }, + "6498": { + "block": "_apply_non_cash_schedule_entry_bool_false@41", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "is_redemption_event#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "is_redemption_event#0" + ] + }, + "6499": { + "op": "b _apply_non_cash_schedule_entry_bool_merge@42" + }, + "6502": { + "block": "_apply_non_cash_schedule_entry_after_while@48", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig 1", + "defined_out": [ + "denominator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "denominator#0" + ] + }, + "6504": { + "error": "Invalid ACTUS configuration", + "op": "assert // Invalid ACTUS configuration", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6505": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "denominator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6506": { + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "denominator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"outstanding_principal\"" + ] + }, + "6508": { + "op": "app_global_get_ex", + "defined_out": [ + "denominator#0", + "maybe_exists%3#0", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "maybe_exists%3#0" + ] + }, + "6509": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0" + ] + }, + "6510": { + "op": "frame_dig -2", + "defined_out": [ + "denominator#0", + "entry#0 (copy)", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "entry#0 (copy)" + ] + }, + "6512": { + "op": "pushint 57", + "defined_out": [ + "57", + "denominator#0", + "entry#0 (copy)", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "entry#0 (copy)", + "57" + ] + }, + "6514": { + "op": "extract_uint64", + "defined_out": [ + "denominator#0", + "numerator#0", + "values%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "values%4#0" + ] + }, + "6515": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "denominator#0", + "numerator#0", + "values%4#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "values%4#0", + "8" + ] + }, + "6516": { + "op": "&", + "defined_out": [ + "denominator#0", + "numerator#0", + "tmp%14#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "tmp%14#1" + ] + }, + "6517": { + "op": "bnz _apply_non_cash_schedule_entry_after_if_else@50", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0" + ] + }, + "6520": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "0" + ] + }, + "6521": { + "op": "bytec 6 // \"accrued_interest\"", + "defined_out": [ + "\"accrued_interest\"", + "0", + "denominator#0", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "0", + "\"accrued_interest\"" + ] + }, + "6523": { + "op": "app_global_get_ex", + "defined_out": [ + "denominator#0", + "maybe_exists%4#0", + "maybe_value%4#0", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "6524": { + "error": "check self.accrued_interest exists", + "op": "assert // check self.accrued_interest exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "maybe_value%4#0" + ] + }, + "6525": { + "op": "+", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0" + ] + }, + "6526": { + "block": "_apply_non_cash_schedule_entry_after_if_else@50", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "0" + ] + }, + "6527": { + "op": "bytec 5 // \"fixed_point_scale\"", + "defined_out": [ + "\"fixed_point_scale\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "0", + "\"fixed_point_scale\"" + ] + }, + "6529": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%5#0", + "maybe_value%5#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "6530": { + "error": "check self.fixed_point_scale exists", + "op": "assert // check self.fixed_point_scale exists", + "defined_out": [ + "maybe_value%5#0", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "maybe_value%5#0" + ] + }, + "6531": { + "op": "frame_dig 1", + "defined_out": [ + "denominator#0", + "maybe_value%5#0", + "numerator#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "numerator#0", + "maybe_value%5#0", + "denominator#0" + ] + }, + "6533": { + "callsub": "modules.actus_kernel.ActusKernelModule._scaled_mul_div", + "op": "callsub _scaled_mul_div", + "defined_out": [ + "denominator#0", + "tmp%17#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%17#1" + ] + }, + "6536": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "denominator#0", + "tmp%17#1" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%17#1", + "\"next_principal_redemption\"" + ] + }, + "6538": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"next_principal_redemption\"", + "tmp%17#1" + ] + }, + "6539": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6540": { + "block": "_apply_non_cash_schedule_entry_after_if_else@30", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6541": { + "op": "bytec_2 // \"event_cursor\"", + "defined_out": [ + "\"event_cursor\"", + "0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"event_cursor\"" + ] + }, + "6542": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%12#0", + "maybe_value%12#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%12#0", + "maybe_exists%12#0" + ] + }, + "6543": { + "error": "check self.event_cursor exists", + "op": "assert // check self.event_cursor exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%12#0" + ] + }, + "6544": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "maybe_value%12#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%12#0", + "1" + ] + }, + "6545": { + "op": "+", + "defined_out": [ + "tmp%23#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%23#0" + ] + }, + "6546": { + "op": "bytec_2 // \"event_cursor\"", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%23#0", + "\"event_cursor\"" + ] + }, + "6547": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"event_cursor\"", + "tmp%23#0" + ] + }, + "6548": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6549": { + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6551": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "0" + ] + }, + "6552": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "0", + "0" + ] + }, + "6553": { + "callsub": "modules.actus_kernel.ActusKernelModule._emit_execution_event", + "op": "callsub _emit_execution_event", + "defined_out": [ + "entry#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0" + ] + }, + "6556": { + "op": "dup" + }, + "6557": { + "op": "frame_bury -2", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6559": { + "op": "frame_dig -1", + "defined_out": [ + "entry#0 (copy)", + "payload#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "payload#0 (copy)" + ] + }, + "6561": { + "op": "frame_bury 1" + }, + "6563": { + "op": "frame_bury 0" + }, + "6565": { + "retsub": true, + "op": "retsub" + }, + "6566": { + "block": "_apply_non_cash_schedule_entry_else_body@29", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6568": { + "op": "pushint 41", + "defined_out": [ + "41", + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "41" + ] + }, + "6570": { + "op": "extract_uint64", + "defined_out": [ + "values%12#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%12#0" + ] + }, + "6571": { + "op": "bytec 14 // \"next_principal_redemption\"", + "defined_out": [ + "\"next_principal_redemption\"", + "values%12#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%12#0", + "\"next_principal_redemption\"" + ] + }, + "6573": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"next_principal_redemption\"", + "values%12#0" + ] + }, + "6574": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6575": { + "op": "b _apply_non_cash_schedule_entry_after_if_else@30" + }, + "6578": { + "block": "_apply_non_cash_schedule_entry_else_body@20", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig 10", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0" + ] + }, + "6580": { + "op": "pushint 18", + "defined_out": [ + "18", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0", + "18" + ] + }, + "6582": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%17#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%17#0" + ] + }, + "6583": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@23", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6586": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6587": { + "op": "bytec 4 // \"outstanding_principal\"", + "defined_out": [ + "\"outstanding_principal\"", + "0", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"outstanding_principal\"" + ] + }, + "6589": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%9#0", + "maybe_value%9#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%9#0", + "maybe_exists%9#0" + ] + }, + "6590": { + "error": "check self.outstanding_principal exists", + "op": "assert // check self.outstanding_principal exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%9#0" + ] + }, + "6591": { + "op": "bytec 7 // \"interest_calculation_base\"", + "defined_out": [ + "\"interest_calculation_base\"", + "event_type#0", + "maybe_value%9#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_value%9#0", + "\"interest_calculation_base\"" + ] + }, + "6593": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"interest_calculation_base\"", + "maybe_value%9#0" + ] + }, + "6594": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6595": { + "op": "b _apply_non_cash_schedule_entry_after_if_else@23" + }, + "6598": { + "block": "_apply_non_cash_schedule_entry_else_body@10", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig 10", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0" + ] + }, + "6600": { + "op": "pushint 11", + "defined_out": [ + "11", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "event_type#0", + "11" + ] + }, + "6602": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%13#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "tmp%13#0" + ] + }, + "6603": { + "op": "bz _apply_non_cash_schedule_entry_else_body@14", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6606": { + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6608": { + "op": "pushint 33", + "defined_out": [ + "33", + "entry#0 (copy)", + "event_type#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "33" + ] + }, + "6610": { + "op": "extract_uint64", + "defined_out": [ + "event_type#0", + "next_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "next_rate#0" + ] + }, + "6611": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "next_rate#0", + "next_rate#0" + ] + }, + "6612": { + "op": "frame_bury 5", + "defined_out": [ + "event_type#0", + "next_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "next_rate#0" + ] + }, + "6614": { + "op": "bnz _apply_non_cash_schedule_entry_after_if_else@13", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6617": { + "op": "intc_0 // 0", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0" + ] + }, + "6618": { + "op": "bytec 38 // \"rate_reset_next\"", + "defined_out": [ + "\"rate_reset_next\"", + "0", + "event_type#0", + "next_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "0", + "\"rate_reset_next\"" + ] + }, + "6620": { + "op": "app_global_get_ex", + "defined_out": [ + "event_type#0", + "maybe_exists%8#0", + "next_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "next_rate#0", + "maybe_exists%8#0" + ] + }, + "6621": { + "op": "swap", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%8#0", + "next_rate#0" + ] + }, + "6622": { + "op": "frame_bury 5", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "maybe_exists%8#0" + ] + }, + "6624": { + "error": "check self.rate_reset_next exists", + "op": "assert // check self.rate_reset_next exists", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6625": { + "block": "_apply_non_cash_schedule_entry_after_if_else@13", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"" + ] + }, + "6627": { + "op": "frame_dig 5", + "defined_out": [ + "\"nominal_interest_rate\"", + "next_rate#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"", + "next_rate#0" + ] + }, + "6629": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6630": { + "op": "b _apply_non_cash_schedule_entry_after_if_else@18" + }, + "6633": { + "block": "_apply_non_cash_schedule_entry_else_body@14", + "stack_in": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ], + "op": "frame_dig -2", + "defined_out": [ + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)" + ] + }, + "6635": { + "op": "pushint 33", + "defined_out": [ + "33", + "entry#0 (copy)" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "entry#0 (copy)", + "33" + ] + }, + "6637": { + "op": "extract_uint64", + "defined_out": [ + "values%8#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%8#0" + ] + }, + "6638": { + "op": "dup", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%8#0", + "values%8#0" + ] + }, + "6639": { + "op": "frame_bury 9", + "defined_out": [ + "values%8#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "values%8#0" + ] + }, + "6641": { + "op": "bz _apply_non_cash_schedule_entry_after_if_else@18", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6644": { + "op": "bytec 9 // \"nominal_interest_rate\"", + "defined_out": [ + "\"nominal_interest_rate\"", + "values%8#0" + ], + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"" + ] + }, + "6646": { + "op": "frame_dig 9", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0", + "\"nominal_interest_rate\"", + "values%8#0" + ] + }, + "6648": { + "op": "app_global_put", + "stack_out": [ + "future_entry#0", + "denominator#0", + "discount_factor#0", + "future_event_id#0", + "future_event_type#0", + "next_rate#0", + "rate#0", + "skip_first_redemption#0", + "values%0#0", + "values%8#0", + "event_type#0", + "tmp%4#0" + ] + }, + "6649": { + "op": "b _apply_non_cash_schedule_entry_after_if_else@18" + }, + "6652": { + "subroutine": "modules.actus_kernel.ActusKernelModule._emit_execution_event", + "params": { + "entry#0": "bytes", + "payoff#0": "uint64", + "settled_amount#0": "uint64" + }, + "block": "_emit_execution_event", + "stack_in": [], + "op": "proto 3 1" + }, + "6655": { + "op": "global CurrentApplicationID" + }, + "6657": { + "op": "frame_dig -3" + }, + "6659": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "entry#0 (copy)", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "entry#0 (copy)", + "0" + ] + }, + "6660": { + "op": "extract_uint64", + "defined_out": [ + "tmp%0#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0" + ] + }, + "6661": { + "op": "frame_dig -3", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "entry#0 (copy)" + ] + }, + "6663": { + "op": "extract 8 1", + "defined_out": [ + "aggregate%extract%1#0", + "tmp%0#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0" + ] + }, + "6666": { + "op": "frame_dig -3", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "entry#0 (copy)" + ] + }, + "6668": { + "op": "extract 9 8", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%0#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0" + ] + }, + "6671": { + "op": "global LatestTimestamp" + }, + "6673": { + "op": "frame_dig -3" + }, + "6675": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "entry#0 (copy)", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "entry#0 (copy)", + "8" + ] + }, + "6676": { + "op": "getbyte", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "event_type#0", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ] + }, + "6677": { + "op": "frame_dig -2", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "event_type#0", + "payoff#0 (copy)", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "payoff#0 (copy)" + ] + }, + "6679": { + "op": "bnz _emit_execution_event_after_if_else@3", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ] + }, + "6682": { + "op": "intc_1 // 1", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "event_type#0", + "tmp%0#0", + "tmp%1#0", + "tmp%3#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%3#0" + ] + }, + "6683": { + "block": "_emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7", + "stack_in": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%3#0" + ], + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "6684": { + "op": "dup", + "defined_out": [ + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%val_as_bytes%0#0", + "aggregate%val_as_bytes%0#0 (copy)" + ] + }, + "6685": { + "op": "bitlen", + "defined_out": [ + "aggregate%bitlen%0#0", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%val_as_bytes%0#0", + "aggregate%bitlen%0#0" + ] + }, + "6686": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "aggregate%bitlen%0#0", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%val_as_bytes%0#0", + "aggregate%bitlen%0#0", + "8" + ] + }, + "6687": { + "op": "<=", + "defined_out": [ + "aggregate%no_overflow%0#0", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%val_as_bytes%0#0", + "aggregate%no_overflow%0#0" + ] + }, + "6688": { + "error": "overflow", + "op": "assert // overflow", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%val_as_bytes%0#0" + ] + }, + "6689": { + "op": "extract 7 1", + "defined_out": [ + "aggregate%uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0" + ] + }, + "6692": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "aggregate%uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "0" + ] + }, + "6693": { + "op": "bytec 19 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"", + "0", + "aggregate%uint8%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "0", + "\"settlement_asset_id\"" + ] + }, + "6695": { + "op": "app_global_get_ex", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6696": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0" + ] + }, + "6697": { + "op": "frame_dig 1", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0" + ] + }, + "6699": { + "op": "dup", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "values%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "values%0#0 (copy)" + ] + }, + "6700": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "values%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "values%0#0 (copy)", + "1" + ] + }, + "6701": { + "op": "+", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "tmp%5#0" + ] + }, + "6702": { + "op": "frame_dig 0", + "defined_out": [ + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "tmp%5#0", + "tmp%0#0" + ] + }, + "6704": { + "op": "itob", + "defined_out": [ + "aggregate%uint8%0#0", + "aggregate%val_as_bytes%1#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "values%0#0", + "tmp%5#0", + "aggregate%val_as_bytes%1#0" + ] + }, + "6705": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%val_as_bytes%1#0", + "values%0#0" + ] + }, + "6707": { + "op": "itob", + "defined_out": [ + "aggregate%uint8%0#0", + "aggregate%val_as_bytes%1#0", + "aggregate%val_as_bytes%2#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%val_as_bytes%1#0", + "aggregate%val_as_bytes%2#0" + ] + }, + "6708": { + "op": "concat", + "defined_out": [ + "aggregate%head%1#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%1#0" + ] + }, + "6709": { + "op": "frame_dig 2", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%head%1#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%1#0", + "aggregate%extract%1#0" + ] + }, + "6711": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%head%2#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%2#0" + ] + }, + "6712": { + "op": "frame_dig 3", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%2#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%2#0", + "aggregate%extract%2#0" + ] + }, + "6714": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%3#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%3#0" + ] + }, + "6715": { + "op": "frame_dig 4", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%3#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%3#0", + "tmp%1#0" + ] + }, + "6717": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%3#0", + "aggregate%uint8%0#0", + "aggregate%val_as_bytes%4#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%3#0", + "aggregate%val_as_bytes%4#0" + ] + }, + "6718": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%4#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%4#0" + ] + }, + "6719": { + "op": "frame_dig -2", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%4#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "payoff#0 (copy)", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%4#0", + "payoff#0 (copy)" + ] + }, + "6721": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%4#0", + "aggregate%uint8%0#0", + "aggregate%val_as_bytes%5#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%4#0", + "aggregate%val_as_bytes%5#0" + ] + }, + "6722": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%5#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%uint8%0#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%5#0" + ] + }, + "6723": { + "op": "uncover 3", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%5#0", + "aggregate%uint8%0#0" + ] + }, + "6725": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%6#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%6#0" + ] + }, + "6726": { + "op": "frame_dig -1", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%6#0", + "maybe_value%0#0", + "settled_amount#0 (copy)", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%6#0", + "settled_amount#0 (copy)" + ] + }, + "6728": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%6#0", + "aggregate%val_as_bytes%6#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%6#0", + "aggregate%val_as_bytes%6#0" + ] + }, + "6729": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%7#0", + "maybe_value%0#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "maybe_value%0#0", + "tmp%5#0", + "aggregate%head%7#0" + ] + }, + "6730": { + "op": "uncover 2", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%5#0", + "aggregate%head%7#0", + "maybe_value%0#0" + ] + }, + "6732": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%7#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%5#0", + "aggregate%head%7#0", + "aggregate%val_as_bytes%7#0" + ] + }, + "6733": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%8#0", + "tmp%0#0", + "tmp%1#0", + "tmp%5#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%5#0", + "aggregate%head%8#0" + ] + }, + "6734": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%head%8#0", + "tmp%5#0" + ] + }, + "6735": { + "op": "itob", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%8#0", + "aggregate%val_as_bytes%8#0", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%head%8#0", + "aggregate%val_as_bytes%8#0" + ] + }, + "6736": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%9#0", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%head%9#0" + ] + }, + "6737": { + "op": "pushbytes 0x9a332b95 // method \"ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64)\"", + "defined_out": [ + "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "aggregate%head%9#0", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "aggregate%head%9#0", + "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))" + ] + }, + "6743": { + "op": "swap", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "Method(ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64))", + "aggregate%head%9#0" + ] + }, + "6744": { + "op": "concat", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "event%0#0", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "event%0#0" + ] + }, + "6745": { + "op": "log", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ] + }, + "6746": { + "op": "frame_dig -3", + "defined_out": [ + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "entry#0 (copy)", + "tmp%0#0", + "tmp%1#0", + "values%0#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "entry#0 (copy)" + ] + }, + "6748": { + "op": "frame_bury 0" + }, + "6750": { + "retsub": true, + "op": "retsub" + }, + "6751": { + "block": "_emit_execution_event_after_if_else@3", + "stack_in": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ], + "op": "frame_dig 5", + "defined_out": [ + "event_type#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "event_type#0" + ] + }, + "6753": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "event_type#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "event_type#0", + "1" + ] + }, + "6754": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%1#1" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%1#1" + ] + }, + "6755": { + "op": "bnz _emit_execution_event_if_body@5", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ] + }, + "6758": { + "op": "frame_dig 5", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "event_type#0" + ] + }, + "6760": { + "op": "pushint 4", + "defined_out": [ + "4", + "event_type#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "event_type#0", + "4" + ] + }, + "6762": { + "op": "==", + "defined_out": [ + "event_type#0", + "tmp%2#1" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%2#1" + ] + }, + "6763": { + "op": "bz _emit_execution_event_after_if_else@6", + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ] + }, + "6766": { + "block": "_emit_execution_event_if_body@5", + "stack_in": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%3#0" + ] + }, + "6767": { + "op": "b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7" + }, + "6770": { + "block": "_emit_execution_event_after_if_else@6", + "stack_in": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0" + ], + "op": "pushint 255", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%0#0", + "values%0#0", + "aggregate%extract%1#0", + "aggregate%extract%2#0", + "tmp%1#0", + "event_type#0", + "tmp%3#0" + ] + }, + "6773": { + "op": "b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7" + }, + "6776": { + "subroutine": "modules.rbac.RbacModule._role_is_active", + "params": { + "role_map#0": "bytes", + "role_address#0": "bytes" + }, + "block": "_role_is_active", + "stack_in": [], + "op": "proto 2 1" + }, + "6779": { + "op": "pushbytes \"\"", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "6781": { + "op": "frame_dig -2", + "defined_out": [ + "role_map#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "role_map#0 (copy)" + ] + }, + "6783": { + "op": "frame_dig -1", + "defined_out": [ + "role_address#0 (copy)", + "role_map#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "role_map#0 (copy)", + "role_address#0 (copy)" + ] + }, + "6785": { + "op": "concat", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ] + }, + "6786": { + "op": "dup", + "defined_out": [ + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "6787": { + "op": "box_len", + "defined_out": [ + "_%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "_%0#0", + "maybe_exists%0#0" + ] + }, + "6788": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "maybe_exists%0#0" + ] + }, + "6790": { + "op": "bz _role_is_active_bool_false@4", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ] + }, + "6793": { + "op": "frame_dig 1", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "6795": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%0#0", + "aggregate%box_get%1#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0", + "aggregate%box_get%1#0" + ] + }, + "6796": { + "error": "check BoxMap entry exists", + "op": "assert // check BoxMap entry exists", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0" + ] + }, + "6797": { + "op": "intc_0 // 0", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%0#0", + "0" + ] + }, + "6798": { + "op": "extract_uint64", + "defined_out": [ + "box_prefixed_key%0#1", + "values%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0" + ] + }, + "6799": { + "op": "global LatestTimestamp" + }, + "6801": { + "op": "dup", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0", + "awst_tmp%0#0", + "awst_tmp%0#0" + ] + }, + "6802": { + "op": "frame_bury 0", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%0#0", + "awst_tmp%0#0" + ] + }, + "6804": { + "op": "<=", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "tmp%1#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "tmp%1#0" + ] + }, + "6805": { + "op": "bz _role_is_active_bool_false@4", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ] + }, + "6808": { + "op": "frame_dig 1", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "box_prefixed_key%0#1" + ] + }, + "6810": { + "op": "box_get", + "defined_out": [ + "aggregate%box_get%2#0", + "aggregate%box_get%3#0", + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%2#0", + "aggregate%box_get%3#0" + ] + }, + "6811": { + "error": "check BoxMap entry exists", + "op": "assert // check BoxMap entry exists", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%2#0" + ] + }, + "6812": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "aggregate%box_get%2#0", + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "aggregate%box_get%2#0", + "8" + ] + }, + "6813": { + "op": "extract_uint64", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%1#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%1#0" + ] + }, + "6814": { + "op": "frame_dig 0", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "values%1#0", + "awst_tmp%0#0" + ] + }, + "6816": { + "op": ">=", + "defined_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "tmp%2#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "tmp%2#0" + ] + }, + "6817": { + "op": "bz _role_is_active_bool_false@4", + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ] + }, + "6820": { + "op": "intc_1 // 1", + "defined_out": [ + "and_result%0#0", + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "and_result%0#0" + ] + }, + "6821": { + "block": "_role_is_active_bool_merge@5", + "stack_in": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "and_result%0#0" + ], + "op": "frame_bury 0", + "defined_out": [ + "and_result%0#0" + ] + }, + "6823": { + "retsub": true, + "op": "retsub" + }, + "6824": { + "block": "_role_is_active_bool_false@4", + "stack_in": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1" + ], + "op": "intc_0 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "box_prefixed_key%0#1", + "and_result%0#0" + ] + }, + "6825": { + "op": "b _role_is_active_bool_merge@5" + }, + "6828": { + "subroutine": "modules.rbac.RbacModule._assert_caller_is_arranger", + "params": {}, + "block": "_assert_caller_is_arranger", + "stack_in": [], + "op": "txn Sender", + "defined_out": [ + "role_address#0" + ], + "stack_out": [ + "role_address#0" + ] + }, + "6830": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0" + ] + }, + "6831": { + "op": "bytec 18 // 0x523a41525223", + "defined_out": [ + "0", + "0x523a41525223", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "0", + "0x523a41525223" + ] + }, + "6833": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "role_address#0" + ], + "stack_out": [ + "role_address#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6834": { + "error": "check self.arranger exists", + "op": "assert // check self.arranger exists", + "stack_out": [ + "role_address#0", + "maybe_value%0#0" + ] + }, + "6835": { + "op": "==", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "6836": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [] + }, + "6837": { + "retsub": true, + "op": "retsub" + }, + "6838": { + "subroutine": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "params": {}, + "block": "_assert_is_not_contract_defaulted", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "6839": { + "op": "bytec 34 // \"defaulted\"", + "defined_out": [ + "\"defaulted\"", + "0" + ], + "stack_out": [ + "0", + "\"defaulted\"" + ] + }, + "6841": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6842": { + "error": "check self.defaulted exists", + "op": "assert // check self.defaulted exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "6843": { + "op": "!", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "6844": { + "error": "Defaulted", + "op": "assert // Defaulted", + "stack_out": [] + }, + "6845": { + "retsub": true, + "op": "retsub" + }, + "6846": { + "subroutine": "modules.rbac.RbacModule._assert_is_not_contract_suspended", + "params": {}, + "block": "_assert_is_not_contract_suspended", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "6847": { + "op": "bytec 33 // \"contract_suspended\"", + "defined_out": [ + "\"contract_suspended\"", + "0" + ], + "stack_out": [ + "0", + "\"contract_suspended\"" + ] + }, + "6849": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "6850": { + "error": "check self.contract_suspended exists", + "op": "assert // check self.contract_suspended exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "6851": { + "op": "!", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "6852": { + "error": "Suspended operations", + "op": "assert // Suspended operations", + "stack_out": [] + }, + "6853": { + "retsub": true, + "op": "retsub" + }, + "6854": { + "subroutine": "modules.rbac.RbacModule._assert_valid_role", + "params": { + "role_id#0": "uint64" + }, + "block": "_assert_valid_role", + "stack_in": [], + "op": "proto 1 0" + }, + "6857": { + "op": "frame_dig -1", + "defined_out": [ + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6859": { + "op": "pushint 20", + "defined_out": [ + "20", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "20" + ] + }, + "6861": { + "op": "==", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "6862": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "6865": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6867": { + "op": "pushint 25", + "defined_out": [ + "25", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "25" + ] + }, + "6869": { + "op": "==", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "6870": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "6873": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6875": { + "op": "pushint 40", + "defined_out": [ + "40", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "40" + ] + }, + "6877": { + "op": "==", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "6878": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "6881": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6883": { + "op": "pushint 50", + "defined_out": [ + "50", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "50" + ] + }, + "6885": { + "op": "==", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0" + ] + }, + "6886": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "6889": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6891": { + "op": "pushint 60", + "defined_out": [ + "60", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "60" + ] + }, + "6893": { + "op": "==", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "6894": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "6897": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6899": { + "op": "pushint 70", + "defined_out": [ + "70", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "70" + ] + }, + "6901": { + "op": "==", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "tmp%5#0" + ] + }, + "6902": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "6905": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "6907": { + "op": "pushint 80", + "defined_out": [ + "80", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "80" + ] + }, + "6909": { + "op": "==", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "6910": { + "op": "bz _assert_valid_role_bool_false@8", + "stack_out": [] + }, + "6913": { + "block": "_assert_valid_role_bool_true@7", + "stack_in": [], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "or_result%0#0" + ] + }, + "6914": { + "error": "Invalid role identifier", + "block": "_assert_valid_role_bool_merge@9", + "stack_in": [ + "or_result%0#0" + ], + "op": "assert // Invalid role identifier", + "defined_out": [], + "stack_out": [] + }, + "6915": { + "retsub": true, + "op": "retsub" + }, + "6916": { + "block": "_assert_valid_role_bool_false@8", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "or_result%0#0" + ] + }, + "6917": { + "op": "b _assert_valid_role_bool_merge@9" + } + } +} \ No newline at end of file diff --git a/smart_contracts/artifacts/d_asa/DASA.approval.teal b/smart_contracts/artifacts/d_asa/DASA.approval.teal new file mode 100644 index 00000000..7f811ea6 --- /dev/null +++ b/smart_contracts/artifacts/d_asa/DASA.approval.teal @@ -0,0 +1,7142 @@ +#pragma version 12 +#pragma typetrack false + +// algopy.arc4.ARC4Contract.approval_program() -> uint64: +main: + intcblock 0 1 8 32 1500 + bytecblock 0x151f7c75 "status" "event_cursor" "schedule_entry_count" "outstanding_principal" "fixed_point_scale" "accrued_interest" "interest_calculation_base" 0x4123 "nominal_interest_rate" "contract_type" "reserved_units_total" "reserved_principal" "total_units" "next_principal_redemption" "reserved_interest" "cumulative_interest_index" "cumulative_principal_index" 0x523a41525223 "settlement_asset_id" "initial_exchange_amount" 0x523a41555423 0x523a50594423 0x523a4d4e4723 0x5323 0x523a4d4f4323 0x523a54525323 0x523a4f504423 "initial_exchange_date" "transfer_opening_date" "transfer_closure_date" "rate_reset_floor" "rate_reset_cap" "contract_suspended" "defaulted" "dynamic_principal_redemption" "rate_reset_spread" "rate_reset_multiplier" "rate_reset_next" "has_rate_reset_floor" "has_rate_reset_cap" 0x00 "prospectus_hash" "prospectus_url" "denomination_asset_id" "maturity_date" "day_count_convention" 0x068101 0x0000 + txn ApplicationID + bnz main_after_if_else@2 + // modules/rbac.py:28-29 + // # RBAC Roles + // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) + bytec 18 // 0x523a41525223 + global ZeroAddress + app_global_put + // modules/rbac.py:30 + // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) + bytec 27 // 0x523a4f504423 + global ZeroAddress + app_global_put + // modules/rbac.py:47-48 + // # Contract Governance + // self.contract_suspended = False + bytec 33 // "contract_suspended" + intc_0 // 0 + app_global_put + // modules/rbac.py:50-51 + // # Contract Performance + // self.defaulted = False + bytec 34 // "defaulted" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:56-57 + // # Contract + // self.status = UInt64(enums.STATUS_INACTIVE) + bytec_1 // "status" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:58 + // self.contract_type = UInt64() + bytec 10 // "contract_type" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:60-61 + // # Prospectus (Informational) + // self.prospectus_hash = Bytes() + bytec 42 // "prospectus_hash" + pushbytes 0x + app_global_put + // modules/actus_kernel.py:62 + // self.prospectus_url = String() + bytec 43 // "prospectus_url" + pushbytes "" + app_global_put + // modules/actus_kernel.py:64-65 + // # Denomination + // self.denomination_asset_id = Asset() + bytec 44 // "denomination_asset_id" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:66 + // self.settlement_asset_id = Asset() + bytec 19 // "settlement_asset_id" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:68-69 + // # Time + // self.initial_exchange_date = typ.TimeStamp() + bytec 28 // "initial_exchange_date" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:70 + // self.maturity_date = typ.TimeStamp() + bytec 45 // "maturity_date" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:71 + // self.transfer_opening_date = typ.TimeStamp() + bytec 29 // "transfer_opening_date" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:72 + // self.transfer_closure_date = typ.TimeStamp() + bytec 30 // "transfer_closure_date" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:74-75 + // # Day Count Convention + // self.day_count_convention = UInt64() + bytec 46 // "day_count_convention" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:77-78 + // # Units + // self.total_units = UInt64() + bytec 13 // "total_units" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:79 + // self.reserved_units_total = UInt64() + bytec 11 // "reserved_units_total" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:81-82 + // # Principal + // self.initial_exchange_amount = UInt64() + bytec 20 // "initial_exchange_amount" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:83 + // self.outstanding_principal = UInt64() + bytec 4 // "outstanding_principal" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:84 + // self.next_principal_redemption = UInt64() + bytec 14 // "next_principal_redemption" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:85 + // self.dynamic_principal_redemption = False + bytec 35 // "dynamic_principal_redemption" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:87-88 + // # Interest + // self.interest_calculation_base = UInt64() + bytec 7 // "interest_calculation_base" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:89 + // self.accrued_interest = UInt64() + bytec 6 // "accrued_interest" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:91-92 + // # Interest Rates + // self.nominal_interest_rate = UInt64() + bytec 9 // "nominal_interest_rate" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:93 + // self.rate_reset_spread = UInt64() + bytec 36 // "rate_reset_spread" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:94 + // self.rate_reset_multiplier = UInt64() + bytec 37 // "rate_reset_multiplier" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:95 + // self.rate_reset_floor = UInt64() + bytec 31 // "rate_reset_floor" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:96 + // self.rate_reset_cap = UInt64() + bytec 32 // "rate_reset_cap" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:97 + // self.rate_reset_next = UInt64() + bytec 38 // "rate_reset_next" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:98 + // self.has_rate_reset_floor = False + bytec 39 // "has_rate_reset_floor" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:99 + // self.has_rate_reset_cap = False + bytec 40 // "has_rate_reset_cap" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:101-102 + // # Primary Distribution + // self.reserved_principal = UInt64() + bytec 12 // "reserved_principal" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:103 + // self.reserved_interest = UInt64() + bytec 15 // "reserved_interest" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:105-106 + // # Cumulative Per-Unit Fixed-Point Indexes + // self.cumulative_interest_index = UInt64() + bytec 16 // "cumulative_interest_index" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:107 + // self.cumulative_principal_index = UInt64() + bytec 17 // "cumulative_principal_index" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:115 + // self.event_cursor = UInt64() + bytec_2 // "event_cursor" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:116 + // self.schedule_entry_count = UInt64() + bytec_3 // "schedule_entry_count" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:118-119 + // # Scaling + // self.fixed_point_scale = UInt64() + bytec 5 // "fixed_point_scale" + intc_0 // 0 + app_global_put + // smart_contracts/d_asa/contract.py:23 + // assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES + txn GlobalNumByteSlice + pushint 10 + == + assert // Wrong Global Bytes allocation + // smart_contracts/d_asa/contract.py:24 + // assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS + txn GlobalNumUint + pushint 54 + == + assert // Wrong Global UInts allocation + // smart_contracts/d_asa/contract.py:25 + // assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES + txn LocalNumByteSlice + ! + assert // Wrong Local Bytes allocation + // smart_contracts/d_asa/contract.py:26 + // assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS + txn LocalNumUint + ! + assert // Wrong Local UInts allocation + +main_after_if_else@2: + // smart_contracts/d_asa/contract.py:8-18 + // class DASA( + // PaymentAgent, + // TransferAgent, + // state_totals=StateTotals( + // global_bytes=cfg.GLOBAL_BYTES, + // global_uints=cfg.GLOBAL_UINTS, + // local_bytes=cfg.LOCAL_BYTES, + // local_uints=cfg.LOCAL_UINTS, + // ), + // avm_version=12, + // ): + pushbytes 0x914f04eb // method "contract_update()void" + txna ApplicationArgs 0 + match main_contract_update_route@4 + +main_switch_case_next@5: + // smart_contracts/d_asa/contract.py:8-18 + // class DASA( + // PaymentAgent, + // TransferAgent, + // state_totals=StateTotals( + // global_bytes=cfg.GLOBAL_BYTES, + // global_uints=cfg.GLOBAL_UINTS, + // local_bytes=cfg.LOCAL_BYTES, + // local_uints=cfg.LOCAL_UINTS, + // ), + // avm_version=12, + // ): + txn OnCompletion + ! + assert + txn ApplicationID + bz main_create_NoOp@33 + pushbytess 0xb44618c8 0xe7832529 0x94388723 0x6c85e3ee 0xbdd1a944 0x7c0f1812 0x14fc10ef 0x74a7297f 0x09d4fe14 0x9a9bfa85 0x85eed33d 0xab2c0fc4 0xd9f225ac 0x9883505a 0x8ea6e74c 0x02af557a 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x39241fa3 0x010c8299 0x7406acd2 0x1a72a2ee // method "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", method "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", method "transfer_set_schedule(uint64,uint64)uint64", method "primary_distribution(address,uint64)uint64", method "transfer(address,address,uint64)uint64", method "account_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_update_payment_address(address,address)uint64", method "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", method "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", method "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", method "contract_execute_ied()uint64", method "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", method "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_contract_suspension(bool)uint64", method "rbac_contract_default(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" + txna ApplicationArgs 0 + match fund_due_cashflows claim_due_cashflows transfer_set_schedule primary_distribution transfer account_suspension account_open account_update_payment_address account_get_position contract_config contract_schedule contract_execute_ied apply_non_cash_event append_observed_cash_event contract_get_state contract_get_next_due_event rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_contract_default rbac_get_arranger rbac_get_address_roles rbac_get_role_validity + err + +main_create_NoOp@33: + // smart_contracts/d_asa/contract.py:8-18 + // class DASA( + // PaymentAgent, + // TransferAgent, + // state_totals=StateTotals( + // global_bytes=cfg.GLOBAL_BYTES, + // global_uints=cfg.GLOBAL_UINTS, + // local_bytes=cfg.LOCAL_BYTES, + // local_uints=cfg.LOCAL_UINTS, + // ), + // avm_version=12, + // ): + pushbytes 0x956d7156 // method "contract_create(address)uint64" + txna ApplicationArgs 0 + match contract_create + err + +main_contract_update_route@4: + // modules/rbac.py:150 + // @arc4.abimethod(allow_actions=["UpdateApplication"]) + txn OnCompletion + pushint 4 // UpdateApplication + == + txn ApplicationID + && + assert + b contract_update + + +// _puya_lib.util.ensure_budget(required_budget: uint64, fee_source: uint64) -> void: +ensure_budget: + proto 2 0 + frame_dig -2 + pushint 10 + + + +ensure_budget_while_top@1: + frame_dig 0 + global OpcodeBudget + > + bz ensure_budget_after_while@6 + itxn_begin + pushint 6 // appl + itxn_field TypeEnum + pushint 5 // DeleteApplication + itxn_field OnCompletion + bytec 47 // 0x068101 + itxn_field ApprovalProgram + bytec 47 // 0x068101 + itxn_field ClearStateProgram + frame_dig -1 + switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4 + +ensure_budget_switch_case_next@5: + itxn_submit + b ensure_budget_while_top@1 + +ensure_budget_switch_case_1@4: + global MinTxnFee + itxn_field Fee + b ensure_budget_switch_case_next@5 + +ensure_budget_switch_case_0@3: + intc_0 // 0 + itxn_field Fee + b ensure_budget_switch_case_next@5 + +ensure_budget_after_while@6: + retsub + + +// modules.payment_agent.PaymentAgent.fund_due_cashflows[routing]() -> void: +fund_due_cashflows: + intc_0 // 0 + pushbytes "" + dupn 13 + // modules/payment_agent.py:47 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + // modules/actus_kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/payment_agent.py:68 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/payment_agent.py:69 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/payment_agent.py:70 + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended + // modules/actus_kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/actus_kernel.py:147 + // assert not self._status_is_pending_ied(), err.PENDING_IED + ! + assert // IED not yet executed + // modules/payment_agent.py:72 + // if self._is_dynamic_annuity(): + callsub _is_dynamic_annuity + bz fund_due_cashflows_after_if_else@3 + // modules/payment_agent.py:76-77 + // + max_event_count + // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + dup + // modules/payment_agent.py:77 + // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + pushint 100 + // modules/payment_agent.py:76-77 + // + max_event_count + // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + * + // modules/payment_agent.py:75 + // UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET) + intc 4 // 1500 + // modules/payment_agent.py:75-77 + // UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET) + // + max_event_count + // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + + + // modules/payment_agent.py:73-79 + // ensure_budget( + // required_budget=( + // UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET) + // + max_event_count + // * UInt64(cst.OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET) + // ), + // ) + intc_0 // 0 + callsub ensure_budget + +fund_due_cashflows_after_if_else@3: + // modules/payment_agent.py:81 + // processed_events = UInt64(0) + intc_0 // 0 + bury 5 + // modules/payment_agent.py:82 + // funded_interest = UInt64(0) + intc_0 // 0 + bury 14 + // modules/payment_agent.py:83 + // funded_principal = UInt64(0) + intc_0 // 0 + bury 13 + +fund_due_cashflows_while_top@4: + // modules/payment_agent.py:86 + // processed_events < max_event_count + dig 4 + dig 1 + < + // modules/payment_agent.py:86-87 + // processed_events < max_event_count + // and self.event_cursor < self.schedule_entry_count + bz fund_due_cashflows_after_while@11 + // modules/payment_agent.py:87 + // and self.event_cursor < self.schedule_entry_count + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + < + // modules/payment_agent.py:86-87 + // processed_events < max_event_count + // and self.event_cursor < self.schedule_entry_count + bz fund_due_cashflows_after_while@11 + // modules/payment_agent.py:89 + // entry = self._get_schedule_entry(self.event_cursor) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + callsub _get_schedule_entry + dup + bury 17 + // modules/payment_agent.py:90 + // if entry.scheduled_time > Global.latest_timestamp: + pushint 9 + extract_uint64 + dup + bury 3 + global LatestTimestamp + > + bnz fund_due_cashflows_after_while@11 + // modules/payment_agent.py:92 + // if not self._event_is_cash(entry.event_type.as_uint64()): + dig 15 + intc_2 // 8 + getbyte + dup + bury 16 + // modules/actus_kernel.py:351 + // UInt64(enums.EVT_IP), + intc_2 // 8 + // modules/actus_kernel.py:350-354 + // return event_type in ( + // UInt64(enums.EVT_IP), + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_MD), + // ) + == + dup + bury 4 + bnz fund_due_cashflows_bool_true@52 + dig 14 + // modules/actus_kernel.py:352 + // UInt64(enums.EVT_PR), + pushint 3 + // modules/actus_kernel.py:350-354 + // return event_type in ( + // UInt64(enums.EVT_IP), + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_MD), + // ) + == + bnz fund_due_cashflows_bool_true@52 + dig 14 + // modules/actus_kernel.py:353 + // UInt64(enums.EVT_MD), + pushint 19 + // modules/actus_kernel.py:350-354 + // return event_type in ( + // UInt64(enums.EVT_IP), + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_MD), + // ) + == + bz fund_due_cashflows_bool_false@53 + +fund_due_cashflows_bool_true@52: + intc_1 // 1 + +fund_due_cashflows_bool_merge@54: + // modules/payment_agent.py:92 + // if not self._event_is_cash(entry.event_type.as_uint64()): + bz fund_due_cashflows_after_while@11 + // modules/actus_kernel.py:548 + // assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + dig 15 + intc_0 // 0 + extract_uint64 + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + == + assert // Invalid event cursor + // modules/actus_kernel.py:549 + // assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW + dig 1 + global LatestTimestamp + <= + assert // No due cashflow to pay + // modules/actus_kernel.py:413 + // if event_type not in (UInt64(enums.EVT_IP), UInt64(enums.EVT_MD)): + dig 2 + bnz fund_due_cashflows_after_if_else@15 + dig 14 + pushint 19 + == + bnz fund_due_cashflows_after_if_else@15 + // modules/actus_kernel.py:414 + // return UInt64(0) + intc_0 // 0 + bury 11 + +fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16: + // modules/actus_kernel.py:426 + // event_type = entry.event_type.as_uint64() + dig 15 + intc_2 // 8 + getbyte + dup + bury 16 + // modules/actus_kernel.py:427 + // if event_type not in (UInt64(enums.EVT_PR), UInt64(enums.EVT_MD)): + pushint 3 + == + bnz fund_due_cashflows_after_if_else@19 + dig 14 + pushint 19 + == + bnz fund_due_cashflows_after_if_else@19 + // modules/actus_kernel.py:428 + // return UInt64(0) + intc_0 // 0 + bury 6 + +fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28: + // modules/actus_kernel.py:553 + // next_outstanding_principal = entry.next_outstanding_principal + dig 15 + pushint 49 + extract_uint64 + bury 8 + // modules/actus_kernel.py:556 + // if self._is_dynamic_annuity(): + callsub _is_dynamic_annuity + bnz fund_due_cashflows_if_body@29 + dig 7 + bury 9 + +fund_due_cashflows_after_if_else@38: + // modules/actus_kernel.py:572-574 + // # Funding uses per-unit cumulative indices so each holder can settle + // # independently from its current unit balance. + // interest_index_delta = self._amount_to_index_delta(interest_amount_due) + dig 10 + callsub _amount_to_index_delta + // modules/actus_kernel.py:575 + // principal_index_delta = self._amount_to_index_delta(principal_amount_due) + dig 6 + callsub _amount_to_index_delta + // modules/actus_kernel.py:576 + // interest_amount = self._index_delta_to_amount(interest_index_delta) + dig 1 + callsub _index_delta_to_amount + dup + cover 2 + bury 15 + // modules/actus_kernel.py:577 + // principal_amount = self._index_delta_to_amount(principal_index_delta) + dup + callsub _index_delta_to_amount + dup + bury 11 + // modules/actus_kernel.py:578 + // required_amount = interest_amount + principal_amount + dig 2 + dig 1 + + + dup + bury 9 + // modules/actus_kernel.py:734 + // balance = self.settlement_asset_id.balance(Global.current_application_address) + global CurrentApplicationAddress + intc_0 // 0 + bytec 19 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + asset_holding_get AssetBalance + assert // account opted into asset + // modules/actus_kernel.py:456 + // return self.reserved_interest + self.reserved_principal + intc_0 // 0 + bytec 15 // "reserved_interest" + app_global_get_ex + assert // check self.reserved_interest exists + intc_0 // 0 + bytec 12 // "reserved_principal" + app_global_get_ex + assert // check self.reserved_principal exists + dig 1 + + + // modules/actus_kernel.py:736 + // assert balance >= reserved_total, err.NOT_ENOUGH_FUNDS + dig 2 + dig 1 + >= + assert // Not enough funds for the payment + // modules/actus_kernel.py:737 + // return balance - reserved_total + uncover 2 + swap + - + // modules/actus_kernel.py:580 + // self._available_settlement_funds() >= required_amount + uncover 2 + >= + // modules/actus_kernel.py:579-581 + // assert ( + // self._available_settlement_funds() >= required_amount + // ), err.NOT_ENOUGH_FUNDS + assert // Not enough funds for the payment + // modules/actus_kernel.py:583 + // self.reserved_interest += interest_amount + uncover 3 + + + bytec 15 // "reserved_interest" + swap + app_global_put + // modules/actus_kernel.py:584 + // self.reserved_principal += principal_amount + intc_0 // 0 + bytec 12 // "reserved_principal" + app_global_get_ex + assert // check self.reserved_principal exists + + + bytec 12 // "reserved_principal" + swap + app_global_put + // modules/actus_kernel.py:585 + // self.cumulative_interest_index += interest_index_delta + intc_0 // 0 + bytec 16 // "cumulative_interest_index" + app_global_get_ex + assert // check self.cumulative_interest_index exists + uncover 2 + + + bytec 16 // "cumulative_interest_index" + swap + app_global_put + // modules/actus_kernel.py:586 + // self.cumulative_principal_index += principal_index_delta + intc_0 // 0 + bytec 17 // "cumulative_principal_index" + app_global_get_ex + assert // check self.cumulative_principal_index exists + + + bytec 17 // "cumulative_principal_index" + swap + app_global_put + // modules/actus_kernel.py:587 + // if entry.event_type.as_uint64() == UInt64(enums.EVT_PR): + dig 15 + intc_2 // 8 + getbyte + pushint 3 + == + bz fund_due_cashflows_else_body@40 + // modules/actus_kernel.py:588-589 + // # For PR, the period interest stays accrued until a later IP or MD. + // self.accrued_interest += self._entry_interest_segment(entry) + intc_0 // 0 + bytec 6 // "accrued_interest" + app_global_get_ex + assert // check self.accrued_interest exists + dig 16 + callsub _entry_interest_segment + bury 18 + + + bytec 6 // "accrued_interest" + swap + app_global_put + +fund_due_cashflows_after_if_else@41: + // modules/actus_kernel.py:592 + // if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( + callsub _is_dynamic_annuity + bz fund_due_cashflows_if_body@43 + dig 15 + intc_2 // 8 + getbyte + // modules/actus_kernel.py:592-594 + // if not self._is_dynamic_annuity() or entry.event_type.as_uint64() == UInt64( + // enums.EVT_MD + // ): + pushint 19 + == + bz fund_due_cashflows_after_if_else@44 + +fund_due_cashflows_if_body@43: + // modules/actus_kernel.py:595 + // self.next_principal_redemption = entry.next_principal_redemption + dig 15 + pushint 41 + extract_uint64 + bytec 14 // "next_principal_redemption" + swap + app_global_put + +fund_due_cashflows_after_if_else@44: + // modules/actus_kernel.py:596 + // self.outstanding_principal = next_outstanding_principal + bytec 4 // "outstanding_principal" + dig 8 + app_global_put + // modules/actus_kernel.py:597 + // self.interest_calculation_base = next_interest_base + bytec 7 // "interest_calculation_base" + dig 9 + app_global_put + // modules/actus_kernel.py:598 + // self.event_cursor += UInt64(1) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_1 // 1 + + + bytec_2 // "event_cursor" + swap + app_global_put + // modules/actus_kernel.py:600 + // if entry.event_type == arc4.UInt8( + dig 15 + extract 8 1 + // modules/actus_kernel.py:600-602 + // if entry.event_type == arc4.UInt8( + // enums.EVT_MD + // ) and self.outstanding_principal == UInt64(0): + pushbytes 0x13 + b== + bz fund_due_cashflows_after_if_else@47 + // modules/actus_kernel.py:602 + // ) and self.outstanding_principal == UInt64(0): + intc_0 // 0 + bytec 4 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + // modules/actus_kernel.py:600-602 + // if entry.event_type == arc4.UInt8( + // enums.EVT_MD + // ) and self.outstanding_principal == UInt64(0): + bnz fund_due_cashflows_after_if_else@47 + // modules/actus_kernel.py:603 + // self.status = UInt64(enums.STATUS_ENDED) + bytec_1 // "status" + pushint 200 + app_global_put + // modules/actus_kernel.py:604 + // self.interest_calculation_base = UInt64(0) + bytec 7 // "interest_calculation_base" + intc_0 // 0 + app_global_put + +fund_due_cashflows_after_if_else@47: + // modules/actus_kernel.py:606-610 + // self._emit_execution_event( + // entry=entry, + // payoff=interest_amount + principal_amount, + // settled_amount=interest_amount + principal_amount, + // ) + dig 15 + dig 4 + dup + callsub _emit_execution_event + pop + // modules/payment_agent.py:96 + // funded_interest += interest_amount + dig 13 + dig 12 + + + bury 14 + // modules/payment_agent.py:97 + // funded_principal += principal_amount + dig 12 + dig 7 + + + bury 13 + // modules/payment_agent.py:98 + // processed_events += UInt64(1) + dig 4 + intc_1 // 1 + + + bury 5 + b fund_due_cashflows_while_top@4 + +fund_due_cashflows_else_body@40: + // modules/actus_kernel.py:591 + // self.accrued_interest = UInt64(0) + bytec 6 // "accrued_interest" + intc_0 // 0 + app_global_put + b fund_due_cashflows_after_if_else@41 + +fund_due_cashflows_if_body@29: + // modules/actus_kernel.py:557 + // event_type = entry.event_type.as_uint64() + dig 15 + intc_2 // 8 + getbyte + dup + bury 16 + // modules/actus_kernel.py:558-560 + // # Dynamic annuities derive next state from the payment decomposition, + // # not only from the precomputed `next_*` fields. + // if event_type == UInt64(enums.EVT_PR): + pushint 3 + == + bz fund_due_cashflows_else_body@31 + // modules/actus_kernel.py:562 + // self.outstanding_principal - principal_amount_due + intc_0 // 0 + bytec 4 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + dig 6 + - + dup + bury 9 + bury 9 + b fund_due_cashflows_after_if_else@38 + +fund_due_cashflows_else_body@31: + // modules/actus_kernel.py:565 + // elif event_type == UInt64(enums.EVT_IP): + dig 14 + intc_2 // 8 + == + bz fund_due_cashflows_else_body@33 + // modules/actus_kernel.py:566 + // next_outstanding_principal = self.outstanding_principal + intc_0 // 0 + bytec 4 // "outstanding_principal" + app_global_get_ex + swap + bury 9 + assert // check self.outstanding_principal exists + // modules/actus_kernel.py:567 + // next_interest_base = self.interest_calculation_base + intc_0 // 0 + bytec 7 // "interest_calculation_base" + app_global_get_ex + swap + bury 10 + assert // check self.interest_calculation_base exists + b fund_due_cashflows_after_if_else@38 + +fund_due_cashflows_else_body@33: + // modules/actus_kernel.py:568 + // elif event_type == UInt64(enums.EVT_MD): + dig 14 + pushint 19 + == + bnz fund_due_cashflows_if_body@34 + dig 7 + bury 9 + b fund_due_cashflows_after_if_else@38 + +fund_due_cashflows_if_body@34: + // modules/actus_kernel.py:569 + // next_outstanding_principal = UInt64(0) + intc_0 // 0 + bury 8 + // modules/actus_kernel.py:570 + // next_interest_base = UInt64(0) + intc_0 // 0 + bury 9 + b fund_due_cashflows_after_if_else@38 + +fund_due_cashflows_after_if_else@19: + // modules/actus_kernel.py:429 + // if self._is_dynamic_annuity(): + callsub _is_dynamic_annuity + bz fund_due_cashflows_after_if_else@27 + // modules/actus_kernel.py:430 + // if event_type == UInt64(enums.EVT_MD): + dig 14 + pushint 19 + == + bz fund_due_cashflows_after_if_else@22 + // modules/actus_kernel.py:431 + // return self.outstanding_principal + intc_0 // 0 + bytec 4 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + bury 6 + // modules/actus_kernel.py:552 + // principal_amount_due = self._entry_principal_amount(entry) + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 + +fund_due_cashflows_after_if_else@22: + // modules/actus_kernel.py:432 + // interest_due = self.accrued_interest + self._entry_interest_segment(entry) + intc_0 // 0 + bytec 6 // "accrued_interest" + app_global_get_ex + assert // check self.accrued_interest exists + dig 16 + callsub _entry_interest_segment + bury 18 + + + dup + bury 11 + // modules/actus_kernel.py:433 + // if self.next_principal_redemption <= interest_due: + intc_0 // 0 + bytec 14 // "next_principal_redemption" + app_global_get_ex + assert // check self.next_principal_redemption exists + >= + bz fund_due_cashflows_after_if_else@24 + // modules/actus_kernel.py:434 + // return UInt64(0) + intc_0 // 0 + bury 6 + // modules/actus_kernel.py:552 + // principal_amount_due = self._entry_principal_amount(entry) + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 + +fund_due_cashflows_after_if_else@24: + // modules/actus_kernel.py:435 + // principal_amount = self.next_principal_redemption - interest_due + intc_0 // 0 + bytec 14 // "next_principal_redemption" + app_global_get_ex + assert // check self.next_principal_redemption exists + dig 10 + - + dup + bury 8 + // modules/actus_kernel.py:436 + // if principal_amount > self.outstanding_principal: + intc_0 // 0 + bytec 4 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + > + bz fund_due_cashflows_after_if_else@26 + // modules/actus_kernel.py:437 + // return self.outstanding_principal + intc_0 // 0 + bytec 4 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + bury 6 + // modules/actus_kernel.py:552 + // principal_amount_due = self._entry_principal_amount(entry) + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 + +fund_due_cashflows_after_if_else@26: + dig 6 + bury 6 + // modules/actus_kernel.py:552 + // principal_amount_due = self._entry_principal_amount(entry) + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 + +fund_due_cashflows_after_if_else@27: + // modules/actus_kernel.py:440 + // entry.next_outstanding_principal <= self.outstanding_principal + dig 15 + pushint 49 + extract_uint64 + intc_0 // 0 + bytec 4 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + dup2 + <= + // modules/actus_kernel.py:439-441 + // assert ( + // entry.next_outstanding_principal <= self.outstanding_principal + // ), err.INVALID_ACTUS_CONFIG + assert // Invalid ACTUS configuration + // modules/actus_kernel.py:442 + // return self.outstanding_principal - entry.next_outstanding_principal + swap + - + bury 6 + // modules/actus_kernel.py:552 + // principal_amount_due = self._entry_principal_amount(entry) + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_principal_amount@28 + +fund_due_cashflows_after_if_else@15: + // modules/actus_kernel.py:415 + // return self.accrued_interest + self._entry_interest_segment(entry) + intc_0 // 0 + bytec 6 // "accrued_interest" + app_global_get_ex + assert // check self.accrued_interest exists + dig 16 + callsub _entry_interest_segment + bury 18 + + + bury 11 + // modules/actus_kernel.py:551 + // interest_amount_due = self._entry_interest_amount(entry) + b fund_due_cashflows_after_inlined_modules.actus_kernel.ActusKernelModule._entry_interest_amount@16 + +fund_due_cashflows_after_while@11: + // modules/payment_agent.py:100 + // assert processed_events > UInt64(0), err.NO_DUE_CASHFLOW + dig 4 + dup + assert // No due cashflow to pay + // modules/payment_agent.py:104 + // total_funded=funded_interest + funded_principal, + dig 14 + dup + dig 15 + dup + cover 3 + + + // modules/payment_agent.py:106 + // timestamp=Global.latest_timestamp, + global LatestTimestamp + // modules/payment_agent.py:101-107 + // return typ.CashFundingResult( + // funded_interest=funded_interest, + // funded_principal=funded_principal, + // total_funded=funded_interest + funded_principal, + // processed_events=processed_events, + // timestamp=Global.latest_timestamp, + // ) + uncover 2 + itob + uncover 3 + itob + concat + uncover 2 + itob + concat + uncover 2 + itob + concat + swap + itob + concat + // modules/payment_agent.py:47 + // @arc4.abimethod + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +fund_due_cashflows_bool_false@53: + intc_0 // 0 + b fund_due_cashflows_bool_merge@54 + + +// modules.payment_agent.PaymentAgent.claim_due_cashflows[routing]() -> void: +claim_due_cashflows: + pushbytes "" + dupn 2 + // modules/payment_agent.py:109 + // @arc4.abimethod + txna ApplicationArgs 1 + dupn 2 + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 2 + dup + intc_0 // 0 + extract_uint16 // on error: invalid array length header + pushint 2 + + + dig 1 + len + == + assert // invalid number of bytes for arc4.dynamic_array + extract 2 0 + swap + // modules/actus_kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x4123 + swap + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // modules/payment_agent.py:15 + // if self.op_daemon.value != Global.zero_address: + intc_0 // 0 + bytec 27 // 0x523a4f504423 + app_global_get_ex + assert // check self.op_daemon exists + global ZeroAddress + != + bz claim_due_cashflows_after_if_else@17 + // modules/payment_agent.py:17 + // Txn.sender == self.op_daemon.value + txn Sender + intc_0 // 0 + bytec 27 // 0x523a4f504423 + app_global_get_ex + assert // check self.op_daemon exists + == + // modules/payment_agent.py:17-19 + // Txn.sender == self.op_daemon.value + // or Txn.sender == holding_address + // or Txn.sender == self.account[holding_address].payment_address + bnz claim_due_cashflows_bool_true@14 + // modules/payment_agent.py:18 + // or Txn.sender == holding_address + txn Sender + dig 3 + == + // modules/payment_agent.py:17-19 + // Txn.sender == self.op_daemon.value + // or Txn.sender == holding_address + // or Txn.sender == self.account[holding_address].payment_address + bnz claim_due_cashflows_bool_true@14 + // modules/payment_agent.py:19 + // or Txn.sender == self.account[holding_address].payment_address + txn Sender + dig 1 + box_get + assert // check self.account entry exists + extract 0 32 + == + // modules/payment_agent.py:17-19 + // Txn.sender == self.op_daemon.value + // or Txn.sender == holding_address + // or Txn.sender == self.account[holding_address].payment_address + bz claim_due_cashflows_bool_false@15 + +claim_due_cashflows_bool_true@14: + intc_1 // 1 + +claim_due_cashflows_bool_merge@16: + // modules/payment_agent.py:16-20 + // assert ( + // Txn.sender == self.op_daemon.value + // or Txn.sender == holding_address + // or Txn.sender == self.account[holding_address].payment_address + // ), err.UNAUTHORIZED + assert // Not authorized + +claim_due_cashflows_after_if_else@17: + // modules/payment_agent.py:139 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/payment_agent.py:140 + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended + // modules/actus_kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/actus_kernel.py:147 + // assert not self._status_is_pending_ied(), err.PENDING_IED + ! + assert // IED not yet executed + // modules/payment_agent.py:143 + // self._ensure_units_activated(holding_address) + dig 2 + dup + callsub _ensure_units_activated + // modules/payment_agent.py:144 + // self._settle_position(holding_address) + callsub _settle_position + popn 2 + // modules/accounting.py:117 + // self.account[holding_address].claimable_interest + dup + box_get + assert // check self.account entry exists + dup + pushint 73 + extract_uint64 + dup + cover 2 + bury 8 + // modules/accounting.py:118 + // + self.account[holding_address].claimable_principal + dup + pushint 81 + extract_uint64 + dup + bury 8 + // modules/accounting.py:117-118 + // self.account[holding_address].claimable_interest + // + self.account[holding_address].claimable_principal + uncover 2 + + + dup + bury 6 + // modules/payment_agent.py:146 + // assert total_amount > UInt64(0), err.NO_DUE_CASHFLOW + assert // No due cashflow to pay + // modules/payment_agent.py:25 + // self.account[holding_address].payment_address.is_opted_in( + extract 0 32 + // modules/payment_agent.py:26 + // self.settlement_asset_id + intc_0 // 0 + bytec 19 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + // modules/payment_agent.py:25-27 + // self.account[holding_address].payment_address.is_opted_in( + // self.settlement_asset_id + // ) + asset_holding_get AssetBalance + bury 1 + // modules/payment_agent.py:25-28 + // self.account[holding_address].payment_address.is_opted_in( + // self.settlement_asset_id + // ) + // and not self.account[holding_address].suspended + bz claim_due_cashflows_bool_false@24 + // modules/payment_agent.py:28 + // and not self.account[holding_address].suspended + dup + box_get + assert // check self.account entry exists + pushint 384 + getbit + bnz claim_due_cashflows_bool_false@24 + intc_1 // 1 + +claim_due_cashflows_bool_merge@25: + // modules/payment_agent.py:151 + // if self._is_payment_executable(holding_address): + bz claim_due_cashflows_after_if_else@3 + // modules/payment_agent.py:34 + // self.settlement_asset_id.balance(Global.current_application_address) + global CurrentApplicationAddress + intc_0 // 0 + bytec 19 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + swap + dig 1 + asset_holding_get AssetBalance + assert // account opted into asset + // modules/payment_agent.py:34-35 + // self.settlement_asset_id.balance(Global.current_application_address) + // >= payment_amount + dig 5 + dup + cover 2 + >= + // modules/payment_agent.py:33-36 + // assert ( + // self.settlement_asset_id.balance(Global.current_application_address) + // >= payment_amount + // ), err.NOT_ENOUGH_FUNDS + assert // Not enough funds for the payment + // modules/payment_agent.py:153 + // self._pay(self.account[holding_address].payment_address, total_amount) + dig 2 + dup + cover 3 + box_get + assert // check self.account entry exists + dup + extract 0 32 + // modules/payment_agent.py:40-45 + // itxn.AssetTransfer( + // xfer_asset=self.settlement_asset_id, + // asset_receiver=receiver, + // asset_amount=amount, + // fee=Global.min_txn_fee, + // ).submit() + itxn_begin + // modules/payment_agent.py:44 + // fee=Global.min_txn_fee, + global MinTxnFee + uncover 3 + itxn_field AssetAmount + swap + itxn_field AssetReceiver + uncover 2 + itxn_field XferAsset + // modules/payment_agent.py:40 + // itxn.AssetTransfer( + pushint 4 // axfer + itxn_field TypeEnum + itxn_field Fee + // modules/payment_agent.py:40-45 + // itxn.AssetTransfer( + // xfer_asset=self.settlement_asset_id, + // asset_receiver=receiver, + // asset_amount=amount, + // fee=Global.min_txn_fee, + // ).submit() + itxn_submit + // modules/accounting.py:125-126 + // # Get the claimable amounts before reset + // interest_amount = position.claimable_interest + dup + pushint 73 + extract_uint64 + dup + cover 2 + bury 9 + // modules/accounting.py:127 + // principal_amount = position.claimable_principal + dup + pushint 81 + extract_uint64 + dup + cover 3 + bury 9 + // modules/accounting.py:129-130 + // # Reset the position's claimable amounts + // position.claimable_interest = UInt64(0) + intc_0 // 0 + itob + swap + dig 1 + replace2 73 + // modules/accounting.py:131 + // position.claimable_principal = UInt64(0) + swap + replace2 81 + // modules/accounting.py:132 + // self.account[holding_address] = position.copy() + uncover 3 + swap + box_put + // modules/accounting.py:134 + // assert self.reserved_interest >= interest_amount, err.NOT_ENOUGH_FUNDS + intc_0 // 0 + bytec 15 // "reserved_interest" + app_global_get_ex + assert // check self.reserved_interest exists + dup + dig 2 + >= + assert // Not enough funds for the payment + // modules/accounting.py:135 + // assert self.reserved_principal >= principal_amount, err.NOT_ENOUGH_FUNDS + intc_0 // 0 + bytec 12 // "reserved_principal" + app_global_get_ex + assert // check self.reserved_principal exists + dig 3 + >= + assert // Not enough funds for the payment + // modules/accounting.py:137-138 + // # Update the global reserved interest and principal amounts + // self.reserved_interest -= interest_amount + swap + - + bytec 15 // "reserved_interest" + swap + app_global_put + // modules/accounting.py:139 + // self.reserved_principal -= principal_amount + intc_0 // 0 + bytec 12 // "reserved_principal" + app_global_get_ex + assert // check self.reserved_principal exists + swap + - + bytec 12 // "reserved_principal" + swap + app_global_put + +claim_due_cashflows_after_if_else@3: + // modules/payment_agent.py:159 + // total_amount=interest_amount + principal_amount, + dig 5 + dup + dig 6 + dup + cover 3 + + + // modules/payment_agent.py:160 + // timestamp=Global.latest_timestamp, + global LatestTimestamp + // modules/payment_agent.py:156-162 + // return typ.CashClaimResult( + // interest_amount=interest_amount, + // principal_amount=principal_amount, + // total_amount=interest_amount + principal_amount, + // timestamp=Global.latest_timestamp, + // context=payment_info, + // ) + uncover 2 + itob + uncover 3 + itob + concat + uncover 2 + itob + concat + swap + itob + concat + dig 2 + dup + len + itob + extract 6 2 + swap + concat + swap + pushbytes 0x0022 + concat + swap + concat + // modules/payment_agent.py:109 + // @arc4.abimethod + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +claim_due_cashflows_bool_false@24: + intc_0 // 0 + b claim_due_cashflows_bool_merge@25 + +claim_due_cashflows_bool_false@15: + intc_0 // 0 + b claim_due_cashflows_bool_merge@16 + + +// modules.transfer_agent.TransferAgent.transfer_set_schedule[routing]() -> void: +transfer_set_schedule: + // modules/transfer_agent.py:22 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + txna ApplicationArgs 2 + dup + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + // modules/transfer_agent.py:40 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/transfer_agent.py:41 + // assert open_date < closure_date, err.INVALID_SORTING + dup2 + < + assert // Time events must be sorted in strictly ascending order + // modules/transfer_agent.py:43 + // self.transfer_opening_date = open_date + bytec 29 // "transfer_opening_date" + uncover 2 + app_global_put + // modules/transfer_agent.py:44 + // self.transfer_closure_date = closure_date + bytec 30 // "transfer_closure_date" + swap + app_global_put + // modules/transfer_agent.py:45 + // return Global.latest_timestamp + global LatestTimestamp + // modules/transfer_agent.py:22 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.transfer_agent.TransferAgent.primary_distribution[routing]() -> void: +primary_distribution: + // modules/transfer_agent.py:47 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 2 + dup + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + dup + cover 2 + // modules/actus_kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/rbac.py:73 + // assert self._role_is_active(self.primary_dealer, Txn.sender), err.UNAUTHORIZED + bytec 22 // 0x523a50594423 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/transfer_agent.py:76 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/transfer_agent.py:77 + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended + // modules/actus_kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/transfer_agent.py:78 + // assert self._status_is_pending_ied(), err.PRIMARY_DISTRIBUTION_CLOSED + assert // Primary distribution is closed + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x4123 + dig 2 + concat + dup + cover 3 + box_len + bury 1 + assert // Invalid account holding address + // modules/transfer_agent.py:80 + // self._assert_is_not_account_suspended(holding_address) + swap + callsub _assert_is_not_account_suspended + // modules/transfer_agent.py:81 + // assert units > UInt64(0), err.ZERO_UNITS + dup + assert // Can not distribute zero units + // modules/transfer_agent.py:83 + // self.reserved_units_total + units <= self.total_units + intc_0 // 0 + bytec 11 // "reserved_units_total" + app_global_get_ex + assert // check self.reserved_units_total exists + + + intc_0 // 0 + bytec 13 // "total_units" + app_global_get_ex + assert // check self.total_units exists + <= + // modules/transfer_agent.py:82-84 + // assert ( + // self.reserved_units_total + units <= self.total_units + // ), err.OVER_DISTRIBUTION + assert // Insufficient remaining D-ASA units + // modules/transfer_agent.py:85 + // if self.initial_exchange_date: + intc_0 // 0 + bytec 28 // "initial_exchange_date" + app_global_get_ex + assert // check self.initial_exchange_date exists + bz primary_distribution_after_if_else@3 + // modules/transfer_agent.py:87 + // Global.latest_timestamp <= self.initial_exchange_date + global LatestTimestamp + intc_0 // 0 + bytec 28 // "initial_exchange_date" + app_global_get_ex + assert // check self.initial_exchange_date exists + <= + // modules/transfer_agent.py:86-88 + // assert ( + // Global.latest_timestamp <= self.initial_exchange_date + // ), err.PRIMARY_DISTRIBUTION_CLOSED + assert // Primary distribution is closed + +primary_distribution_after_if_else@3: + // modules/accounting.py:148 + // self.account[holding_address].reserved_units += units + dupn 2 + box_get + assert // check self.account entry exists + pushint 40 + extract_uint64 + dig 3 + dup + cover 3 + + + itob + pushint 40 + swap + box_replace + // modules/transfer_agent.py:91 + // self.reserved_units_total += units + intc_0 // 0 + bytec 11 // "reserved_units_total" + app_global_get_ex + assert // check self.reserved_units_total exists + + + bytec 11 // "reserved_units_total" + dig 1 + app_global_put + // modules/transfer_agent.py:92 + // return self.total_units - self.reserved_units_total + intc_0 // 0 + bytec 13 // "total_units" + app_global_get_ex + assert // check self.total_units exists + swap + - + // modules/transfer_agent.py:47 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.transfer_agent.TransferAgent.transfer[routing]() -> void: +transfer: + intc_0 // 0 + dup + // modules/transfer_agent.py:94 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 2 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 3 + dupn 2 + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + // modules/actus_kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/transfer_agent.py:130 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/transfer_agent.py:131 + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended + // modules/actus_kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/actus_kernel.py:147 + // assert not self._status_is_pending_ied(), err.PENDING_IED + ! + assert // IED not yet executed + // modules/transfer_agent.py:13 + // if self.transfer_opening_date: + intc_0 // 0 + bytec 29 // "transfer_opening_date" + app_global_get_ex + assert // check self.transfer_opening_date exists + bz transfer_after_if_else@3 + // modules/transfer_agent.py:15 + // self.transfer_opening_date <= Global.latest_timestamp + intc_0 // 0 + bytec 29 // "transfer_opening_date" + app_global_get_ex + assert // check self.transfer_opening_date exists + global LatestTimestamp + <= + // modules/transfer_agent.py:14-16 + // assert ( + // self.transfer_opening_date <= Global.latest_timestamp + // ), err.CLOSED_TRANSFER + assert // Transfer is closed + +transfer_after_if_else@3: + // modules/transfer_agent.py:17 + // if self.transfer_closure_date: + intc_0 // 0 + bytec 30 // "transfer_closure_date" + app_global_get_ex + assert // check self.transfer_closure_date exists + bz transfer_after_if_else@5 + // modules/transfer_agent.py:19 + // Global.latest_timestamp < self.transfer_closure_date + global LatestTimestamp + intc_0 // 0 + bytec 30 // "transfer_closure_date" + app_global_get_ex + assert // check self.transfer_closure_date exists + < + // modules/transfer_agent.py:18-20 + // assert ( + // Global.latest_timestamp < self.transfer_closure_date + // ), err.CLOSED_TRANSFER + assert // Transfer is closed + +transfer_after_if_else@5: + // modules/transfer_agent.py:135 + // assert Txn.sender == sender_holding_address, err.UNAUTHORIZED + txn Sender + dig 4 + dup + cover 2 + == + assert // Not authorized + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x4123 + dig 1 + concat + dup + bury 8 + dup + box_len + bury 1 + assert // Invalid account holding address + bytec 8 // 0x4123 + dig 5 + dup + cover 2 + concat + dup + bury 9 + box_len + bury 1 + assert // Invalid account holding address + // modules/transfer_agent.py:138 + // self._assert_is_not_account_suspended(sender_holding_address) + dig 2 + callsub _assert_is_not_account_suspended + // modules/transfer_agent.py:139 + // self._assert_is_not_account_suspended(receiver_holding_address) + dup + callsub _assert_is_not_account_suspended + // modules/transfer_agent.py:140 + // assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER + uncover 2 + != + assert // Sender and receiver must be different + // modules/transfer_agent.py:141 + // assert units > UInt64(0), err.NULL_TRANSFER + dig 1 + dup + assert // Transfer units must be greater than zero + // modules/transfer_agent.py:142 + // assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER + swap + box_get + assert // check self.account entry exists + intc_3 // 32 + extract_uint64 + <= + assert // Insufficient sender units to transfer + // modules/actus_kernel.py:763 + // if self.event_cursor >= self.schedule_entry_count: + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + >= + bnz transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10 + // modules/actus_kernel.py:765 + // next_entry = self._get_schedule_entry(self.event_cursor) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + callsub _get_schedule_entry + // modules/actus_kernel.py:767 + // next_entry.scheduled_time > Global.latest_timestamp + pushint 9 + extract_uint64 + global LatestTimestamp + > + // modules/actus_kernel.py:766-768 + // assert ( + // next_entry.scheduled_time > Global.latest_timestamp + // ), err.PENDING_ACTUS_EVENT + assert // ACTUS event not yet executed + +transfer_after_inlined_modules.actus_kernel.ActusKernelModule._assert_no_due_event_pending@10: + // modules/transfer_agent.py:145 + // self._ensure_units_activated(sender_holding_address) + dig 3 + dup + callsub _ensure_units_activated + // modules/transfer_agent.py:146 + // self._ensure_units_activated(receiver_holding_address) + dig 3 + dup + cover 2 + callsub _ensure_units_activated + // modules/transfer_agent.py:147 + // self._settle_position(sender_holding_address) + callsub _settle_position + popn 2 + // modules/transfer_agent.py:148 + // self._settle_position(receiver_holding_address) + callsub _settle_position + popn 2 + // modules/accounting.py:152 + // assert units <= self.account[holding_address].units, err.OVER_TRANSFER + dig 5 + dup + box_get + assert // check self.account entry exists + intc_3 // 32 + extract_uint64 + dig 2 + dup + cover 2 + dig 1 + <= + assert // Insufficient sender units to transfer + // modules/accounting.py:153 + // self.account[holding_address].units -= units + dig 1 + - + itob + uncover 2 + intc_3 // 32 + uncover 2 + box_replace + // modules/accounting.py:144 + // self.account[holding_address].units += units + dig 5 + dup + box_get + assert // check self.account entry exists + intc_3 // 32 + extract_uint64 + uncover 2 + + + itob + intc_3 // 32 + swap + box_replace + // modules/transfer_agent.py:94 + // @arc4.abimethod + bytec_0 // 0x151f7c75 + dig 2 + concat + log + intc_1 // 1 + return + + +// modules.accounting.AccountingModule.account_suspension[routing]() -> void: +account_suspension: + // modules/accounting.py:165 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 2 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.bool + intc_0 // 0 + getbit + // modules/rbac.py:79 + // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED + bytec 21 // 0x523a41555423 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x4123 + uncover 2 + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // modules/accounting.py:185 + // self.account[holding_address].suspended = suspended + dup + pushint 48 + intc_1 // 1 + box_extract + intc_0 // 0 + uncover 3 + setbit + pushint 48 + swap + box_replace + // modules/accounting.py:186 + // return Global.latest_timestamp + global LatestTimestamp + // modules/accounting.py:165 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.accounting.AccountingModule.account_open[routing]() -> void: +account_open: + // modules/accounting.py:188 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 2 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:70 + // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED + bytec 23 // 0x523a4d4e4723 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/actus_kernel.py:139 + // return self.status == UInt64(enums.STATUS_ENDED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 200 + == + // modules/accounting.py:210 + // assert not self._status_is_ended(), err.UNAUTHORIZED + ! + assert // Not authorized + // modules/accounting.py:211 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/accounting.py:212 + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended + // modules/accounting.py:213 + // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x4123 + uncover 2 + concat + dup + box_len + bury 1 + ! + assert // Invalid account holding address + // modules/accounting.py:34 + // units=UInt64(0), + intc_0 // 0 + // modules/accounting.py:32-42 + // return typ.AccountPosition( + // payment_address=payment_address, + // units=UInt64(0), + // reserved_units=UInt64(0), + // suspended=False, + // settled_cursor=UInt64(0), + // interest_checkpoint=UInt64(0), + // principal_checkpoint=UInt64(0), + // claimable_interest=UInt64(0), + // claimable_principal=UInt64(0), + // ) + itob + uncover 2 + dig 1 + concat + dig 1 + concat + bytec 41 // 0x00 + concat + dig 1 + concat + dig 1 + concat + dig 1 + concat + dig 1 + concat + swap + concat + // modules/accounting.py:214 + // self.account[holding_address] = self._new_account_position(payment_address) + box_put + // modules/accounting.py:215 + // return Global.latest_timestamp + global LatestTimestamp + // modules/accounting.py:188 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.accounting.AccountingModule.account_update_payment_address[routing]() -> void: +account_update_payment_address: + // modules/accounting.py:217 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 2 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x4123 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // modules/accounting.py:238 + // assert Txn.sender == holding_address, err.UNAUTHORIZED + txn Sender + uncover 3 + == + assert // Not authorized + // modules/accounting.py:239 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/accounting.py:240 + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended + // modules/accounting.py:241 + // self.account[holding_address].payment_address = payment_address + intc_0 // 0 + uncover 2 + box_replace + // modules/accounting.py:242 + // return Global.latest_timestamp + global LatestTimestamp + // modules/accounting.py:217 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.accounting.AccountingModule.account_get_position[routing]() -> void: +account_get_position: + // modules/accounting.py:244 + // @arc4.abimethod(readonly=True) + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x4123 + swap + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // modules/accounting.py:259 + // return self.account[holding_address] + box_get + pop + // modules/accounting.py:244 + // @arc4.abimethod(readonly=True) + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.actus_kernel.ActusKernelModule.contract_create[routing]() -> void: +contract_create: + // modules/actus_kernel.py:1019 + // @arc4.abimethod(create="require") + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/actus_kernel.py:1033 + // self.arranger.value = arranger + bytec 18 // 0x523a41525223 + swap + app_global_put + // modules/actus_kernel.py:1034 + // return Global.latest_timestamp + global LatestTimestamp + // modules/actus_kernel.py:1019 + // @arc4.abimethod(create="require") + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.actus_kernel.ActusKernelModule.contract_config[routing]() -> void: +contract_config: + pushbytes "" + dup + // modules/actus_kernel.py:1036 + // @arc4.abimethod + txna ApplicationArgs 1 + dupn 2 + len + pushint 107 + == + assert // invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms + txna ApplicationArgs 2 + dup + cover 2 + len + pushint 72 + == + assert // invalid number of bytes for smart_contracts.abi_types.InitialKernelState + txna ApplicationArgs 3 + dup + cover 2 + dup + len + dig 1 + intc_3 // 32 + extract_uint16 // on error: invalid tuple encoding + dup + pushint 34 + == + assert // invalid tail pointer at index 1 of (uint8[32],(len+utf8[])) + uncover 2 + swap + dig 2 + substring3 + dup + cover 3 + intc_0 // 0 + extract_uint16 // on error: invalid array length header + pushint 36 + + + == + assert // invalid number of bytes for smart_contracts.abi_types.Prospectus + // modules/actus_kernel.py:1066 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/actus_kernel.py:1068-1069 + // # Configure Contract + // self.contract_type = terms.contract_type.as_uint64() + intc_0 // 0 + getbyte + dup + bytec 10 // "contract_type" + dig 1 + app_global_put + // modules/actus_kernel.py:218-225 + // return contract_type in ( + // UInt64(enums.CT_PAM), + // UInt64(enums.CT_ANN), + // UInt64(enums.CT_NAM), + // UInt64(enums.CT_LAM), + // UInt64(enums.CT_LAX), + // UInt64(enums.CT_CLM), + // ) + bz contract_config_bool_true@7 + dup + // modules/actus_kernel.py:220 + // UInt64(enums.CT_ANN), + intc_1 // 1 + // modules/actus_kernel.py:218-225 + // return contract_type in ( + // UInt64(enums.CT_PAM), + // UInt64(enums.CT_ANN), + // UInt64(enums.CT_NAM), + // UInt64(enums.CT_LAM), + // UInt64(enums.CT_LAX), + // UInt64(enums.CT_CLM), + // ) + == + bnz contract_config_bool_true@7 + dup + // modules/actus_kernel.py:221 + // UInt64(enums.CT_NAM), + pushint 2 + // modules/actus_kernel.py:218-225 + // return contract_type in ( + // UInt64(enums.CT_PAM), + // UInt64(enums.CT_ANN), + // UInt64(enums.CT_NAM), + // UInt64(enums.CT_LAM), + // UInt64(enums.CT_LAX), + // UInt64(enums.CT_CLM), + // ) + == + bnz contract_config_bool_true@7 + dup + // modules/actus_kernel.py:222 + // UInt64(enums.CT_LAM), + pushint 3 + // modules/actus_kernel.py:218-225 + // return contract_type in ( + // UInt64(enums.CT_PAM), + // UInt64(enums.CT_ANN), + // UInt64(enums.CT_NAM), + // UInt64(enums.CT_LAM), + // UInt64(enums.CT_LAX), + // UInt64(enums.CT_CLM), + // ) + == + bnz contract_config_bool_true@7 + dup + // modules/actus_kernel.py:223 + // UInt64(enums.CT_LAX), + pushint 4 + // modules/actus_kernel.py:218-225 + // return contract_type in ( + // UInt64(enums.CT_PAM), + // UInt64(enums.CT_ANN), + // UInt64(enums.CT_NAM), + // UInt64(enums.CT_LAM), + // UInt64(enums.CT_LAX), + // UInt64(enums.CT_CLM), + // ) + == + bnz contract_config_bool_true@7 + dup + // modules/actus_kernel.py:224 + // UInt64(enums.CT_CLM), + pushint 5 + // modules/actus_kernel.py:218-225 + // return contract_type in ( + // UInt64(enums.CT_PAM), + // UInt64(enums.CT_ANN), + // UInt64(enums.CT_NAM), + // UInt64(enums.CT_LAM), + // UInt64(enums.CT_LAX), + // UInt64(enums.CT_CLM), + // ) + == + bz contract_config_bool_false@8 + +contract_config_bool_true@7: + intc_1 // 1 + +contract_config_bool_merge@9: + // modules/actus_kernel.py:229 + // assert self._is_supported_contract_type(contract_type), err.INVALID_ACTUS_CONFIG + assert // Invalid ACTUS configuration + // modules/actus_kernel.py:1071 + // self._store_contract_config(self.contract_type, terms, initial_state) + intc_0 // 0 + bytec 10 // "contract_type" + app_global_get_ex + swap + bury 2 + assert // check self.contract_type exists + // modules/actus_kernel.py:325 + // assert terms.initial_exchange_amount > UInt64(0), err.INVALID_ACTUS_CONFIG + dig 4 + dup + pushint 33 + extract_uint64 + dup + bury 8 + assert // Invalid ACTUS configuration + // modules/actus_kernel.py:327 + // terms.day_count_convention.as_uint64() + pushint 57 + getbyte + dup + bury 8 + // modules/actus_kernel.py:297-303 + // return day_count_convention in ( + // UInt64(enums.DCC_AA), + // UInt64(enums.DCC_A360), + // UInt64(enums.DCC_A365), + // UInt64(enums.DCC_30E360ISDA), + // UInt64(enums.DCC_30E360), + // ) + bz contract_config_bool_true@16 + dig 6 + // modules/actus_kernel.py:299 + // UInt64(enums.DCC_A360), + intc_1 // 1 + // modules/actus_kernel.py:297-303 + // return day_count_convention in ( + // UInt64(enums.DCC_AA), + // UInt64(enums.DCC_A360), + // UInt64(enums.DCC_A365), + // UInt64(enums.DCC_30E360ISDA), + // UInt64(enums.DCC_30E360), + // ) + == + bnz contract_config_bool_true@16 + dig 6 + // modules/actus_kernel.py:300 + // UInt64(enums.DCC_A365), + pushint 2 + // modules/actus_kernel.py:297-303 + // return day_count_convention in ( + // UInt64(enums.DCC_AA), + // UInt64(enums.DCC_A360), + // UInt64(enums.DCC_A365), + // UInt64(enums.DCC_30E360ISDA), + // UInt64(enums.DCC_30E360), + // ) + == + bnz contract_config_bool_true@16 + dig 6 + // modules/actus_kernel.py:301 + // UInt64(enums.DCC_30E360ISDA), + pushint 3 + // modules/actus_kernel.py:297-303 + // return day_count_convention in ( + // UInt64(enums.DCC_AA), + // UInt64(enums.DCC_A360), + // UInt64(enums.DCC_A365), + // UInt64(enums.DCC_30E360ISDA), + // UInt64(enums.DCC_30E360), + // ) + == + bnz contract_config_bool_true@16 + dig 6 + // modules/actus_kernel.py:302 + // UInt64(enums.DCC_30E360), + pushint 4 + // modules/actus_kernel.py:297-303 + // return day_count_convention in ( + // UInt64(enums.DCC_AA), + // UInt64(enums.DCC_A360), + // UInt64(enums.DCC_A365), + // UInt64(enums.DCC_30E360ISDA), + // UInt64(enums.DCC_30E360), + // ) + == + bz contract_config_bool_false@17 + +contract_config_bool_true@16: + intc_1 // 1 + +contract_config_bool_merge@18: + // modules/actus_kernel.py:309-311 + // assert self._is_supported_day_count_convention( + // day_count_convention + // ), err.INVALID_DAY_COUNT_CONVENTION + assert // Invalid day-count convention ID + // modules/actus_kernel.py:329 + // if contract_type != UInt64(enums.CT_ANN): + dup + intc_1 // 1 + != + bz contract_config_after_if_else@20 + // modules/actus_kernel.py:330 + // assert not terms.dynamic_principal_redemption, err.INVALID_ACTUS_CONFIG + dig 4 + pushint 786 + getbit + ! + assert // Invalid ACTUS configuration + +contract_config_after_if_else@20: + // modules/actus_kernel.py:807 + // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + ! + assert // D-ASA already configured + // modules/actus_kernel.py:808 + // assert self.initial_exchange_amount == UInt64(0), err.ALREADY_CONFIGURED + intc_0 // 0 + bytec 20 // "initial_exchange_amount" + app_global_get_ex + assert // check self.initial_exchange_amount exists + ! + assert // D-ASA already configured + // modules/actus_kernel.py:810-811 + // # Set Denomination Asset + // self._assert_denomination_asset(terms.denomination_asset_id) + dig 4 + dup + intc_1 // 1 + extract_uint64 + // modules/actus_kernel.py:775-776 + // # The reference implementation has on-chain denomination with ASA + // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) + dup + asset_params_get AssetCreator + bury 1 + // modules/actus_kernel.py:777 + // assert exists, err.INVALID_DENOMINATION + assert // Denomination asset is not properly set + // modules/actus_kernel.py:780 + // self.denomination_asset_id = denomination_asset_id + bytec 44 // "denomination_asset_id" + dig 1 + app_global_put + // modules/actus_kernel.py:814-815 + // # Set Settlement Asset + // self._assert_settlement_asset(terms.settlement_asset_id) + dig 1 + pushint 9 + extract_uint64 + // modules/actus_kernel.py:785 + // settlement_asset_id == self.denomination_asset_id + dup + uncover 2 + == + // modules/actus_kernel.py:783-786 + // # The reference implementation settlement asset is the denomination asset + // assert ( + // settlement_asset_id == self.denomination_asset_id + // ), err.INVALID_SETTLEMENT_ASSET + assert // Different settlement asset not supported, must be equal to denomination asset + // modules/actus_kernel.py:789 + // self.settlement_asset_id = settlement_asset_id + bytec 19 // "settlement_asset_id" + dig 1 + app_global_put + // modules/actus_kernel.py:790-796 + // # The reference implementation has on-chain settlement with ASA + // itxn.AssetTransfer( + // xfer_asset=self.settlement_asset_id, + // asset_receiver=Global.current_application_address, + // asset_amount=0, + // fee=Global.min_txn_fee, + // ).submit() + itxn_begin + // modules/actus_kernel.py:795 + // fee=Global.min_txn_fee, + global MinTxnFee + // modules/actus_kernel.py:793 + // asset_receiver=Global.current_application_address, + global CurrentApplicationAddress + // modules/actus_kernel.py:794 + // asset_amount=0, + intc_0 // 0 + itxn_field AssetAmount + itxn_field AssetReceiver + swap + itxn_field XferAsset + // modules/actus_kernel.py:790-791 + // # The reference implementation has on-chain settlement with ASA + // itxn.AssetTransfer( + pushint 4 // axfer + itxn_field TypeEnum + itxn_field Fee + // modules/actus_kernel.py:790-796 + // # The reference implementation has on-chain settlement with ASA + // itxn.AssetTransfer( + // xfer_asset=self.settlement_asset_id, + // asset_receiver=Global.current_application_address, + // asset_amount=0, + // fee=Global.min_txn_fee, + // ).submit() + itxn_submit + // modules/actus_kernel.py:818-819 + // # Units + // self.total_units = terms.total_units + dup + pushint 17 + extract_uint64 + bytec 13 // "total_units" + swap + app_global_put + // modules/actus_kernel.py:820 + // self.reserved_units_total = UInt64(0) + bytec 11 // "reserved_units_total" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:822-823 + // # Day-Count Conventions + // self.day_count_convention = terms.day_count_convention.as_uint64() + bytec 46 // "day_count_convention" + dig 8 + app_global_put + // modules/actus_kernel.py:825-826 + // # Time + // self.initial_exchange_date = terms.initial_exchange_date + dup + pushint 41 + extract_uint64 + bytec 28 // "initial_exchange_date" + dig 1 + app_global_put + // modules/actus_kernel.py:827 + // self.maturity_date = terms.maturity_date + dig 1 + pushint 49 + extract_uint64 + bytec 45 // "maturity_date" + dig 1 + app_global_put + // modules/actus_kernel.py:828 + // self.next_principal_redemption = initial_state.next_principal_redemption + dig 6 + dup + cover 2 + pushint 48 + extract_uint64 + bytec 14 // "next_principal_redemption" + swap + app_global_put + // modules/actus_kernel.py:830-831 + // # Principal + // self.initial_exchange_amount = terms.initial_exchange_amount + bytec 20 // "initial_exchange_amount" + dig 10 + app_global_put + // modules/actus_kernel.py:832 + // self.dynamic_principal_redemption = terms.dynamic_principal_redemption + dig 3 + pushint 786 + getbit + bytec 35 // "dynamic_principal_redemption" + swap + app_global_put + // modules/actus_kernel.py:833 + // self.outstanding_principal = initial_state.outstanding_principal + dig 1 + pushint 16 + extract_uint64 + bytec 4 // "outstanding_principal" + swap + app_global_put + // modules/actus_kernel.py:835-836 + // # Interest + // self.accrued_interest = initial_state.accrued_interest + dig 1 + pushint 40 + extract_uint64 + bytec 6 // "accrued_interest" + swap + app_global_put + // modules/actus_kernel.py:838-839 + // # Interest Rate + // self.nominal_interest_rate = initial_state.nominal_interest_rate + dig 1 + intc_3 // 32 + extract_uint64 + bytec 9 // "nominal_interest_rate" + swap + app_global_put + // modules/actus_kernel.py:840 + // self.interest_calculation_base = initial_state.interest_calculation_base + dig 1 + pushint 24 + extract_uint64 + bytec 7 // "interest_calculation_base" + swap + app_global_put + // modules/actus_kernel.py:841 + // self.rate_reset_spread = terms.rate_reset_spread + dig 3 + pushint 58 + extract_uint64 + bytec 36 // "rate_reset_spread" + swap + app_global_put + // modules/actus_kernel.py:842 + // self.rate_reset_multiplier = terms.rate_reset_multiplier + dig 3 + pushint 66 + extract_uint64 + bytec 37 // "rate_reset_multiplier" + swap + app_global_put + // modules/actus_kernel.py:843 + // self.rate_reset_floor = terms.rate_reset_floor + dig 3 + pushint 74 + extract_uint64 + bytec 31 // "rate_reset_floor" + swap + app_global_put + // modules/actus_kernel.py:844 + // self.rate_reset_cap = terms.rate_reset_cap + dig 3 + pushint 82 + extract_uint64 + bytec 32 // "rate_reset_cap" + swap + app_global_put + // modules/actus_kernel.py:845 + // self.rate_reset_next = terms.rate_reset_next + dig 3 + pushint 90 + extract_uint64 + bytec 38 // "rate_reset_next" + swap + app_global_put + // modules/actus_kernel.py:846 + // self.has_rate_reset_floor = terms.has_rate_reset_floor + dig 3 + pushint 784 + getbit + bytec 39 // "has_rate_reset_floor" + swap + app_global_put + // modules/actus_kernel.py:847 + // self.has_rate_reset_cap = terms.has_rate_reset_cap + dig 3 + pushint 785 + getbit + bytec 40 // "has_rate_reset_cap" + swap + app_global_put + // modules/actus_kernel.py:849-850 + // # Scaling + // self.fixed_point_scale = terms.fixed_point_scale + uncover 3 + pushint 99 + extract_uint64 + bytec 5 // "fixed_point_scale" + swap + app_global_put + // modules/actus_kernel.py:852-853 + // # Schedule Processing + // self.event_cursor = initial_state.event_cursor + dig 1 + intc_2 // 8 + extract_uint64 + bytec_2 // "event_cursor" + swap + app_global_put + // modules/actus_kernel.py:855-856 + // # Per-Unit Fixed-Point Indexes + // self.cumulative_interest_index = initial_state.cumulative_interest_index + dig 1 + pushint 56 + extract_uint64 + bytec 16 // "cumulative_interest_index" + swap + app_global_put + // modules/actus_kernel.py:857 + // self.cumulative_principal_index = initial_state.cumulative_principal_index + dig 1 + pushint 64 + extract_uint64 + bytec 17 // "cumulative_principal_index" + swap + app_global_put + // modules/actus_kernel.py:859-860 + // # Reserved Amount (for executed cashflows) + // self.reserved_interest = UInt64(0) + bytec 15 // "reserved_interest" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:861 + // self.reserved_principal = UInt64(0) + bytec 12 // "reserved_principal" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:863 + // assert terms.initial_exchange_date > Global.latest_timestamp, err.INVALID_IED + dig 2 + global LatestTimestamp + > + assert // IED must be set in the future + // modules/actus_kernel.py:864 + // assert terms.initial_exchange_date > initial_state.status_date, err.INVALID_IED + swap + intc_0 // 0 + extract_uint64 + dig 2 + < + assert // IED must be set in the future + // modules/actus_kernel.py:865 + // assert terms.initial_exchange_date < terms.maturity_date, err.INVALID_IED + < + assert // IED must be set in the future + // modules/actus_kernel.py:1073-1074 + // # Notarize prospectus (optional) + // self.prospectus_hash = prospectus.hash.bytes + dig 2 + extract 0 32 + bytec 42 // "prospectus_hash" + swap + app_global_put + // modules/actus_kernel.py:1075 + // self.prospectus_url = prospectus.url + dig 1 + extract 2 0 + bytec 43 // "prospectus_url" + swap + app_global_put + // modules/actus_kernel.py:1076 + // return Global.latest_timestamp + global LatestTimestamp + // modules/actus_kernel.py:1036 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +contract_config_bool_false@17: + intc_0 // 0 + b contract_config_bool_merge@18 + +contract_config_bool_false@8: + intc_0 // 0 + b contract_config_bool_merge@9 + + +// modules.actus_kernel.ActusKernelModule.contract_schedule[routing]() -> void: +contract_schedule: + intc_0 // 0 + pushbytes "" + dupn 2 + // modules/actus_kernel.py:1078 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + dup + txna ApplicationArgs 2 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.bool + intc_0 // 0 + getbit + swap + txna ApplicationArgs 3 + dup + cover 2 + dup + intc_0 // 0 + extract_uint16 // on error: invalid array length header + dup + cover 3 + dup + pushint 65 + * + pushint 2 + + + uncover 2 + len + == + assert // invalid number of bytes for arc4.dynamic_array + // modules/actus_kernel.py:1110 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/actus_kernel.py:1113 + // contract_type=self.contract_type, + intc_0 // 0 + bytec 10 // "contract_type" + app_global_get_ex + swap + cover 3 + assert // check self.contract_type exists + // modules/actus_kernel.py:881 + // assert self.status == UInt64(enums.STATUS_INACTIVE), err.ALREADY_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + ! + assert // D-ASA already configured + // modules/actus_kernel.py:882-884 + // assert schedule_page.length <= UInt64( + // cst.SCHEDULE_PAGE_SIZE + // ), err.INVALID_SCHEDULE_PAGE + dup + pushint 16 + <= + assert // Invalid schedule page + // modules/actus_kernel.py:885 + // assert self.initial_exchange_amount > UInt64(0), err.TERMS_NOT_CONFIGURED + intc_0 // 0 + bytec 20 // "initial_exchange_amount" + app_global_get_ex + assert // check self.initial_exchange_amount exists + assert // D-ASA terms not configured + // modules/actus_kernel.py:887 + // page_cursor = schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + swap + pushint 16 + * + swap + // modules/actus_kernel.py:894 + // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) + pushint 100 + * + // modules/actus_kernel.py:893 + // UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) + intc 4 // 1500 + // modules/actus_kernel.py:893-894 + // UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) + // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) + + + // modules/actus_kernel.py:889-896 + // # Validation cost grows with page length, so configuration explicitly + // # buys extra opcode budget for larger uploads. + // ensure_budget( + // required_budget=( + // UInt64(cst.OP_UP_CONTRACT_CONFIG_BASE_BUDGET) + // + page_length * UInt64(cst.OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET) + // ), + // ) + intc_0 // 0 + callsub ensure_budget + // modules/actus_kernel.py:897 + // index = UInt64(0) + intc_0 // 0 + +contract_schedule_while_top@2: + // modules/actus_kernel.py:898 + // while index < page_length: + dup + dig 4 + < + bz contract_schedule_after_while@11 + // modules/actus_kernel.py:899-900 + // entry = schedule_page[index].copy() + // entry_event_type = entry.event_type.as_uint64() + dig 4 + extract 2 0 + dup + bury 12 + dig 1 + dup + cover 2 + pushint 65 + * + pushint 65 + extract3 // on error: index access is out of bounds + // modules/actus_kernel.py:900 + // entry_event_type = entry.event_type.as_uint64() + dup + // modules/actus_kernel.py:899-900 + // entry = schedule_page[index].copy() + // entry_event_type = entry.event_type.as_uint64() + intc_2 // 8 + // modules/actus_kernel.py:900 + // entry_event_type = entry.event_type.as_uint64() + getbyte + dup + cover 2 + bury 13 + // modules/actus_kernel.py:901 + // assert entry.event_id == page_cursor + index, err.INVALID_EVENT_ID + dup + intc_0 // 0 + extract_uint64 + dup + bury 13 + dig 5 + uncover 4 + + + dig 1 + == + assert // Invalid event id + // modules/actus_kernel.py:902-904 + // self._assert_event_allowed_for_contract_type( + // contract_type, entry_event_type + // ) + dig 5 + uncover 3 + callsub _assert_event_allowed_for_contract_type + // modules/actus_kernel.py:905 + // assert entry.scheduled_time > UInt64(0), err.INVALID_ACTUS_CONFIG + swap + pushint 9 + extract_uint64 + dup + bury 10 + assert // Invalid ACTUS configuration + // modules/actus_kernel.py:906 + // if entry.event_id > UInt64(0): + bz contract_schedule_after_if_else@8 + // modules/actus_kernel.py:907 + // if index > UInt64(0): + dup + bz contract_schedule_else_body@6 + // modules/actus_kernel.py:908 + // previous_entry = schedule_page[index - UInt64(1)].copy() + dup + intc_1 // 1 + - + pushint 65 + * + dig 11 + swap + pushint 65 + extract3 // on error: index access is out of bounds + +contract_schedule_after_if_else@7: + // modules/actus_kernel.py:923 + // previous_entry.scheduled_time <= entry.scheduled_time + pushint 9 + extract_uint64 + dig 8 + <= + // modules/actus_kernel.py:922-924 + // assert ( + // previous_entry.scheduled_time <= entry.scheduled_time + // ), err.INVALID_SORTING + assert // Time events must be sorted in strictly ascending order + +contract_schedule_after_if_else@8: + // modules/actus_kernel.py:925 + // if entry.event_id == UInt64(0): + dig 8 + bnz contract_schedule_after_if_else@10 + // modules/actus_kernel.py:926-928 + // assert entry_event_type == UInt64( + // enums.EVT_IED + // ), err.INVALID_ACTUS_CONFIG + dig 9 + intc_1 // 1 + == + assert // Invalid ACTUS configuration + +contract_schedule_after_if_else@10: + // modules/actus_kernel.py:929 + // index += UInt64(1) + dup + intc_1 // 1 + + + bury 1 + b contract_schedule_while_top@2 + +contract_schedule_else_body@6: + // modules/actus_kernel.py:910-912 + // # The first entry of a page must still be ordered after the + // # last entry of the previous page. + // assert schedule_page_index > UInt64(0), err.INVALID_EVENT_ID + dig 6 + dup + assert // Invalid event id + // modules/actus_kernel.py:913 + // previous_page_index = schedule_page_index - UInt64(1) + intc_1 // 1 + - + // modules/actus_kernel.py:915 + // previous_page_index in self.schedule_page + itob + bytec 24 // 0x5323 + swap + concat + dup + box_len + bury 1 + // modules/actus_kernel.py:914-916 + // assert ( + // previous_page_index in self.schedule_page + // ), err.INVALID_SCHEDULE_PAGE + assert // Invalid schedule page + // modules/actus_kernel.py:917-918 + // previous_page = self.schedule_page[previous_page_index].copy() + // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE + dup + intc_0 // 0 + pushint 2 + box_extract + btoi + // modules/actus_kernel.py:918 + // assert previous_page.length > UInt64(0), err.INVALID_SCHEDULE_PAGE + dup + assert // Invalid schedule page + // modules/actus_kernel.py:920 + // previous_page.length - UInt64(1) + intc_1 // 1 + - + // modules/actus_kernel.py:919-921 + // previous_entry = previous_page[ + // previous_page.length - UInt64(1) + // ].copy() + pushint 65 + * + pushint 2 + + + pushint 65 + box_extract + b contract_schedule_after_if_else@7 + +contract_schedule_after_while@11: + // modules/actus_kernel.py:200 + // self.schedule_page[page_index] = schedule_page.copy() + dig 6 + itob + bytec 24 // 0x5323 + swap + concat + dup + box_del + pop + dig 5 + box_put + // modules/actus_kernel.py:932 + // if is_last_page: + dig 5 + bz contract_schedule_after_if_else@13 + // modules/actus_kernel.py:934 + // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length + dig 1 + dig 4 + + + // modules/actus_kernel.py:933 + // self.schedule_entry_count = ( + bytec_3 // "schedule_entry_count" + // modules/actus_kernel.py:933-935 + // self.schedule_entry_count = ( + // schedule_page_index * UInt64(cst.SCHEDULE_PAGE_SIZE) + page_length + // ) + swap + app_global_put + // modules/actus_kernel.py:936 + // self.status = UInt64(enums.STATUS_PENDING_IED) + bytec_1 // "status" + pushint 50 + app_global_put + +contract_schedule_after_if_else@13: + // modules/actus_kernel.py:1118 + // return Global.latest_timestamp + global LatestTimestamp + // modules/actus_kernel.py:1078 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.actus_kernel.ActusKernelModule.contract_execute_ied[routing]() -> void: +contract_execute_ied: + // modules/actus_kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/actus_kernel.py:1143 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/actus_kernel.py:1144 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/actus_kernel.py:1145 + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended + // modules/actus_kernel.py:1147 + // assert self.event_cursor < self.schedule_entry_count, err.INVALID_EVENT_CURSOR + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + dig 1 + > + assert // Invalid event cursor + // modules/actus_kernel.py:1148 + // entry = self._get_schedule_entry(self.event_cursor) + callsub _get_schedule_entry + // modules/actus_kernel.py:1149 + // assert entry.event_type == arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE + dup + extract 8 1 + dup + pushbytes 0x01 + b== + assert // Invalid event type + // modules/actus_kernel.py:1153 + // event_id=entry.event_id, + dig 1 + extract 0 8 + // modules/actus_kernel.py:1155 + // scheduled_time=entry.scheduled_time, + dig 2 + extract 9 8 + // modules/actus_kernel.py:1156 + // accrual_factor=entry.accrual_factor, + dig 3 + extract 17 8 + // modules/actus_kernel.py:1157 + // redemption_accrual_factor=entry.redemption_accrual_factor, + dig 4 + extract 25 8 + // modules/actus_kernel.py:1159 + // next_nominal_interest_rate=entry.next_nominal_interest_rate, + dig 5 + extract 33 8 + // modules/actus_kernel.py:1160 + // next_principal_redemption=entry.next_principal_redemption, + dig 6 + extract 41 8 + // modules/actus_kernel.py:1161 + // next_outstanding_principal=entry.next_outstanding_principal, + dig 7 + extract 49 8 + // modules/actus_kernel.py:1162 + // flags=entry.flags, + dig 8 + extract 57 8 + // modules/actus_kernel.py:1152-1163 + // typ.ObservedEventRequest( + // event_id=entry.event_id, + // event_type=entry.event_type, + // scheduled_time=entry.scheduled_time, + // accrual_factor=entry.accrual_factor, + // redemption_accrual_factor=entry.redemption_accrual_factor, + // observed_rate=UInt64(0), + // next_nominal_interest_rate=entry.next_nominal_interest_rate, + // next_principal_redemption=entry.next_principal_redemption, + // next_outstanding_principal=entry.next_outstanding_principal, + // flags=entry.flags, + // ), + uncover 7 + uncover 8 + concat + uncover 7 + concat + uncover 6 + concat + uncover 5 + concat + // modules/actus_kernel.py:1158 + // observed_rate=UInt64(0), + intc_0 // 0 + // modules/actus_kernel.py:1152-1163 + // typ.ObservedEventRequest( + // event_id=entry.event_id, + // event_type=entry.event_type, + // scheduled_time=entry.scheduled_time, + // accrual_factor=entry.accrual_factor, + // redemption_accrual_factor=entry.redemption_accrual_factor, + // observed_rate=UInt64(0), + // next_nominal_interest_rate=entry.next_nominal_interest_rate, + // next_principal_redemption=entry.next_principal_redemption, + // next_outstanding_principal=entry.next_outstanding_principal, + // flags=entry.flags, + // ), + itob + concat + uncover 4 + concat + uncover 3 + concat + uncover 2 + concat + swap + concat + // modules/actus_kernel.py:1150-1164 + // self._apply_non_cash_schedule_entry( + // entry, + // typ.ObservedEventRequest( + // event_id=entry.event_id, + // event_type=entry.event_type, + // scheduled_time=entry.scheduled_time, + // accrual_factor=entry.accrual_factor, + // redemption_accrual_factor=entry.redemption_accrual_factor, + // observed_rate=UInt64(0), + // next_nominal_interest_rate=entry.next_nominal_interest_rate, + // next_principal_redemption=entry.next_principal_redemption, + // next_outstanding_principal=entry.next_outstanding_principal, + // flags=entry.flags, + // ), + // ) + callsub _apply_non_cash_schedule_entry + popn 2 + // modules/actus_kernel.py:1165 + // return Global.latest_timestamp + global LatestTimestamp + // modules/actus_kernel.py:1120 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.actus_kernel.ActusKernelModule.apply_non_cash_event[routing]() -> void: +apply_non_cash_event: + intc_0 // 0 + dupn 4 + pushbytes "" + dup + // modules/actus_kernel.py:1167 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_2 // 8 + == + assert // invalid number of bytes for arc4.uint64 + btoi + txna ApplicationArgs 2 + dupn 2 + len + pushint 73 + == + assert // invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest + // modules/actus_kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/actus_kernel.py:1204 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/actus_kernel.py:1205 + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended + // modules/actus_kernel.py:1207 + // if payload.flags & UInt64(enums.FLAG_OBSERVED_EVENT): + pushint 65 + extract_uint64 + dup + pushint 4 + & + bz apply_non_cash_event_after_if_else@3 + // modules/actus_kernel.py:233 + // return self.contract_type == UInt64(enums.CT_CLM) + intc_0 // 0 + bytec 10 // "contract_type" + app_global_get_ex + assert // check self.contract_type exists + pushint 5 + == + // modules/actus_kernel.py:1208 + // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED + assert // Observed event required to execute this action + // modules/actus_kernel.py:1209 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/actus_kernel.py:233 + // return self.contract_type == UInt64(enums.CT_CLM) + intc_0 // 0 + bytec 10 // "contract_type" + app_global_get_ex + assert // check self.contract_type exists + dup + pushint 5 + == + // modules/actus_kernel.py:945 + // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED + assert // Observed event required to execute this action + // modules/actus_kernel.py:946 + // assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID + dig 2 + dup + intc_0 // 0 + extract_uint64 + dup + bury 7 + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + == + assert // Invalid event id + // modules/actus_kernel.py:948 + // self.contract_type, payload.event_type.as_uint64() + dup + extract 8 1 + bury 12 + intc_2 // 8 + getbyte + // modules/actus_kernel.py:947-949 + // self._assert_event_allowed_for_contract_type( + // self.contract_type, payload.event_type.as_uint64() + // ) + callsub _assert_event_allowed_for_contract_type + // modules/actus_kernel.py:951 + // page_index = self._schedule_page_index(self.schedule_entry_count) + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + // modules/actus_kernel.py:190 + // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) + pushint 16 + / + // modules/actus_kernel.py:952 + // page = typ.ExecutionSchedulePage() + bytec 48 // 0x0000 + bury 7 + // modules/actus_kernel.py:953 + // if page_index in self.schedule_page: + itob + bytec 24 // 0x5323 + swap + concat + dup + bury 9 + box_len + bury 1 + bz apply_non_cash_event_after_if_else@27 + // modules/actus_kernel.py:954 + // page = self.schedule_page[page_index].copy() + dig 7 + box_get + swap + bury 7 + assert // check self.schedule_page entry exists + +apply_non_cash_event_after_if_else@27: + // modules/actus_kernel.py:955 + // assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE + dig 5 + dup + intc_0 // 0 + extract_uint16 // on error: invalid array length header + dup + pushint 16 + < + assert // Invalid schedule page + // modules/actus_kernel.py:960 + // scheduled_time=payload.scheduled_time, + dig 3 + dup + extract 9 8 + // modules/actus_kernel.py:961 + // accrual_factor=payload.accrual_factor, + dig 1 + extract 17 8 + // modules/actus_kernel.py:962 + // redemption_accrual_factor=payload.redemption_accrual_factor, + dig 2 + extract 25 8 + // modules/actus_kernel.py:963 + // next_nominal_interest_rate=payload.next_nominal_interest_rate, + dig 3 + extract 41 8 + // modules/actus_kernel.py:964 + // next_principal_redemption=payload.next_principal_redemption, + dig 4 + extract 49 8 + // modules/actus_kernel.py:965 + // next_outstanding_principal=payload.next_outstanding_principal, + uncover 5 + extract 57 8 + // modules/actus_kernel.py:957-967 + // typ.ExecutionScheduleEntry( + // event_id=payload.event_id, + // event_type=payload.event_type, + // scheduled_time=payload.scheduled_time, + // accrual_factor=payload.accrual_factor, + // redemption_accrual_factor=payload.redemption_accrual_factor, + // next_nominal_interest_rate=payload.next_nominal_interest_rate, + // next_principal_redemption=payload.next_principal_redemption, + // next_outstanding_principal=payload.next_outstanding_principal, + // flags=payload.flags, + // ) + dig 11 + itob + dig 18 + concat + uncover 6 + concat + uncover 5 + concat + uncover 4 + concat + uncover 3 + concat + uncover 2 + concat + swap + concat + dig 3 + itob + concat + // modules/actus_kernel.py:956-968 + // page.append( + // typ.ExecutionScheduleEntry( + // event_id=payload.event_id, + // event_type=payload.event_type, + // scheduled_time=payload.scheduled_time, + // accrual_factor=payload.accrual_factor, + // redemption_accrual_factor=payload.redemption_accrual_factor, + // next_nominal_interest_rate=payload.next_nominal_interest_rate, + // next_principal_redemption=payload.next_principal_redemption, + // next_outstanding_principal=payload.next_outstanding_principal, + // flags=payload.flags, + // ) + // ) + uncover 2 + swap + concat // on error: max array length exceeded + swap + intc_1 // 1 + + + itob + extract 6 2 + replace2 0 + // modules/actus_kernel.py:969 + // self.schedule_page[page_index] = page.copy() + dig 8 + dup + box_del + pop + swap + box_put + // modules/actus_kernel.py:970 + // self.schedule_entry_count += UInt64(1) + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + intc_1 // 1 + + + bytec_3 // "schedule_entry_count" + swap + app_global_put + +apply_non_cash_event_after_if_else@3: + // modules/actus_kernel.py:1212 + // assert event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + dig 3 + dup + uncover 2 + == + assert // Invalid event cursor + // modules/actus_kernel.py:1213 + // entry = self._get_schedule_entry(event_id) + callsub _get_schedule_entry + dup + bury 8 + // modules/actus_kernel.py:1215 + // entry.event_type.as_uint64() + dup + extract 8 1 + bury 10 + intc_2 // 8 + getbyte + dup + bury 6 + // modules/actus_kernel.py:364 + // UInt64(enums.EVT_IED), + intc_1 // 1 + // modules/actus_kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/actus_kernel.py:365 + // UInt64(enums.EVT_PI), + pushint 4 + // modules/actus_kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/actus_kernel.py:366 + // UInt64(enums.EVT_RR), + pushint 12 + // modules/actus_kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/actus_kernel.py:367 + // UInt64(enums.EVT_RRF), + pushint 11 + // modules/actus_kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/actus_kernel.py:368 + // UInt64(enums.EVT_IPCB), + pushint 18 + // modules/actus_kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz apply_non_cash_event_bool_true@15 + dig 4 + // modules/actus_kernel.py:369 + // UInt64(enums.EVT_PRF), + pushint 5 + // modules/actus_kernel.py:363-370 + // return event_type in ( + // UInt64(enums.EVT_IED), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_RR), + // UInt64(enums.EVT_RRF), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bz apply_non_cash_event_bool_false@16 + +apply_non_cash_event_bool_true@15: + intc_1 // 1 + +apply_non_cash_event_bool_merge@17: + // modules/actus_kernel.py:1214-1216 + // assert self._event_is_non_cash( + // entry.event_type.as_uint64() + // ), err.INVALID_EVENT_TYPE + assert // Invalid event type + // modules/actus_kernel.py:1217 + // assert entry.event_type != arc4.UInt8(enums.EVT_IED), err.INVALID_EVENT_TYPE + dig 8 + pushbytes 0x01 + b!= + assert // Invalid event type + // modules/actus_kernel.py:374 + // return event_type in (UInt64(enums.EVT_RR), UInt64(enums.EVT_RRF)) + dig 4 + pushint 12 + == + bnz apply_non_cash_event_bool_true@21 + dig 4 + pushint 11 + == + bz apply_non_cash_event_bool_false@22 + +apply_non_cash_event_bool_true@21: + intc_1 // 1 + +apply_non_cash_event_bool_merge@23: + // modules/actus_kernel.py:1218 + // if self._event_is_rate_reset(entry.event_type.as_uint64()): + bz apply_non_cash_event_else_body@5 + // modules/rbac.py:82 + // assert self._role_is_active(self.observer, Txn.sender), err.UNAUTHORIZED + bytec 25 // 0x523a4d4f4323 + txn Sender + callsub _role_is_active + assert // Not authorized + +apply_non_cash_event_after_if_else@6: + // modules/actus_kernel.py:1222 + // self._apply_non_cash_schedule_entry(entry, payload) + dig 6 + dig 2 + callsub _apply_non_cash_schedule_entry + popn 2 + // modules/actus_kernel.py:1223 + // return Global.latest_timestamp + global LatestTimestamp + // modules/actus_kernel.py:1167 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +apply_non_cash_event_else_body@5: + // modules/actus_kernel.py:1221 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + b apply_non_cash_event_after_if_else@6 + +apply_non_cash_event_bool_false@22: + intc_0 // 0 + b apply_non_cash_event_bool_merge@23 + +apply_non_cash_event_bool_false@16: + intc_0 // 0 + b apply_non_cash_event_bool_merge@17 + + +// modules.actus_kernel.ActusKernelModule.append_observed_cash_event[routing]() -> void: +append_observed_cash_event: + intc_0 // 0 + dup + // modules/actus_kernel.py:1225 + // @arc4.abimethod + txna ApplicationArgs 1 + dupn 2 + len + pushint 65 + == + assert // invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest + // modules/actus_kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/actus_kernel.py:1254 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/actus_kernel.py:1255 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/actus_kernel.py:1256 + // self._assert_is_not_contract_suspended() + callsub _assert_is_not_contract_suspended + // modules/actus_kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/actus_kernel.py:147 + // assert not self._status_is_pending_ied(), err.PENDING_IED + ! + assert // IED not yet executed + // modules/actus_kernel.py:233 + // return self.contract_type == UInt64(enums.CT_CLM) + intc_0 // 0 + bytec 10 // "contract_type" + app_global_get_ex + assert // check self.contract_type exists + pushint 5 + == + // modules/actus_kernel.py:981 + // assert self._supports_observed_events(), err.OBSERVED_EVENT_REQUIRED + assert // Observed event required to execute this action + // modules/actus_kernel.py:982 + // assert payload.event_id == self.schedule_entry_count, err.INVALID_EVENT_ID + dup + intc_0 // 0 + extract_uint64 + dup + cover 2 + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + swap + dig 1 + == + assert // Invalid event id + // modules/actus_kernel.py:983 + // assert payload.event_type == arc4.UInt8(enums.EVT_PR), err.INVALID_EVENT_TYPE + dig 1 + extract 8 1 + dup + cover 3 + pushbytes 0x03 + b== + assert // Invalid event type + // modules/actus_kernel.py:984 + // assert payload.flags & UInt64(enums.FLAG_CASH_EVENT), err.INVALID_ACTUS_CONFIG + swap + pushint 57 + extract_uint64 + dup + cover 2 + intc_1 // 1 + & + assert // Invalid ACTUS configuration + // modules/actus_kernel.py:986 + // if self.schedule_entry_count > UInt64(0): + bz append_observed_cash_event_after_if_else@3 + // modules/actus_kernel.py:988 + // self.schedule_entry_count - UInt64(1) + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + intc_1 // 1 + - + // modules/actus_kernel.py:987-989 + // previous_entry = self._get_schedule_entry( + // self.schedule_entry_count - UInt64(1) + // ) + callsub _get_schedule_entry + // modules/actus_kernel.py:991 + // previous_entry.scheduled_time <= payload.scheduled_time + pushint 9 + extract_uint64 + dig 4 + pushint 9 + extract_uint64 + <= + // modules/actus_kernel.py:990-992 + // assert ( + // previous_entry.scheduled_time <= payload.scheduled_time + // ), err.INVALID_SORTING + assert // Time events must be sorted in strictly ascending order + +append_observed_cash_event_after_if_else@3: + // modules/actus_kernel.py:994 + // page_index = self._schedule_page_index(self.schedule_entry_count) + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + // modules/actus_kernel.py:190 + // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) + pushint 16 + / + // modules/actus_kernel.py:995 + // page = typ.ExecutionSchedulePage() + bytec 48 // 0x0000 + bury 6 + // modules/actus_kernel.py:996 + // if page_index in self.schedule_page: + itob + bytec 24 // 0x5323 + swap + concat + dup + bury 7 + box_len + bury 1 + bz append_observed_cash_event_after_if_else@5 + // modules/actus_kernel.py:997 + // page = self.schedule_page[page_index].copy() + dig 5 + box_get + swap + bury 6 + assert // check self.schedule_page entry exists + +append_observed_cash_event_after_if_else@5: + // modules/actus_kernel.py:998 + // assert page.length < UInt64(cst.SCHEDULE_PAGE_SIZE), err.INVALID_SCHEDULE_PAGE + dig 4 + dup + intc_0 // 0 + extract_uint16 // on error: invalid array length header + dup + pushint 16 + < + assert // Invalid schedule page + // modules/actus_kernel.py:1003 + // scheduled_time=payload.scheduled_time, + dig 5 + dup + extract 9 8 + // modules/actus_kernel.py:1004 + // accrual_factor=payload.accrual_factor, + dig 1 + extract 17 8 + // modules/actus_kernel.py:1005 + // redemption_accrual_factor=payload.redemption_accrual_factor, + dig 2 + extract 25 8 + // modules/actus_kernel.py:1006 + // next_nominal_interest_rate=payload.next_nominal_interest_rate, + dig 3 + extract 33 8 + // modules/actus_kernel.py:1007 + // next_principal_redemption=payload.next_principal_redemption, + dig 4 + extract 41 8 + // modules/actus_kernel.py:1008 + // next_outstanding_principal=payload.next_outstanding_principal, + uncover 5 + extract 49 8 + // modules/actus_kernel.py:1000-1010 + // typ.ExecutionScheduleEntry( + // event_id=payload.event_id, + // event_type=payload.event_type, + // scheduled_time=payload.scheduled_time, + // accrual_factor=payload.accrual_factor, + // redemption_accrual_factor=payload.redemption_accrual_factor, + // next_nominal_interest_rate=payload.next_nominal_interest_rate, + // next_principal_redemption=payload.next_principal_redemption, + // next_outstanding_principal=payload.next_outstanding_principal, + // flags=payload.flags, + // ) + dig 10 + itob + dig 10 + concat + uncover 6 + concat + uncover 5 + concat + uncover 4 + concat + uncover 3 + concat + uncover 2 + concat + swap + concat + dig 3 + itob + concat + // modules/actus_kernel.py:999-1011 + // page.append( + // typ.ExecutionScheduleEntry( + // event_id=payload.event_id, + // event_type=payload.event_type, + // scheduled_time=payload.scheduled_time, + // accrual_factor=payload.accrual_factor, + // redemption_accrual_factor=payload.redemption_accrual_factor, + // next_nominal_interest_rate=payload.next_nominal_interest_rate, + // next_principal_redemption=payload.next_principal_redemption, + // next_outstanding_principal=payload.next_outstanding_principal, + // flags=payload.flags, + // ) + // ) + uncover 2 + swap + concat // on error: max array length exceeded + swap + intc_1 // 1 + + + itob + extract 6 2 + replace2 0 + // modules/actus_kernel.py:1012 + // self.schedule_page[page_index] = page.copy() + dig 6 + dup + box_del + pop + swap + box_put + // modules/actus_kernel.py:1013 + // self.schedule_entry_count += UInt64(1) + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + intc_1 // 1 + + + bytec_3 // "schedule_entry_count" + swap + app_global_put + // modules/actus_kernel.py:1260 + // return Global.latest_timestamp + global LatestTimestamp + // modules/actus_kernel.py:1225 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.actus_kernel.ActusKernelModule.contract_get_state[routing]() -> void: +contract_get_state: + // modules/actus_kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + dup + assert // D-ASA not configured + // modules/actus_kernel.py:1275 + // contract_type=arc4.UInt8(self.contract_type), + intc_0 // 0 + bytec 10 // "contract_type" + app_global_get_ex + assert // check self.contract_type exists + itob + dup + bitlen + intc_2 // 8 + <= + assert // overflow + extract 7 1 + // modules/actus_kernel.py:1277 + // total_units=self.total_units, + intc_0 // 0 + bytec 13 // "total_units" + app_global_get_ex + assert // check self.total_units exists + // modules/actus_kernel.py:1278 + // reserved_units_total=self.reserved_units_total, + intc_0 // 0 + bytec 11 // "reserved_units_total" + app_global_get_ex + assert // check self.reserved_units_total exists + // modules/actus_kernel.py:1279 + // initial_exchange_amount=self.initial_exchange_amount, + intc_0 // 0 + bytec 20 // "initial_exchange_amount" + app_global_get_ex + assert // check self.initial_exchange_amount exists + // modules/actus_kernel.py:1280 + // event_cursor=self.event_cursor, + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + // modules/actus_kernel.py:1281 + // schedule_entry_count=self.schedule_entry_count, + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + // modules/actus_kernel.py:1282 + // outstanding_principal=self.outstanding_principal, + intc_0 // 0 + bytec 4 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + // modules/actus_kernel.py:1283 + // interest_calculation_base=self.interest_calculation_base, + intc_0 // 0 + bytec 7 // "interest_calculation_base" + app_global_get_ex + assert // check self.interest_calculation_base exists + // modules/actus_kernel.py:1284 + // nominal_interest_rate=self.nominal_interest_rate, + intc_0 // 0 + bytec 9 // "nominal_interest_rate" + app_global_get_ex + assert // check self.nominal_interest_rate exists + // modules/actus_kernel.py:1285 + // accrued_interest=self.accrued_interest, + intc_0 // 0 + bytec 6 // "accrued_interest" + app_global_get_ex + assert // check self.accrued_interest exists + // modules/actus_kernel.py:1286 + // cumulative_interest_index=self.cumulative_interest_index, + intc_0 // 0 + bytec 16 // "cumulative_interest_index" + app_global_get_ex + assert // check self.cumulative_interest_index exists + // modules/actus_kernel.py:1287 + // cumulative_principal_index=self.cumulative_principal_index, + intc_0 // 0 + bytec 17 // "cumulative_principal_index" + app_global_get_ex + assert // check self.cumulative_principal_index exists + // modules/actus_kernel.py:1288 + // reserved_interest=self.reserved_interest, + intc_0 // 0 + bytec 15 // "reserved_interest" + app_global_get_ex + assert // check self.reserved_interest exists + // modules/actus_kernel.py:1289 + // reserved_principal=self.reserved_principal, + intc_0 // 0 + bytec 12 // "reserved_principal" + app_global_get_ex + assert // check self.reserved_principal exists + // modules/actus_kernel.py:1274-1290 + // return typ.KernelState( + // contract_type=arc4.UInt8(self.contract_type), + // status=self.status, + // total_units=self.total_units, + // reserved_units_total=self.reserved_units_total, + // initial_exchange_amount=self.initial_exchange_amount, + // event_cursor=self.event_cursor, + // schedule_entry_count=self.schedule_entry_count, + // outstanding_principal=self.outstanding_principal, + // interest_calculation_base=self.interest_calculation_base, + // nominal_interest_rate=self.nominal_interest_rate, + // accrued_interest=self.accrued_interest, + // cumulative_interest_index=self.cumulative_interest_index, + // cumulative_principal_index=self.cumulative_principal_index, + // reserved_interest=self.reserved_interest, + // reserved_principal=self.reserved_principal, + // ) + uncover 14 + itob + uncover 14 + swap + concat + uncover 13 + itob + concat + uncover 12 + itob + concat + uncover 11 + itob + concat + uncover 10 + itob + concat + uncover 9 + itob + concat + uncover 8 + itob + concat + uncover 7 + itob + concat + uncover 6 + itob + concat + uncover 5 + itob + concat + uncover 4 + itob + concat + uncover 3 + itob + concat + uncover 2 + itob + concat + swap + itob + concat + // modules/actus_kernel.py:1262 + // @arc4.abimethod(readonly=True) + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.actus_kernel.ActusKernelModule.contract_get_next_due_event[routing]() -> void: +contract_get_next_due_event: + // modules/actus_kernel.py:143 + // assert self.status != UInt64(enums.STATUS_INACTIVE), err.NOT_CONFIGURED + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + assert // D-ASA not configured + // modules/actus_kernel.py:1304 + // if self.event_cursor >= self.schedule_entry_count: + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + >= + bz contract_get_next_due_event_after_if_else@3 + // modules/actus_kernel.py:1306 + // event_id=self.event_cursor, + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + // modules/actus_kernel.py:1305-1315 + // return typ.ExecutionScheduleEntry( + // event_id=self.event_cursor, + // event_type=arc4.UInt8(0), + // scheduled_time=UInt64(0), + // accrual_factor=UInt64(0), + // redemption_accrual_factor=UInt64(0), + // next_nominal_interest_rate=UInt64(0), + // next_principal_redemption=UInt64(0), + // next_outstanding_principal=UInt64(0), + // flags=UInt64(0), + // ) + itob + // modules/actus_kernel.py:1307 + // event_type=arc4.UInt8(0), + bytec 41 // 0x00 + // modules/actus_kernel.py:1305-1315 + // return typ.ExecutionScheduleEntry( + // event_id=self.event_cursor, + // event_type=arc4.UInt8(0), + // scheduled_time=UInt64(0), + // accrual_factor=UInt64(0), + // redemption_accrual_factor=UInt64(0), + // next_nominal_interest_rate=UInt64(0), + // next_principal_redemption=UInt64(0), + // next_outstanding_principal=UInt64(0), + // flags=UInt64(0), + // ) + concat + // modules/actus_kernel.py:1308 + // scheduled_time=UInt64(0), + intc_0 // 0 + // modules/actus_kernel.py:1305-1315 + // return typ.ExecutionScheduleEntry( + // event_id=self.event_cursor, + // event_type=arc4.UInt8(0), + // scheduled_time=UInt64(0), + // accrual_factor=UInt64(0), + // redemption_accrual_factor=UInt64(0), + // next_nominal_interest_rate=UInt64(0), + // next_principal_redemption=UInt64(0), + // next_outstanding_principal=UInt64(0), + // flags=UInt64(0), + // ) + itob + swap + dig 1 + concat + dig 1 + concat + dig 1 + concat + dig 1 + concat + dig 1 + concat + dig 1 + concat + swap + concat + +contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4: + // modules/actus_kernel.py:1292 + // @arc4.abimethod(readonly=True) + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +contract_get_next_due_event_after_if_else@3: + // modules/actus_kernel.py:1316 + // return self._get_schedule_entry(self.event_cursor) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + callsub _get_schedule_entry + // modules/actus_kernel.py:1292 + // @arc4.abimethod(readonly=True) + b contract_get_next_due_event_after_inlined_modules.actus_kernel.ActusKernelModule.contract_get_next_due_event@4 + + +// modules.rbac.RbacModule.contract_update[routing]() -> void: +contract_update: + // modules/rbac.py:161-164 + // # The reference implementation grants the update permissions to the Arranger. + // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they + // # might introduce breaking changes. + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:150 + // @arc4.abimethod(allow_actions=["UpdateApplication"]) + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: +rbac_rotate_arranger: + // modules/rbac.py:166 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:180 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:181 + // self.arranger.value = new_arranger + bytec 18 // 0x523a41525223 + swap + app_global_put + // modules/rbac.py:182 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:166 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: +rbac_set_op_daemon: + // modules/rbac.py:184 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:198 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:199 + // self.op_daemon.value = address + bytec 27 // 0x523a4f504423 + swap + app_global_put + // modules/rbac.py:200 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:184 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: +rbac_assign_role: + // modules/rbac.py:202 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.uint8 + txna ApplicationArgs 2 + dup + cover 2 + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + txna ApplicationArgs 3 + dup + cover 2 + len + pushint 16 + == + assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity + // modules/rbac.py:224 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:225 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/rbac.py:226 + // self._assert_valid_role(role_id.as_uint64()) + btoi + dupn 2 + callsub _assert_valid_role + // modules/rbac.py:104 + // if role_id == UInt64(enums.ROLE_ARRANGER): + pushint 20 + == + bz rbac_assign_role_after_if_else@3 + // modules/rbac.py:105 + // self.arranger.value = role_address + bytec 18 // 0x523a41525223 + dig 3 + app_global_put + +rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14: + // modules/rbac.py:228 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:202 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +rbac_assign_role_after_if_else@3: + // modules/rbac.py:108 + // if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): + dup + pushint 40 + == + bz rbac_assign_role_after_if_else@5 + // modules/rbac.py:109 + // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS + bytec 23 // 0x523a4d4e4723 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:110 + // self.account_manager[role_address] = validity.copy() + dig 2 + box_put + // modules/rbac.py:227 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + +rbac_assign_role_after_if_else@5: + // modules/rbac.py:112 + // if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): + dup + pushint 50 + == + bz rbac_assign_role_after_if_else@7 + // modules/rbac.py:113 + // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS + bytec 22 // 0x523a50594423 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:114 + // self.primary_dealer[role_address] = validity.copy() + dig 2 + box_put + // modules/rbac.py:227 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + +rbac_assign_role_after_if_else@7: + // modules/rbac.py:116 + // if role_id == UInt64(enums.ROLE_TRUSTEE): + dup + pushint 60 + == + bz rbac_assign_role_after_if_else@9 + // modules/rbac.py:117 + // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS + bytec 26 // 0x523a54525323 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:118 + // self.trustee[role_address] = validity.copy() + dig 2 + box_put + // modules/rbac.py:227 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + +rbac_assign_role_after_if_else@9: + // modules/rbac.py:120 + // if role_id == UInt64(enums.ROLE_AUTHORITY): + dup + pushint 70 + == + bz rbac_assign_role_after_if_else@11 + // modules/rbac.py:121 + // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS + bytec 21 // 0x523a41555423 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:122 + // self.authority[role_address] = validity.copy() + dig 2 + box_put + // modules/rbac.py:227 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + +rbac_assign_role_after_if_else@11: + // modules/rbac.py:124 + // if role_id == UInt64(enums.ROLE_OBSERVER): + dup + pushint 80 + == + bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + // modules/rbac.py:125 + // assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS + bytec 25 // 0x523a4d4f4323 + dig 3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // modules/rbac.py:126 + // self.observer[role_address] = validity.copy() + dig 2 + box_put + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + + +// modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: +rbac_revoke_role: + // modules/rbac.py:230 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.uint8 + txna ApplicationArgs 2 + dup + cover 2 + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:249 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:250 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/rbac.py:251 + // self._assert_valid_role(role_id.as_uint64()) + btoi + dupn 2 + callsub _assert_valid_role + // modules/rbac.py:129 + // assert role_id != UInt64(enums.ROLE_ARRANGER), err.INVALID_ROLE + dup + pushint 20 + != + assert // Invalid role identifier + // modules/rbac.py:130 + // if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): + pushint 40 + == + bz rbac_revoke_role_after_if_else@3 + // modules/rbac.py:131 + // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS + bytec 23 // 0x523a4d4e4723 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:132 + // del self.account_manager[role_address] + box_del + pop + +rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: + // modules/rbac.py:253 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:230 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +rbac_revoke_role_after_if_else@3: + // modules/rbac.py:134 + // if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): + dup + pushint 50 + == + bz rbac_revoke_role_after_if_else@5 + // modules/rbac.py:135 + // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS + bytec 22 // 0x523a50594423 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:136 + // del self.primary_dealer[role_address] + box_del + pop + // modules/rbac.py:252 + // self._delete_role(role_id.as_uint64(), role_address) + b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + +rbac_revoke_role_after_if_else@5: + // modules/rbac.py:138 + // if role_id == UInt64(enums.ROLE_TRUSTEE): + dup + pushint 60 + == + bz rbac_revoke_role_after_if_else@7 + // modules/rbac.py:139 + // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS + bytec 26 // 0x523a54525323 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:140 + // del self.trustee[role_address] + box_del + pop + // modules/rbac.py:252 + // self._delete_role(role_id.as_uint64(), role_address) + b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + +rbac_revoke_role_after_if_else@7: + // modules/rbac.py:142 + // if role_id == UInt64(enums.ROLE_AUTHORITY): + dup + pushint 70 + == + bz rbac_revoke_role_after_if_else@9 + // modules/rbac.py:143 + // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS + bytec 21 // 0x523a41555423 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:144 + // del self.authority[role_address] + box_del + pop + // modules/rbac.py:252 + // self._delete_role(role_id.as_uint64(), role_address) + b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + +rbac_revoke_role_after_if_else@9: + // modules/rbac.py:146 + // if role_id == UInt64(enums.ROLE_OBSERVER): + dup + pushint 80 + == + bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + // modules/rbac.py:147 + // assert role_address in self.observer, err.INVALID_ROLE_ADDRESS + bytec 25 // 0x523a4d4f4323 + dig 2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // modules/rbac.py:148 + // del self.observer[role_address] + box_del + pop + b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 + + +// modules.rbac.RbacModule.rbac_contract_suspension[routing]() -> void: +rbac_contract_suspension: + // modules/rbac.py:255 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.bool + intc_0 // 0 + getbit + // modules/rbac.py:79 + // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED + bytec 21 // 0x523a41555423 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/rbac.py:271 + // self.contract_suspended = suspended + bytec 33 // "contract_suspended" + swap + app_global_put + // modules/rbac.py:272 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:255 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_contract_default[routing]() -> void: +rbac_contract_default: + // modules/rbac.py:274 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.bool + intc_0 // 0 + getbit + // modules/rbac.py:76 + // assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED + bytec 26 // 0x523a54525323 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/rbac.py:287 + // self.defaulted = defaulted + bytec 34 // "defaulted" + swap + app_global_put + // modules/rbac.py:288 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:274 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: +rbac_get_arranger: + // modules/rbac.py:301 + // return self.arranger.value + intc_0 // 0 + bytec 18 // 0x523a41525223 + app_global_get_ex + assert // check self.arranger exists + // modules/rbac.py:290 + // @arc4.abimethod(readonly=True) + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: +rbac_get_address_roles: + // modules/rbac.py:303 + // @arc4.abimethod(readonly=True) + txna ApplicationArgs 1 + dup + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:321 + // self._role_is_active(self.account_manager, address), + bytec 23 // 0x523a4d4e4723 + dig 1 + callsub _role_is_active + // modules/rbac.py:322 + // self._role_is_active(self.primary_dealer, address), + bytec 22 // 0x523a50594423 + dig 2 + callsub _role_is_active + // modules/rbac.py:323 + // self._role_is_active(self.trustee, address), + bytec 26 // 0x523a54525323 + dig 3 + callsub _role_is_active + // modules/rbac.py:324 + // self._role_is_active(self.authority, address), + bytec 21 // 0x523a41555423 + dig 4 + callsub _role_is_active + // modules/rbac.py:325 + // self._role_is_active(self.observer, address), + bytec 25 // 0x523a4d4f4323 + uncover 5 + callsub _role_is_active + // modules/rbac.py:303 + // @arc4.abimethod(readonly=True) + bytec 41 // 0x00 + intc_0 // 0 + uncover 6 + setbit + intc_1 // 1 + uncover 5 + setbit + pushint 2 + uncover 4 + setbit + pushint 3 + uncover 3 + setbit + pushint 4 + uncover 2 + setbit + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + + +// modules.rbac.RbacModule.rbac_get_role_validity[routing]() -> void: +rbac_get_role_validity: + // modules/rbac.py:328 + // @arc4.abimethod(readonly=True) + txna ApplicationArgs 1 + dup + len + intc_1 // 1 + == + assert // invalid number of bytes for arc4.uint8 + txna ApplicationArgs 2 + dup + cover 2 + len + intc_3 // 32 + == + assert // invalid number of bytes for arc4.static_array + // modules/rbac.py:346 + // role = role_id.as_uint64() + btoi + // modules/rbac.py:347 + // self._assert_valid_role(role) + dup + callsub _assert_valid_role + // modules/rbac.py:349 + // case UInt64(enums.ROLE_ARRANGER): + pushints 20 40 50 60 70 80 + // modules/rbac.py:348-379 + // match role: + // case UInt64(enums.ROLE_ARRANGER): + // return typ.RoleValidity( + // role_validity_start=UInt64(0), role_validity_end=UInt64(0) + // ) + // case UInt64(enums.ROLE_ACCOUNT_MANAGER): + // assert self._has_role( + // self.account_manager, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.account_manager[role_address] + // case UInt64(enums.ROLE_PRIMARY_DEALER): + // assert self._has_role( + // self.primary_dealer, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.primary_dealer[role_address] + // case UInt64(enums.ROLE_TRUSTEE): + // assert self._has_role( + // self.trustee, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.trustee[role_address] + // case UInt64(enums.ROLE_AUTHORITY): + // assert self._has_role( + // self.authority, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.authority[role_address] + // case UInt64(enums.ROLE_OBSERVER): + // assert self._has_role( + // self.observer, role_address + // ), err.INVALID_ROLE_ADDRESS + // return self.observer[role_address] + // case _: + // op.err(err.INVALID_ROLE) + uncover 6 + match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7 + // modules/rbac.py:379 + // op.err(err.INVALID_ROLE) + err // Invalid role identifier + +rbac_get_role_validity_switch_case_5@7: + // modules/rbac.py:375 + // self.observer, role_address + bytec 25 // 0x523a4d4f4323 + // modules/rbac.py:57 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:374-376 + // assert self._has_role( + // self.observer, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:377 + // return self.observer[role_address] + box_get + pop + +rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9: + // modules/rbac.py:328 + // @arc4.abimethod(readonly=True) + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +rbac_get_role_validity_switch_case_4@6: + // modules/rbac.py:370 + // self.authority, role_address + bytec 21 // 0x523a41555423 + // modules/rbac.py:57 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:369-371 + // assert self._has_role( + // self.authority, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:372 + // return self.authority[role_address] + box_get + pop + // modules/rbac.py:328 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + +rbac_get_role_validity_switch_case_3@5: + // modules/rbac.py:365 + // self.trustee, role_address + bytec 26 // 0x523a54525323 + // modules/rbac.py:57 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:364-366 + // assert self._has_role( + // self.trustee, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:367 + // return self.trustee[role_address] + box_get + pop + // modules/rbac.py:328 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + +rbac_get_role_validity_switch_case_2@4: + // modules/rbac.py:360 + // self.primary_dealer, role_address + bytec 22 // 0x523a50594423 + // modules/rbac.py:57 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:359-361 + // assert self._has_role( + // self.primary_dealer, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:362 + // return self.primary_dealer[role_address] + box_get + pop + // modules/rbac.py:328 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + +rbac_get_role_validity_switch_case_1@3: + // modules/rbac.py:355 + // self.account_manager, role_address + bytec 23 // 0x523a4d4e4723 + // modules/rbac.py:57 + // return role_address in role_map + dig 1 + concat + dup + box_len + bury 1 + // modules/rbac.py:354-356 + // assert self._has_role( + // self.account_manager, role_address + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // modules/rbac.py:357 + // return self.account_manager[role_address] + box_get + pop + // modules/rbac.py:328 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + +rbac_get_role_validity_switch_case_0@2: + // modules/rbac.py:350-352 + // return typ.RoleValidity( + // role_validity_start=UInt64(0), role_validity_end=UInt64(0) + // ) + pushbytes 0x00000000000000000000000000000000 + // modules/rbac.py:328 + // @arc4.abimethod(readonly=True) + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 + + +// modules.accounting.AccountingModule._assert_is_not_account_suspended(holding_address: bytes) -> void: +_assert_is_not_account_suspended: + // modules/accounting.py:26 + // def _assert_is_not_account_suspended(self, holding_address: Account) -> None: + proto 1 0 + // modules/accounting.py:28 + // assert not self.account[holding_address].suspended, err.SUSPENDED + bytec 8 // 0x4123 + frame_dig -1 + concat + box_get + assert // check self.account entry exists + pushint 384 + getbit + ! + assert // Suspended operations + retsub + + +// modules.accounting.AccountingModule._settle_position(holding_address: bytes) -> uint64, uint64: +_settle_position: + // modules/accounting.py:44 + // def _settle_position(self, holding_address: Account) -> tuple[UInt64, UInt64]: + proto 1 2 + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x4123 + frame_dig -1 + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // modules/accounting.py:61 + // position = self.account[holding_address].copy() + dup + box_get + pop + // modules/accounting.py:63-65 + // # Compute the incremental per-unit fixed-point interest and principal accrued + // # since this account's last checkpoint. + // interest_delta = self.cumulative_interest_index - position.interest_checkpoint + intc_0 // 0 + bytec 16 // "cumulative_interest_index" + app_global_get_ex + assert // check self.cumulative_interest_index exists + dig 1 + pushint 57 + extract_uint64 + - + // modules/accounting.py:67 + // self.cumulative_principal_index - position.principal_checkpoint + intc_0 // 0 + bytec 17 // "cumulative_principal_index" + app_global_get_ex + assert // check self.cumulative_principal_index exists + dig 2 + pushint 65 + extract_uint64 + - + // modules/accounting.py:73 + // interest_delta, position.units, self.fixed_point_scale + dig 2 + intc_3 // 32 + extract_uint64 + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/accounting.py:70-74 + // # Convert the per-unit fixed-point deltas into absolute claimable amounts + // # using the account's active units. + // claimable_interest = self._scaled_mul_div( + // interest_delta, position.units, self.fixed_point_scale + // ) + uncover 3 + dig 2 + uncover 2 + callsub _scaled_mul_div + // modules/accounting.py:76 + // principal_delta, position.units, self.fixed_point_scale + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/accounting.py:75-77 + // claimable_principal = self._scaled_mul_div( + // principal_delta, position.units, self.fixed_point_scale + // ) + uncover 3 + uncover 3 + uncover 2 + callsub _scaled_mul_div + // modules/accounting.py:79-81 + // # Accrue the claimable amounts to the account position and make them available + // # for withdrawal. + // position.claimable_interest += claimable_interest + dig 2 + pushint 73 + extract_uint64 + dig 2 + + + itob + uncover 3 + swap + replace2 73 + // modules/accounting.py:82 + // position.claimable_principal += claimable_principal + dup + pushint 81 + extract_uint64 + dig 2 + + + itob + replace2 81 + // modules/accounting.py:84-86 + // # Advance the account's per-unit fixed-point checkpoints to the current global + // # per-unit fixed-point global indices. + // position.interest_checkpoint = self.cumulative_interest_index + intc_0 // 0 + bytec 16 // "cumulative_interest_index" + app_global_get_ex + assert // check self.cumulative_interest_index exists + itob + replace2 57 + // modules/accounting.py:87 + // position.principal_checkpoint = self.cumulative_principal_index + intc_0 // 0 + bytec 17 // "cumulative_principal_index" + app_global_get_ex + assert // check self.cumulative_principal_index exists + itob + replace2 65 + // modules/accounting.py:89-90 + // # Advance the account's event cursor to the current global event cursor. + // position.settled_cursor = self.event_cursor + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + itob + replace2 49 + // modules/accounting.py:92-94 + // # Update the account position and return the newly accrued claimable amounts + // # added to the total position's claimable amounts. + // self.account[holding_address] = position.copy() + uncover 3 + swap + box_put + // modules/accounting.py:95 + // return claimable_interest, claimable_principal + retsub + + +// modules.accounting.AccountingModule._ensure_units_activated(holding_address: bytes) -> void: +_ensure_units_activated: + // modules/accounting.py:97 + // def _ensure_units_activated(self, holding_address: Account) -> None: + proto 1 0 + intc_0 // 0 + pushbytes "" + // modules/accounting.py:24 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 8 // 0x4123 + frame_dig -1 + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // modules/actus_kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/accounting.py:100 + // if self._status_is_pending_ied(): + bz _ensure_units_activated_after_if_else@2 + // modules/accounting.py:101 + // return + retsub + +_ensure_units_activated_after_if_else@2: + // modules/accounting.py:103 + // position = self.account[holding_address].copy() + frame_dig 2 + box_get + swap + dup + cover 2 + frame_bury 0 + assert // check self.account entry exists + // modules/accounting.py:104 + // if position.reserved_units == UInt64(0): + pushint 40 + extract_uint64 + dup + frame_bury 1 + bnz _ensure_units_activated_after_if_else@4 + // modules/accounting.py:105 + // return + retsub + +_ensure_units_activated_after_if_else@4: + // modules/accounting.py:108 + // position.units += activated_units + frame_dig 0 + dup + intc_3 // 32 + extract_uint64 + frame_dig 1 + dup + cover 3 + + + itob + replace2 32 + // modules/accounting.py:109 + // position.reserved_units = UInt64(0) + intc_0 // 0 + itob + replace2 40 + // modules/accounting.py:110 + // self.account[holding_address] = position.copy() + frame_dig 2 + swap + box_put + // modules/accounting.py:111 + // assert self.reserved_units_total >= activated_units, err.OVER_DISTRIBUTION + intc_0 // 0 + bytec 11 // "reserved_units_total" + app_global_get_ex + assert // check self.reserved_units_total exists + dup + dig 2 + >= + assert // Insufficient remaining D-ASA units + // modules/accounting.py:112 + // self.reserved_units_total -= activated_units + swap + - + bytec 11 // "reserved_units_total" + swap + app_global_put + retsub + + +// modules.actus_kernel.ActusKernelModule._scaled_mul_div(multiplicand: uint64, multiplier: uint64, divisor: uint64) -> uint64: +_scaled_mul_div: + // modules/actus_kernel.py:153-155 + // def _scaled_mul_div( + // self, multiplicand: UInt64, multiplier: UInt64, divisor: UInt64 + // ) -> UInt64: + proto 3 1 + // modules/actus_kernel.py:157 + // if multiplicand == UInt64(0) or multiplier == UInt64(0): + frame_dig -3 + bz _scaled_mul_div_if_body@2 + frame_dig -2 + bnz _scaled_mul_div_after_if_else@3 + +_scaled_mul_div_if_body@2: + // modules/actus_kernel.py:158 + // return UInt64(0) + intc_0 // 0 + retsub + +_scaled_mul_div_after_if_else@3: + // modules/actus_kernel.py:159 + // high, low = op.mulw(multiplicand, multiplier) + frame_dig -3 + frame_dig -2 + mulw + // modules/actus_kernel.py:160 + // return op.divw(high, low, divisor) + frame_dig -1 + divw + retsub + + +// modules.actus_kernel.ActusKernelModule._amount_to_index_delta(amount: uint64) -> uint64: +_amount_to_index_delta: + // modules/actus_kernel.py:162 + // def _amount_to_index_delta(self, amount: UInt64) -> UInt64: + proto 1 1 + // modules/actus_kernel.py:164 + // if amount == UInt64(0): + frame_dig -1 + bnz _amount_to_index_delta_after_if_else@2 + // modules/actus_kernel.py:165 + // return UInt64(0) + intc_0 // 0 + retsub + +_amount_to_index_delta_after_if_else@2: + // modules/actus_kernel.py:166 + // assert self.total_units > UInt64(0), err.NO_UNITS + intc_0 // 0 + bytec 13 // "total_units" + app_global_get_ex + assert // check self.total_units exists + dup + assert // No D-ASA units + // modules/actus_kernel.py:167 + // return self._scaled_mul_div(amount, self.fixed_point_scale, self.total_units) + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + frame_dig -1 + swap + uncover 2 + callsub _scaled_mul_div + retsub + + +// modules.actus_kernel.ActusKernelModule._index_delta_to_amount(index_delta: uint64) -> uint64: +_index_delta_to_amount: + // modules/actus_kernel.py:169 + // def _index_delta_to_amount(self, index_delta: UInt64) -> UInt64: + proto 1 1 + // modules/actus_kernel.py:176 + // if index_delta == UInt64(0): + frame_dig -1 + bnz _index_delta_to_amount_after_if_else@2 + // modules/actus_kernel.py:177 + // return UInt64(0) + intc_0 // 0 + retsub + +_index_delta_to_amount_after_if_else@2: + // modules/actus_kernel.py:179 + // self.total_units, + intc_0 // 0 + bytec 13 // "total_units" + app_global_get_ex + assert // check self.total_units exists + // modules/actus_kernel.py:181 + // self.fixed_point_scale, + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/actus_kernel.py:178-182 + // return self._scaled_mul_div( + // self.total_units, + // index_delta, + // self.fixed_point_scale, + // ) + frame_dig -1 + swap + callsub _scaled_mul_div + retsub + + +// modules.actus_kernel.ActusKernelModule._get_schedule_entry(event_id: uint64) -> bytes: +_get_schedule_entry: + // modules/actus_kernel.py:202 + // def _get_schedule_entry(self, event_id: UInt64) -> typ.ExecutionScheduleEntry: + proto 1 1 + // modules/actus_kernel.py:204 + // assert event_id < self.schedule_entry_count, err.INVALID_EVENT_ID + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + frame_dig -1 + > + assert // Invalid event id + // modules/actus_kernel.py:190 + // return event_id // UInt64(cst.SCHEDULE_PAGE_SIZE) + frame_dig -1 + pushint 16 + / + // modules/actus_kernel.py:206 + // assert page_index in self.schedule_page, err.INVALID_SCHEDULE_PAGE + itob + bytec 24 // 0x5323 + swap + concat + dup + box_len + bury 1 + assert // Invalid schedule page + // modules/actus_kernel.py:194 + // return event_id % UInt64(cst.SCHEDULE_PAGE_SIZE) + frame_dig -1 + pushint 16 + % + // modules/actus_kernel.py:209 + // assert offset < page.length, err.INVALID_SCHEDULE_PAGE + dig 1 + intc_0 // 0 + pushint 2 + box_extract + btoi + dig 1 + > + assert // Invalid schedule page + // modules/actus_kernel.py:210 + // return page[offset].copy() + pushint 65 + * + pushint 2 + + + pushint 65 + box_extract + retsub + + +// modules.actus_kernel.ActusKernelModule._assert_event_allowed_for_contract_type(contract_type: uint64, event_type: uint64) -> void: +_assert_event_allowed_for_contract_type: + // modules/actus_kernel.py:313-315 + // def _assert_event_allowed_for_contract_type( + // self, contract_type: UInt64, event_type: UInt64 + // ) -> None: + proto 2 0 + // modules/actus_kernel.py:254-255 + // # Check common events first + // if event_type in common_events: + frame_dig -1 + // modules/actus_kernel.py:247 + // UInt64(enums.EVT_IED), + intc_1 // 1 + // modules/actus_kernel.py:254-255 + // # Check common events first + // if event_type in common_events: + == + bnz _assert_event_allowed_for_contract_type_if_body@6 + frame_dig -1 + // modules/actus_kernel.py:248 + // UInt64(enums.EVT_IP), + intc_2 // 8 + // modules/actus_kernel.py:254-255 + // # Check common events first + // if event_type in common_events: + == + bnz _assert_event_allowed_for_contract_type_if_body@6 + frame_dig -1 + // modules/actus_kernel.py:249 + // UInt64(enums.EVT_MD), + pushint 19 + // modules/actus_kernel.py:254-255 + // # Check common events first + // if event_type in common_events: + == + bnz _assert_event_allowed_for_contract_type_if_body@6 + frame_dig -1 + // modules/actus_kernel.py:250 + // UInt64(enums.EVT_RR), + pushint 12 + // modules/actus_kernel.py:254-255 + // # Check common events first + // if event_type in common_events: + == + bnz _assert_event_allowed_for_contract_type_if_body@6 + frame_dig -1 + // modules/actus_kernel.py:251 + // UInt64(enums.EVT_RRF), + pushint 11 + // modules/actus_kernel.py:254-255 + // # Check common events first + // if event_type in common_events: + == + bz _assert_event_allowed_for_contract_type_after_if_else@7 + +_assert_event_allowed_for_contract_type_if_body@6: + // modules/actus_kernel.py:256 + // return True + intc_1 // 1 + +_assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34: + // modules/actus_kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + assert // Invalid ACTUS configuration + retsub + +_assert_event_allowed_for_contract_type_after_if_else@7: + // modules/actus_kernel.py:258-259 + // # Contract-specific additional events + // if contract_type == UInt64(enums.CT_PAM): + frame_dig -2 + bnz _assert_event_allowed_for_contract_type_after_if_else@9 + // modules/actus_kernel.py:260-261 + // # PAM only supports common events + // return False + intc_0 // 0 + // modules/actus_kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_after_if_else@9: + // modules/actus_kernel.py:263 + // if contract_type == UInt64(enums.CT_LAM) or contract_type == UInt64( + frame_dig -2 + pushint 3 + == + // modules/actus_kernel.py:263-265 + // if contract_type == UInt64(enums.CT_LAM) or contract_type == UInt64( + // enums.CT_NAM + // ): + bnz _assert_event_allowed_for_contract_type_if_body@11 + frame_dig -2 + pushint 2 + == + bz _assert_event_allowed_for_contract_type_after_if_else@16 + +_assert_event_allowed_for_contract_type_if_body@11: + // modules/actus_kernel.py:266-270 + // # LAM/NAM add: PR, IPCB + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // ) + frame_dig -1 + // modules/actus_kernel.py:268 + // UInt64(enums.EVT_PR), + pushint 3 + // modules/actus_kernel.py:266-270 + // # LAM/NAM add: PR, IPCB + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // ) + == + bnz _assert_event_allowed_for_contract_type_bool_true@13 + frame_dig -1 + // modules/actus_kernel.py:269 + // UInt64(enums.EVT_IPCB), + pushint 18 + // modules/actus_kernel.py:266-270 + // # LAM/NAM add: PR, IPCB + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // ) + == + bz _assert_event_allowed_for_contract_type_bool_false@14 + +_assert_event_allowed_for_contract_type_bool_true@13: + intc_1 // 1 + // modules/actus_kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_bool_false@14: + intc_0 // 0 + // modules/actus_kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_after_if_else@16: + // modules/actus_kernel.py:272 + // if contract_type == UInt64(enums.CT_ANN): + frame_dig -2 + intc_1 // 1 + == + bz _assert_event_allowed_for_contract_type_after_if_else@23 + // modules/actus_kernel.py:273-278 + // # ANN adds: PR, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + frame_dig -1 + // modules/actus_kernel.py:275 + // UInt64(enums.EVT_PR), + pushint 3 + // modules/actus_kernel.py:273-278 + // # ANN adds: PR, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz _assert_event_allowed_for_contract_type_bool_true@20 + frame_dig -1 + // modules/actus_kernel.py:276 + // UInt64(enums.EVT_IPCB), + pushint 18 + // modules/actus_kernel.py:273-278 + // # ANN adds: PR, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz _assert_event_allowed_for_contract_type_bool_true@20 + frame_dig -1 + // modules/actus_kernel.py:277 + // UInt64(enums.EVT_PRF), + pushint 5 + // modules/actus_kernel.py:273-278 + // # ANN adds: PR, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bz _assert_event_allowed_for_contract_type_bool_false@21 + +_assert_event_allowed_for_contract_type_bool_true@20: + intc_1 // 1 + // modules/actus_kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_bool_false@21: + intc_0 // 0 + // modules/actus_kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_after_if_else@23: + // modules/actus_kernel.py:280 + // if contract_type == UInt64(enums.CT_LAX): + frame_dig -2 + pushint 4 + == + bz _assert_event_allowed_for_contract_type_after_if_else@31 + // modules/actus_kernel.py:281-287 + // # LAX adds: PR, PI, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + frame_dig -1 + // modules/actus_kernel.py:283 + // UInt64(enums.EVT_PR), + pushint 3 + // modules/actus_kernel.py:281-287 + // # LAX adds: PR, PI, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz _assert_event_allowed_for_contract_type_bool_true@28 + frame_dig -1 + // modules/actus_kernel.py:284 + // UInt64(enums.EVT_PI), + pushint 4 + // modules/actus_kernel.py:281-287 + // # LAX adds: PR, PI, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz _assert_event_allowed_for_contract_type_bool_true@28 + frame_dig -1 + // modules/actus_kernel.py:285 + // UInt64(enums.EVT_IPCB), + pushint 18 + // modules/actus_kernel.py:281-287 + // # LAX adds: PR, PI, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bnz _assert_event_allowed_for_contract_type_bool_true@28 + frame_dig -1 + // modules/actus_kernel.py:286 + // UInt64(enums.EVT_PRF), + pushint 5 + // modules/actus_kernel.py:281-287 + // # LAX adds: PR, PI, IPCB, PRF + // return event_type in ( + // UInt64(enums.EVT_PR), + // UInt64(enums.EVT_PI), + // UInt64(enums.EVT_IPCB), + // UInt64(enums.EVT_PRF), + // ) + == + bz _assert_event_allowed_for_contract_type_bool_false@29 + +_assert_event_allowed_for_contract_type_bool_true@28: + intc_1 // 1 + // modules/actus_kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_bool_false@29: + intc_0 // 0 + // modules/actus_kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_after_if_else@31: + // modules/actus_kernel.py:289 + // if contract_type == UInt64(enums.CT_CLM): + frame_dig -2 + pushint 5 + == + bz _assert_event_allowed_for_contract_type_after_if_else@33 + // modules/actus_kernel.py:290-291 + // # CLM adds: PR + // return event_type == UInt64(enums.EVT_PR) + frame_dig -1 + pushint 3 + == + // modules/actus_kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 + +_assert_event_allowed_for_contract_type_after_if_else@33: + // modules/actus_kernel.py:293 + // return False + intc_0 // 0 + // modules/actus_kernel.py:317-319 + // assert self._event_allowed_for_contract_type( + // contract_type, event_type + // ), err.INVALID_ACTUS_CONFIG + b _assert_event_allowed_for_contract_type_after_inlined_modules.actus_kernel.ActusKernelModule._event_allowed_for_contract_type@34 + + +// modules.actus_kernel.ActusKernelModule._is_dynamic_annuity() -> uint64: +_is_dynamic_annuity: + // modules/actus_kernel.py:335 + // self.contract_type == UInt64(enums.CT_ANN) + intc_0 // 0 + bytec 10 // "contract_type" + app_global_get_ex + assert // check self.contract_type exists + intc_1 // 1 + == + // modules/actus_kernel.py:335-336 + // self.contract_type == UInt64(enums.CT_ANN) + // and self.dynamic_principal_redemption + bz _is_dynamic_annuity_bool_false@3 + // modules/actus_kernel.py:336 + // and self.dynamic_principal_redemption + intc_0 // 0 + bytec 35 // "dynamic_principal_redemption" + app_global_get_ex + assert // check self.dynamic_principal_redemption exists + // modules/actus_kernel.py:335-336 + // self.contract_type == UInt64(enums.CT_ANN) + // and self.dynamic_principal_redemption + bz _is_dynamic_annuity_bool_false@3 + intc_1 // 1 + // modules/actus_kernel.py:334-337 + // return ( + // self.contract_type == UInt64(enums.CT_ANN) + // and self.dynamic_principal_redemption + // ) + retsub + +_is_dynamic_annuity_bool_false@3: + intc_0 // 0 + // modules/actus_kernel.py:334-337 + // return ( + // self.contract_type == UInt64(enums.CT_ANN) + // and self.dynamic_principal_redemption + // ) + retsub + + +// modules.actus_kernel.ActusKernelModule._entry_interest_segment(entry: bytes) -> uint64, bytes: +_entry_interest_segment: + // modules/actus_kernel.py:380 + // def _entry_interest_segment(self, entry: typ.ExecutionScheduleEntry) -> UInt64: + proto 1 2 + // modules/actus_kernel.py:389 + // entry.accrual_factor == UInt64(0) + frame_dig -1 + pushint 17 + extract_uint64 + dup + // modules/actus_kernel.py:389-391 + // entry.accrual_factor == UInt64(0) + // or self.nominal_interest_rate == UInt64(0) + // or self.interest_calculation_base == UInt64(0) + bz _entry_interest_segment_if_body@3 + // modules/actus_kernel.py:390 + // or self.nominal_interest_rate == UInt64(0) + intc_0 // 0 + bytec 9 // "nominal_interest_rate" + app_global_get_ex + assert // check self.nominal_interest_rate exists + // modules/actus_kernel.py:389-391 + // entry.accrual_factor == UInt64(0) + // or self.nominal_interest_rate == UInt64(0) + // or self.interest_calculation_base == UInt64(0) + bz _entry_interest_segment_if_body@3 + // modules/actus_kernel.py:391 + // or self.interest_calculation_base == UInt64(0) + intc_0 // 0 + bytec 7 // "interest_calculation_base" + app_global_get_ex + assert // check self.interest_calculation_base exists + // modules/actus_kernel.py:389-391 + // entry.accrual_factor == UInt64(0) + // or self.nominal_interest_rate == UInt64(0) + // or self.interest_calculation_base == UInt64(0) + bnz _entry_interest_segment_after_if_else@4 + +_entry_interest_segment_if_body@3: + // modules/actus_kernel.py:393 + // return UInt64(0) + intc_0 // 0 + frame_dig -1 + uncover 2 + retsub + +_entry_interest_segment_after_if_else@4: + // modules/actus_kernel.py:395 + // self.interest_calculation_base, + intc_0 // 0 + bytec 7 // "interest_calculation_base" + app_global_get_ex + assert // check self.interest_calculation_base exists + // modules/actus_kernel.py:396 + // self.nominal_interest_rate, + intc_0 // 0 + bytec 9 // "nominal_interest_rate" + app_global_get_ex + assert // check self.nominal_interest_rate exists + // modules/actus_kernel.py:397 + // self.fixed_point_scale, + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/actus_kernel.py:394-398 + // accrued = self._scaled_mul_div( + // self.interest_calculation_base, + // self.nominal_interest_rate, + // self.fixed_point_scale, + // ) + callsub _scaled_mul_div + // modules/actus_kernel.py:402 + // self.fixed_point_scale, + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/actus_kernel.py:399-403 + // return self._scaled_mul_div( + // accrued, + // entry.accrual_factor, + // self.fixed_point_scale, + // ) + frame_dig 0 + swap + callsub _scaled_mul_div + frame_dig -1 + uncover 2 + retsub + + +// modules.actus_kernel.ActusKernelModule._discount_annuity_factor(discount_factor: uint64, redemption_factor: uint64) -> uint64: +_discount_annuity_factor: + // modules/actus_kernel.py:462-466 + // def _discount_annuity_factor( + // self, + // discount_factor: UInt64, + // redemption_factor: UInt64, + // ) -> UInt64: + proto 2 1 + // modules/actus_kernel.py:468 + // if redemption_factor == UInt64(0): + frame_dig -1 + bnz _discount_annuity_factor_after_if_else@2 + // modules/actus_kernel.py:469 + // return discount_factor + frame_dig -2 + retsub + +_discount_annuity_factor_after_if_else@2: + // modules/actus_kernel.py:470 + // period_rate = self.fixed_point_scale + self._scaled_mul_div( + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/actus_kernel.py:471 + // self.nominal_interest_rate, + intc_0 // 0 + bytec 9 // "nominal_interest_rate" + app_global_get_ex + assert // check self.nominal_interest_rate exists + // modules/actus_kernel.py:470-474 + // period_rate = self.fixed_point_scale + self._scaled_mul_div( + // self.nominal_interest_rate, + // redemption_factor, + // self.fixed_point_scale, + // ) + frame_dig -1 + dig 2 + callsub _scaled_mul_div + + + // modules/actus_kernel.py:475 + // assert period_rate > UInt64(0), err.INVALID_ACTUS_CONFIG + dup + assert // Invalid ACTUS configuration + // modules/actus_kernel.py:478 + // self.fixed_point_scale, + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/actus_kernel.py:476-480 + // return self._scaled_mul_div( + // discount_factor, + // self.fixed_point_scale, + // period_rate, + // ) + frame_dig -2 + swap + uncover 2 + callsub _scaled_mul_div + retsub + + +// modules.actus_kernel.ActusKernelModule._apply_non_cash_schedule_entry(entry: bytes, payload: bytes) -> bytes, bytes: +_apply_non_cash_schedule_entry: + // modules/actus_kernel.py:613-615 + // def _apply_non_cash_schedule_entry( + // self, entry: typ.ExecutionScheduleEntry, payload: typ.ObservedEventRequest + // ) -> None: + proto 2 2 + intc_0 // 0 + pushbytes "" + dupn 8 + // modules/actus_kernel.py:623 + // assert entry.event_id == self.event_cursor, err.INVALID_EVENT_CURSOR + frame_dig -2 + intc_0 // 0 + extract_uint64 + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + == + assert // Invalid event cursor + // modules/actus_kernel.py:624 + // assert entry.scheduled_time <= Global.latest_timestamp, err.NO_DUE_CASHFLOW + frame_dig -2 + pushint 9 + extract_uint64 + global LatestTimestamp + <= + assert // No due cashflow to pay + // modules/actus_kernel.py:626 + // event_type = entry.event_type.as_uint64() + frame_dig -2 + intc_2 // 8 + getbyte + dup + // modules/actus_kernel.py:627 + // if event_type == UInt64(enums.EVT_IED): + intc_1 // 1 + == + dup + bz _apply_non_cash_schedule_entry_after_if_else@6 + // modules/actus_kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/actus_kernel.py:628-630 + // # IED finalizes issuance: reserved units become activatable and the + // # schedule's initial contractual state becomes live. + // assert self._status_is_pending_ied(), err.INVALID_ACTUS_CONFIG + assert // Invalid ACTUS configuration + // modules/actus_kernel.py:632 + // self.reserved_units_total == self.total_units + intc_0 // 0 + bytec 11 // "reserved_units_total" + app_global_get_ex + assert // check self.reserved_units_total exists + intc_0 // 0 + bytec 13 // "total_units" + app_global_get_ex + assert // check self.total_units exists + == + // modules/actus_kernel.py:631-633 + // assert ( + // self.reserved_units_total == self.total_units + // ), err.PRIMARY_DISTRIBUTION_INCOMPLETE + assert // Primary distribution is not complete + // modules/actus_kernel.py:634 + // self.outstanding_principal = entry.next_outstanding_principal + frame_dig -2 + pushint 49 + extract_uint64 + bytec 4 // "outstanding_principal" + dig 1 + app_global_put + // modules/actus_kernel.py:635 + // self.interest_calculation_base = entry.next_outstanding_principal + bytec 7 // "interest_calculation_base" + swap + app_global_put + // modules/actus_kernel.py:636 + // self.nominal_interest_rate = entry.next_nominal_interest_rate + frame_dig -2 + pushint 33 + extract_uint64 + bytec 9 // "nominal_interest_rate" + swap + app_global_put + // modules/actus_kernel.py:637 + // self.accrued_interest = UInt64(0) + bytec 6 // "accrued_interest" + intc_0 // 0 + app_global_put + // modules/actus_kernel.py:638 + // self.next_principal_redemption = entry.next_principal_redemption + frame_dig -2 + pushint 41 + extract_uint64 + bytec 14 // "next_principal_redemption" + swap + app_global_put + // modules/actus_kernel.py:639 + // self.event_cursor += UInt64(1) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_1 // 1 + + + bytec_2 // "event_cursor" + swap + app_global_put + // modules/actus_kernel.py:640 + // self.status = UInt64(enums.STATUS_ACTIVE) + bytec_1 // "status" + pushint 100 + app_global_put + // modules/actus_kernel.py:451 + // assert entry.event_type.as_uint64() == UInt64(enums.EVT_IED), err.NOT_EVT_IED + frame_dig 11 + assert // Not IED event + // modules/actus_kernel.py:452 + // return self.initial_exchange_amount + intc_0 // 0 + bytec 20 // "initial_exchange_amount" + app_global_get_ex + assert // check self.initial_exchange_amount exists + // modules/actus_kernel.py:641-645 + // self._emit_execution_event( + // entry=entry, + // payoff=self._entry_ied_amount(entry), + // settled_amount=UInt64(0), + // ) + frame_dig -2 + swap + // modules/actus_kernel.py:644 + // settled_amount=UInt64(0), + intc_0 // 0 + // modules/actus_kernel.py:641-645 + // self._emit_execution_event( + // entry=entry, + // payoff=self._entry_ied_amount(entry), + // settled_amount=UInt64(0), + // ) + callsub _emit_execution_event + dup + frame_bury -2 + // modules/actus_kernel.py:646 + // return + frame_dig -1 + frame_bury 1 + frame_bury 0 + retsub + +_apply_non_cash_schedule_entry_after_if_else@6: + // modules/actus_kernel.py:135 + // return self.status == UInt64(enums.STATUS_PENDING_IED) + intc_0 // 0 + bytec_1 // "status" + app_global_get_ex + assert // check self.status exists + pushint 50 + == + // modules/actus_kernel.py:147 + // assert not self._status_is_pending_ied(), err.PENDING_IED + ! + assert // IED not yet executed + // modules/actus_kernel.py:649 + // self.accrued_interest += self._entry_interest_segment(entry) + intc_0 // 0 + bytec 6 // "accrued_interest" + app_global_get_ex + assert // check self.accrued_interest exists + frame_dig -2 + callsub _entry_interest_segment + frame_bury -2 + + + bytec 6 // "accrued_interest" + swap + app_global_put + // modules/actus_kernel.py:651 + // if event_type == UInt64(enums.EVT_RR): + frame_dig 10 + pushint 12 + == + bz _apply_non_cash_schedule_entry_else_body@10 + // modules/actus_kernel.py:655 + // payload.observed_rate, + frame_dig -1 + pushint 33 + extract_uint64 + // modules/actus_kernel.py:656 + // self.rate_reset_multiplier, + intc_0 // 0 + bytec 37 // "rate_reset_multiplier" + app_global_get_ex + assert // check self.rate_reset_multiplier exists + // modules/actus_kernel.py:657 + // self.fixed_point_scale, + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/actus_kernel.py:652-658 + // # RR derives the next rate from an observed oracle value plus the + // # contract spread / multiplier terms, then enforces floor and cap. + // observed_rate = self._scaled_mul_div( + // payload.observed_rate, + // self.rate_reset_multiplier, + // self.fixed_point_scale, + // ) + callsub _scaled_mul_div + // modules/actus_kernel.py:660 + // observed_rate + self.rate_reset_spread + intc_0 // 0 + bytec 36 // "rate_reset_spread" + app_global_get_ex + assert // check self.rate_reset_spread exists + + + frame_bury 6 + // modules/actus_kernel.py:741 + // if self.has_rate_reset_floor and rate < self.rate_reset_floor: + intc_0 // 0 + bytec 39 // "has_rate_reset_floor" + app_global_get_ex + assert // check self.has_rate_reset_floor exists + bz _apply_non_cash_schedule_entry_after_if_else@55 + intc_0 // 0 + bytec 31 // "rate_reset_floor" + app_global_get_ex + assert // check self.rate_reset_floor exists + frame_dig 6 + > + bz _apply_non_cash_schedule_entry_after_if_else@55 + // modules/actus_kernel.py:742 + // rate = self.rate_reset_floor + intc_0 // 0 + bytec 31 // "rate_reset_floor" + app_global_get_ex + swap + frame_bury 6 + assert // check self.rate_reset_floor exists + +_apply_non_cash_schedule_entry_after_if_else@55: + // modules/actus_kernel.py:743 + // if self.has_rate_reset_cap and rate > self.rate_reset_cap: + intc_0 // 0 + bytec 40 // "has_rate_reset_cap" + app_global_get_ex + assert // check self.has_rate_reset_cap exists + bz _apply_non_cash_schedule_entry_after_if_else@58 + intc_0 // 0 + bytec 32 // "rate_reset_cap" + app_global_get_ex + assert // check self.rate_reset_cap exists + frame_dig 6 + < + bz _apply_non_cash_schedule_entry_after_if_else@58 + // modules/actus_kernel.py:744 + // rate = self.rate_reset_cap + intc_0 // 0 + bytec 32 // "rate_reset_cap" + app_global_get_ex + swap + frame_bury 6 + assert // check self.rate_reset_cap exists + +_apply_non_cash_schedule_entry_after_if_else@58: + // modules/actus_kernel.py:659 + // self.nominal_interest_rate = self._clamp_rate( + bytec 9 // "nominal_interest_rate" + // modules/actus_kernel.py:659-661 + // self.nominal_interest_rate = self._clamp_rate( + // observed_rate + self.rate_reset_spread + // ) + frame_dig 6 + app_global_put + +_apply_non_cash_schedule_entry_after_if_else@18: + // modules/actus_kernel.py:671 + // if event_type == UInt64(enums.EVT_PI): + frame_dig 10 + pushint 4 + == + bz _apply_non_cash_schedule_entry_else_body@20 + // modules/actus_kernel.py:672 + // self.outstanding_principal = entry.next_outstanding_principal + frame_dig -2 + pushint 49 + extract_uint64 + bytec 4 // "outstanding_principal" + dig 1 + app_global_put + // modules/actus_kernel.py:673 + // self.interest_calculation_base = entry.next_outstanding_principal + bytec 7 // "interest_calculation_base" + swap + app_global_put + +_apply_non_cash_schedule_entry_after_if_else@23: + // modules/actus_kernel.py:678 + // if self._is_dynamic_annuity(): + callsub _is_dynamic_annuity + bz _apply_non_cash_schedule_entry_else_body@29 + // modules/actus_kernel.py:679 + // if event_type == UInt64(enums.EVT_PRF): + frame_dig 10 + pushint 5 + == + bz _apply_non_cash_schedule_entry_after_if_else@30 + // modules/actus_kernel.py:683 + // + (self.schedule_entry_count - self.event_cursor) + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + - + // modules/actus_kernel.py:684 + // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + pushint 100 + // modules/actus_kernel.py:683-684 + // + (self.schedule_entry_count - self.event_cursor) + // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + * + // modules/actus_kernel.py:682 + // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) + intc 4 // 1500 + // modules/actus_kernel.py:682-684 + // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) + // + (self.schedule_entry_count - self.event_cursor) + // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + + + // modules/actus_kernel.py:680-686 + // ensure_budget( + // required_budget=( + // UInt64(cst.OP_UP_NON_CASH_BASE_BUDGET) + // + (self.schedule_entry_count - self.event_cursor) + // * UInt64(cst.OP_UP_NON_CASH_PER_ENTRY_BUDGET) + // ), + // ) + intc_0 // 0 + callsub ensure_budget + // modules/actus_kernel.py:490 + // discount_factor = self.fixed_point_scale + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + swap + frame_bury 2 + assert // check self.fixed_point_scale exists + // modules/actus_kernel.py:491 + // denominator = UInt64(0) + intc_0 // 0 + frame_bury 1 + // modules/actus_kernel.py:492 + // skip_first_redemption = False + intc_0 // 0 + frame_bury 7 + // modules/actus_kernel.py:494 + // if entry.redemption_accrual_factor > UInt64(0): + frame_dig -2 + pushint 25 + extract_uint64 + dup + frame_bury 8 + bz _apply_non_cash_schedule_entry_after_if_else@35 + // modules/actus_kernel.py:495-499 + // # An initial PRF may describe the first redemption period directly. + // discount_factor = self._discount_annuity_factor( + // discount_factor, + // entry.redemption_accrual_factor, + // ) + frame_dig 2 + frame_dig 8 + callsub _discount_annuity_factor + dup + frame_bury 2 + // modules/actus_kernel.py:501 + // skip_first_redemption = True + intc_1 // 1 + frame_bury 7 + frame_bury 1 + +_apply_non_cash_schedule_entry_after_if_else@35: + // modules/actus_kernel.py:503 + // future_event_id = self.event_cursor + UInt64(1) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_1 // 1 + + + frame_bury 3 + +_apply_non_cash_schedule_entry_while_top@36: + // modules/actus_kernel.py:504 + // while future_event_id < self.schedule_entry_count: + intc_0 // 0 + bytec_3 // "schedule_entry_count" + app_global_get_ex + assert // check self.schedule_entry_count exists + frame_dig 3 + > + bz _apply_non_cash_schedule_entry_after_while@48 + // modules/actus_kernel.py:505 + // future_entry = self._get_schedule_entry(future_event_id) + frame_dig 3 + callsub _get_schedule_entry + dup + frame_bury 0 + // modules/actus_kernel.py:506 + // future_event_type = future_entry.event_type.as_uint64() + intc_2 // 8 + getbyte + dup + frame_bury 4 + // modules/actus_kernel.py:507-508 + // # Only redemption-bearing events contribute to the annuity denominator. + // is_redemption_event = future_event_type == UInt64(enums.EVT_PR) or ( + pushint 3 + == + // modules/actus_kernel.py:507-511 + // # Only redemption-bearing events contribute to the annuity denominator. + // is_redemption_event = future_event_type == UInt64(enums.EVT_PR) or ( + // future_event_type == UInt64(enums.EVT_MD) + // and future_entry.redemption_accrual_factor > UInt64(0) + // ) + bnz _apply_non_cash_schedule_entry_bool_true@40 + // modules/actus_kernel.py:509 + // future_event_type == UInt64(enums.EVT_MD) + frame_dig 4 + pushint 19 + == + // modules/actus_kernel.py:509-510 + // future_event_type == UInt64(enums.EVT_MD) + // and future_entry.redemption_accrual_factor > UInt64(0) + bz _apply_non_cash_schedule_entry_bool_false@41 + // modules/actus_kernel.py:510 + // and future_entry.redemption_accrual_factor > UInt64(0) + frame_dig 0 + pushint 25 + extract_uint64 + // modules/actus_kernel.py:509-510 + // future_event_type == UInt64(enums.EVT_MD) + // and future_entry.redemption_accrual_factor > UInt64(0) + bz _apply_non_cash_schedule_entry_bool_false@41 + +_apply_non_cash_schedule_entry_bool_true@40: + intc_1 // 1 + +_apply_non_cash_schedule_entry_bool_merge@42: + // modules/actus_kernel.py:512 + // if is_redemption_event: + bz _apply_non_cash_schedule_entry_after_if_else@47 + // modules/actus_kernel.py:513 + // if skip_first_redemption: + frame_dig 7 + bz _apply_non_cash_schedule_entry_else_body@45 + // modules/actus_kernel.py:514 + // skip_first_redemption = False + intc_0 // 0 + frame_bury 7 + +_apply_non_cash_schedule_entry_after_if_else@47: + // modules/actus_kernel.py:521 + // future_event_id += UInt64(1) + frame_dig 3 + intc_1 // 1 + + + frame_bury 3 + b _apply_non_cash_schedule_entry_while_top@36 + +_apply_non_cash_schedule_entry_else_body@45: + // modules/actus_kernel.py:518 + // future_entry.redemption_accrual_factor, + frame_dig 0 + pushint 25 + extract_uint64 + // modules/actus_kernel.py:516-519 + // discount_factor = self._discount_annuity_factor( + // discount_factor, + // future_entry.redemption_accrual_factor, + // ) + frame_dig 2 + swap + callsub _discount_annuity_factor + dup + frame_bury 2 + // modules/actus_kernel.py:520 + // denominator += discount_factor + frame_dig 1 + + + frame_bury 1 + b _apply_non_cash_schedule_entry_after_if_else@47 + +_apply_non_cash_schedule_entry_bool_false@41: + intc_0 // 0 + b _apply_non_cash_schedule_entry_bool_merge@42 + +_apply_non_cash_schedule_entry_after_while@48: + // modules/actus_kernel.py:523 + // assert denominator > UInt64(0), err.INVALID_ACTUS_CONFIG + frame_dig 1 + assert // Invalid ACTUS configuration + // modules/actus_kernel.py:524 + // numerator = self.outstanding_principal + intc_0 // 0 + bytec 4 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + // modules/actus_kernel.py:525 + // if entry.flags & UInt64(enums.FLAG_INITIAL_PRF) == UInt64(0): + frame_dig -2 + pushint 57 + extract_uint64 + intc_2 // 8 + & + bnz _apply_non_cash_schedule_entry_after_if_else@50 + // modules/actus_kernel.py:526-527 + // # Subsequent PRF events amortize both principal and already accrued carry. + // numerator += self.accrued_interest + intc_0 // 0 + bytec 6 // "accrued_interest" + app_global_get_ex + assert // check self.accrued_interest exists + + + +_apply_non_cash_schedule_entry_after_if_else@50: + // modules/actus_kernel.py:530 + // self.fixed_point_scale, + intc_0 // 0 + bytec 5 // "fixed_point_scale" + app_global_get_ex + assert // check self.fixed_point_scale exists + // modules/actus_kernel.py:528-532 + // return self._scaled_mul_div( + // numerator, + // self.fixed_point_scale, + // denominator, + // ) + frame_dig 1 + callsub _scaled_mul_div + // modules/actus_kernel.py:687 + // self.next_principal_redemption = self._recalculate_annuity_payment( + bytec 14 // "next_principal_redemption" + // modules/actus_kernel.py:687-689 + // self.next_principal_redemption = self._recalculate_annuity_payment( + // entry + // ) + swap + app_global_put + +_apply_non_cash_schedule_entry_after_if_else@30: + // modules/actus_kernel.py:692 + // self.event_cursor += UInt64(1) + intc_0 // 0 + bytec_2 // "event_cursor" + app_global_get_ex + assert // check self.event_cursor exists + intc_1 // 1 + + + bytec_2 // "event_cursor" + swap + app_global_put + // modules/actus_kernel.py:693-697 + // self._emit_execution_event( + // entry=entry, + // payoff=UInt64(0), + // settled_amount=UInt64(0), + // ) + frame_dig -2 + // modules/actus_kernel.py:695 + // payoff=UInt64(0), + intc_0 // 0 + // modules/actus_kernel.py:696 + // settled_amount=UInt64(0), + dup + // modules/actus_kernel.py:693-697 + // self._emit_execution_event( + // entry=entry, + // payoff=UInt64(0), + // settled_amount=UInt64(0), + // ) + callsub _emit_execution_event + dup + frame_bury -2 + frame_dig -1 + frame_bury 1 + frame_bury 0 + retsub + +_apply_non_cash_schedule_entry_else_body@29: + // modules/actus_kernel.py:691 + // self.next_principal_redemption = entry.next_principal_redemption + frame_dig -2 + pushint 41 + extract_uint64 + bytec 14 // "next_principal_redemption" + swap + app_global_put + b _apply_non_cash_schedule_entry_after_if_else@30 + +_apply_non_cash_schedule_entry_else_body@20: + // modules/actus_kernel.py:674 + // elif event_type == UInt64(enums.EVT_IPCB): + frame_dig 10 + pushint 18 + == + bz _apply_non_cash_schedule_entry_after_if_else@23 + // modules/actus_kernel.py:675-676 + // # IPCB keeps principal unchanged and only resets the interest base. + // self.interest_calculation_base = self.outstanding_principal + intc_0 // 0 + bytec 4 // "outstanding_principal" + app_global_get_ex + assert // check self.outstanding_principal exists + bytec 7 // "interest_calculation_base" + swap + app_global_put + b _apply_non_cash_schedule_entry_after_if_else@23 + +_apply_non_cash_schedule_entry_else_body@10: + // modules/actus_kernel.py:662 + // elif event_type == UInt64(enums.EVT_RRF): + frame_dig 10 + pushint 11 + == + bz _apply_non_cash_schedule_entry_else_body@14 + // modules/actus_kernel.py:663 + // next_rate = entry.next_nominal_interest_rate + frame_dig -2 + pushint 33 + extract_uint64 + dup + frame_bury 5 + // modules/actus_kernel.py:664 + // if next_rate == UInt64(0): + bnz _apply_non_cash_schedule_entry_after_if_else@13 + // modules/actus_kernel.py:665 + // next_rate = self.rate_reset_next + intc_0 // 0 + bytec 38 // "rate_reset_next" + app_global_get_ex + swap + frame_bury 5 + assert // check self.rate_reset_next exists + +_apply_non_cash_schedule_entry_after_if_else@13: + // modules/actus_kernel.py:666 + // self.nominal_interest_rate = next_rate + bytec 9 // "nominal_interest_rate" + frame_dig 5 + app_global_put + b _apply_non_cash_schedule_entry_after_if_else@18 + +_apply_non_cash_schedule_entry_else_body@14: + // modules/actus_kernel.py:668 + // if entry.next_nominal_interest_rate != UInt64(0): + frame_dig -2 + pushint 33 + extract_uint64 + dup + frame_bury 9 + bz _apply_non_cash_schedule_entry_after_if_else@18 + // modules/actus_kernel.py:669 + // self.nominal_interest_rate = entry.next_nominal_interest_rate + bytec 9 // "nominal_interest_rate" + frame_dig 9 + app_global_put + b _apply_non_cash_schedule_entry_after_if_else@18 + + +// modules.actus_kernel.ActusKernelModule._emit_execution_event(entry: bytes, payoff: uint64, settled_amount: uint64) -> bytes: +_emit_execution_event: + // modules/actus_kernel.py:703-709 + // def _emit_execution_event( + // self, + // *, + // entry: typ.ExecutionScheduleEntry, + // payoff: UInt64, + // settled_amount: UInt64, + // ) -> None: + proto 3 1 + // modules/actus_kernel.py:713 + // contract_id=Global.current_application_id.id, + global CurrentApplicationID + // modules/actus_kernel.py:714 + // event_id=entry.event_id, + frame_dig -3 + intc_0 // 0 + extract_uint64 + // modules/actus_kernel.py:715 + // event_type=entry.event_type, + frame_dig -3 + extract 8 1 + // modules/actus_kernel.py:716 + // scheduled_time=entry.scheduled_time, + frame_dig -3 + extract 9 8 + // modules/actus_kernel.py:717 + // applied_at=Global.latest_timestamp, + global LatestTimestamp + // modules/actus_kernel.py:720 + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + frame_dig -3 + // modules/actus_kernel.py:715 + // event_type=entry.event_type, + intc_2 // 8 + // modules/actus_kernel.py:720 + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + getbyte + // modules/actus_kernel.py:749 + // if payoff == UInt64(0): + frame_dig -2 + bnz _emit_execution_event_after_if_else@3 + // modules/actus_kernel.py:750 + // return UInt64(enums.PAYOFF_SIGN_POSITIVE) + intc_1 // 1 + +_emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7: + // modules/actus_kernel.py:719-721 + // payoff_sign=arc4.UInt8( + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + // ), + itob + dup + bitlen + intc_2 // 8 + <= + assert // overflow + extract 7 1 + // modules/actus_kernel.py:723 + // currency_id=self.settlement_asset_id, + intc_0 // 0 + bytec 19 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + // modules/actus_kernel.py:724 + // sequence=entry.event_id + UInt64(1), + frame_dig 1 + dup + intc_1 // 1 + + + // modules/actus_kernel.py:712-725 + // ExecutionEvent( + // contract_id=Global.current_application_id.id, + // event_id=entry.event_id, + // event_type=entry.event_type, + // scheduled_time=entry.scheduled_time, + // applied_at=Global.latest_timestamp, + // payoff=payoff, + // payoff_sign=arc4.UInt8( + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + // ), + // settled_amount=settled_amount, + // currency_id=self.settlement_asset_id, + // sequence=entry.event_id + UInt64(1), + // ) + frame_dig 0 + itob + uncover 2 + itob + concat + frame_dig 2 + concat + frame_dig 3 + concat + frame_dig 4 + itob + concat + frame_dig -2 + itob + concat + uncover 3 + concat + frame_dig -1 + itob + concat + uncover 2 + itob + concat + swap + itob + concat + // modules/actus_kernel.py:711-726 + // arc4.emit( + // ExecutionEvent( + // contract_id=Global.current_application_id.id, + // event_id=entry.event_id, + // event_type=entry.event_type, + // scheduled_time=entry.scheduled_time, + // applied_at=Global.latest_timestamp, + // payoff=payoff, + // payoff_sign=arc4.UInt8( + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + // ), + // settled_amount=settled_amount, + // currency_id=self.settlement_asset_id, + // sequence=entry.event_id + UInt64(1), + // ) + // ) + pushbytes 0x9a332b95 // method "ExecutionEvent(uint64,uint64,uint8,uint64,uint64,uint64,uint8,uint64,uint64,uint64)" + swap + concat + log + frame_dig -3 + frame_bury 0 + retsub + +_emit_execution_event_after_if_else@3: + // modules/actus_kernel.py:751 + // if event_type in (UInt64(enums.EVT_IED), UInt64(enums.EVT_PI)): + frame_dig 5 + intc_1 // 1 + == + bnz _emit_execution_event_if_body@5 + frame_dig 5 + pushint 4 + == + bz _emit_execution_event_after_if_else@6 + +_emit_execution_event_if_body@5: + // modules/actus_kernel.py:752 + // return UInt64(enums.PAYOFF_SIGN_POSITIVE) + intc_1 // 1 + // modules/actus_kernel.py:720 + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7 + +_emit_execution_event_after_if_else@6: + // modules/actus_kernel.py:753 + // return UInt64(enums.PAYOFF_SIGN_NEGATIVE) + pushint 255 + // modules/actus_kernel.py:720 + // self._payoff_sign(entry.event_type.as_uint64(), payoff) + b _emit_execution_event_after_inlined_modules.actus_kernel.ActusKernelModule._payoff_sign@7 + + +// modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: +_role_is_active: + // modules/rbac.py:59 + // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: + proto 2 1 + pushbytes "" + // modules/rbac.py:57 + // return role_address in role_map + frame_dig -2 + frame_dig -1 + concat + dup + box_len + bury 1 + // modules/rbac.py:60-64 + // return self._has_role(role_map, role_address) and ( + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + // ) + bz _role_is_active_bool_false@4 + // modules/rbac.py:61 + // role_map[role_address].role_validity_start + frame_dig 1 + box_get + assert // check BoxMap entry exists + intc_0 // 0 + extract_uint64 + // modules/rbac.py:62 + // <= Global.latest_timestamp + global LatestTimestamp + dup + frame_bury 0 + // modules/rbac.py:61-62 + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + <= + // modules/rbac.py:61-63 + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + bz _role_is_active_bool_false@4 + // modules/rbac.py:63 + // <= role_map[role_address].role_validity_end + frame_dig 1 + box_get + assert // check BoxMap entry exists + intc_2 // 8 + extract_uint64 + // modules/rbac.py:62-63 + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + frame_dig 0 + >= + // modules/rbac.py:61-63 + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + bz _role_is_active_bool_false@4 + intc_1 // 1 + +_role_is_active_bool_merge@5: + // modules/rbac.py:60-64 + // return self._has_role(role_map, role_address) and ( + // role_map[role_address].role_validity_start + // <= Global.latest_timestamp + // <= role_map[role_address].role_validity_end + // ) + frame_bury 0 + retsub + +_role_is_active_bool_false@4: + intc_0 // 0 + b _role_is_active_bool_merge@5 + + +// modules.rbac.RbacModule._assert_caller_is_arranger() -> void: +_assert_caller_is_arranger: + // modules/rbac.py:67 + // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED + txn Sender + // modules/rbac.py:54 + // return role_address == self.arranger.value + intc_0 // 0 + bytec 18 // 0x523a41525223 + app_global_get_ex + assert // check self.arranger exists + == + // modules/rbac.py:67 + // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED + assert // Not authorized + retsub + + +// modules.rbac.RbacModule._assert_is_not_contract_defaulted() -> void: +_assert_is_not_contract_defaulted: + // modules/rbac.py:85 + // assert not self.defaulted, err.DEFAULTED + intc_0 // 0 + bytec 34 // "defaulted" + app_global_get_ex + assert // check self.defaulted exists + ! + assert // Defaulted + retsub + + +// modules.rbac.RbacModule._assert_is_not_contract_suspended() -> void: +_assert_is_not_contract_suspended: + // modules/rbac.py:88 + // assert not self.contract_suspended, err.SUSPENDED + intc_0 // 0 + bytec 33 // "contract_suspended" + app_global_get_ex + assert // check self.contract_suspended exists + ! + assert // Suspended operations + retsub + + +// modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: +_assert_valid_role: + // modules/rbac.py:90 + // def _assert_valid_role(self, role_id: UInt64) -> None: + proto 1 0 + // modules/rbac.py:91-99 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + frame_dig -1 + // modules/rbac.py:92 + // UInt64(enums.ROLE_ARRANGER), + pushint 20 + // modules/rbac.py:91-99 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:93 + // UInt64(enums.ROLE_OP_DAEMON), + pushint 25 + // modules/rbac.py:91-99 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:94 + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + pushint 40 + // modules/rbac.py:91-99 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:95 + // UInt64(enums.ROLE_PRIMARY_DEALER), + pushint 50 + // modules/rbac.py:91-99 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:96 + // UInt64(enums.ROLE_TRUSTEE), + pushint 60 + // modules/rbac.py:91-99 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:97 + // UInt64(enums.ROLE_AUTHORITY), + pushint 70 + // modules/rbac.py:91-99 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:98 + // UInt64(enums.ROLE_OBSERVER), + pushint 80 + // modules/rbac.py:91-99 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bz _assert_valid_role_bool_false@8 + +_assert_valid_role_bool_true@7: + intc_1 // 1 + +_assert_valid_role_bool_merge@9: + // modules/rbac.py:91-99 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + assert // Invalid role identifier + retsub + +_assert_valid_role_bool_false@8: + intc_0 // 0 + b _assert_valid_role_bool_merge@9 diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.clear.puya.map b/smart_contracts/artifacts/d_asa/DASA.clear.puya.map similarity index 100% rename from smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.clear.puya.map rename to smart_contracts/artifacts/d_asa/DASA.clear.puya.map diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.clear.teal b/smart_contracts/artifacts/d_asa/DASA.clear.teal similarity index 100% rename from smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.clear.teal rename to smart_contracts/artifacts/d_asa/DASA.clear.teal diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.puya.map b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.puya.map deleted file mode 100644 index b7c88c8d..00000000 --- a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.puya.map +++ /dev/null @@ -1,38192 +0,0 @@ -{ - "version": 3, - "sources": [ - "../../../modules/accounting.py", - "../../../modules/actus/pam.py", - "../../../modules/core_financial/common.py", - "../../../modules/core_financial/coupon.py", - "../../../modules/payment_agent/common.py", - "../../../modules/payment_agent/coupon.py", - "../../../modules/payment_agent/principal.py", - "../../../modules/rbac.py", - "../../../modules/transfer_agent/coupon.py", - "../../fixed_coupon_bond/contract.py" - ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AO8BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAgBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AP9BA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AACA;;AAAkB;AAAlB;AACA;AAAc;AAAd;AEUA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAA0B;AAA1B;AACA;;AAAqB;AAArB;AACA;;AAAqB;AAArB;AAIA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AC5BA;;AAAyB;AAAzB;AA8EA;;AAA6B;AAA7B;AMrEO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAnBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;APsQK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AD7PA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;ACyMG;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AA5KmB;;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAKI;;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;;AAHjB;;;;;;AAAA;AAwKO;;AAAA;;AAAA;AAAA;AAAP;AACA;;AAAA;;AAAA;AACmB;;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAAA;;AAAA;AAGiC;AAAA;AArK1B;;;AAAA;AAEH;;AAFG;AAAA;;;;AAAP;AAMA;;AAAA;;AAAA;AAmK0B;;AAAA;AAAA;;AA/JnB;AAAA;;AAAA;AAAA;AAAf;;;AACY;;AAAA;AAGJ;;AAAA;;AAAA;ACWA;;AAAA;AAAA;AAGA;;AAAA;;AAAA;AACA;;AAAA;;AAAA;;AAAA;;AAAA;ADL+C;;AAArB;AAAtB;;AAAA;AADJ;AA2JA;;AAAA;;;AAnIA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;AAAA;;;AAAA;;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;;AAAA;AAArB;;AAAA;AAAA;AACiC;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;AAGO;;AAAA;AAAP;AA+HA;AAAc;;AAAd;AD/OH;AAAA;;;;;;;;;;AE+KA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBO;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;;AADJ;AH9L0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AGmMO;AAAA;;;AAAa;;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAJ;;;;AAAP;AAG8B;;AAAA;AAAA;;AAAA;;;AAAA;;AAEX;AAAnB;;AACY;AAAZ;;AACc;AAAd;;AAGc;;;AAAA;AAAA;;AACd;AAAA;;AAAA;;;AACG;;;AAAX;;;AAC+B;;AAAA;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;;;AAAA;;AAGP;AAAA;AAAA;AAAA;;AACE;AAAA;AAAA;;AAKG;;AAAA;AAAA;;AAAA;AAAA;AAHd;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AA8DkB;;AH9OR;AAAA;AAAA;AAAA;AAAe;;AAAf;AG+Of;;;AAC2B;;AAAA;AAAA;AAAA;;AAAA;AAVtB;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAaA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AH7O6B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AG4PkB;AACC;;AHnQZ;AAAA;AAAA;AAAe;;AAAf;AGoQf;;;AAC2B;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AACG;AAAA;;AAAA;AAAA;AAAf;AAAf;;;AAGoB;;AAAA;;;AACA;;AAAe;AAAf;AAFc;;;AAAA;;AAOnB;;AAAA;AAAA;;AAAA;AAAA;AA5BV;AAAA;AAAA;AAAA;AAAA;AAAA;AA2B8B;;AAAA;;;AAAA;;;;;AAeb;;;AAAA;;AACS;;;AAAA;AACA;AAAA;;;AAAA;AACX;AAAZ;AACc;AAAd;AACG;;;AAAX;;;AAC+B;;AAAA;;;AACP;AAAA;AAAA;AAAA;;AACE;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAGG;;AAAA;AAAA;;AAAA;AAAA;AAJd;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAlBV;AAAA;AAAA;AAAA;AAAA;AAAA;AE/QA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ALLU;AAAA;AAAA;AAAA;AAAe;;AAAf;AGcP;AACA;;;AACA;;;AHV0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AGaQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACR;AAEc;;;AACS;AAAA;AAAA;AAAA;;AAAA;AAChB;AAAA;;AAAA;AAAP;AAEO;AAAA;;;AAAP;AAkJI;;AAAA;;;AACA;AAAuB;AAAvB;AAFG;;;AAAA;AE9IP;AAAA;;;AAGG;;;AAAX;;;AAEY;;AAAA;;;AAES;;AAAA;AAAA;AAAA;;;AAAT;AAAA;;;AFEJ;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAA8C;AAA9C;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AE/CoB;;AAGP;;AAEO;AAAA;;AAAA;AAAA;AACE;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AARlB;;AAAA;AAAA;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AASqB;;AATrB;AAUoB;AAVpB;AAAA;AAAA;;;;;;AAAA;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAuDc;;AAFP;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAtCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCwB;AAAjB;;;;;AClCP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ANLU;AAAA;AAAA;AAAA;AAAe;;AAAf;ACRP;AACA;;;AACA;;;ADY0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;ACVQ;AAAA;AAAA;AAAA;AACR;AACO;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AAAP;AEuDI;;;AADG;;;AAAP;AAGO;AAAA;;;AAAA;AG3BP;AAAA;;;AAGG;;;AAAX;;;AAEY;;AAAA;;;AAES;;AAAA;AAAA;AAAA;;;AAAT;AAAA;;;AJ2IJ;AAAA;AAAA;AAAA;AAA0B;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA1B;AAAA;AAAA;AAAA;AACsC;AAAtC;AAAA;AAAA;AAAA;;AAAA;AACA;;;AIxLoB;;AAGP;;AAEO;AAAA;;AAAA;AAAA;AACE;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AARlB;;AAAA;AAAA;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AASqB;;AATrB;AAAA;;AAAA;AAAA;;;;;;AAAA;AAAA;AAAA;AADJ;;AAAA;AAAA;AAAA;AAsDc;;AAFP;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AArCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCwB;AAAjB;;;;;;;;;;;AEtDP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ARgBU;AAAA;AAAA;AAAA;AAAe;;AAAf;AEgIH;;;AACI;AAAA;;AAAA;AAAA;AAAsC;;AAAtC;AADJ;;;AAGQ;AAAA;;AAAA;AAAA;AAAJ;;;AACG;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADH;;;;AAJR;AAmBO;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AF9I0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AEiJA;;AAAA;;;AACA;;AAAA;;;AAaO;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAP;AFjIoB;;;AAAA;;AACjB;AAAA;AAAA;AAAA;AAAX;;;AANY;;AAAA;AAAA;AAAA;;AAAA;AAAmC;;AAAA;AAAA;AAAA;;AAAA;AAAnC;AAAA;;;AACI;;AAAA;AAAA;AAAA;;AAAA;AAAqC;;AAAA;AAAA;AAAA;;AAAA;AAArC;AADJ;;;;AADJ;AQVoB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;ALuBN;;;AACd;;AAAA;AAAA;;AAAA;;AAAA;;;AACO;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;;AAAA;;AHDS;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;AAAP;AACA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AApBG;AAAA;AAAA;AAAA;AAAX;;;AACuD;AAA3C;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAsBJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AQvBO;;AAAA;AAAA;;AAAA;AA5CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AR0DO;;AAAA;AAAA;;AAAA;;AAAA;AACsC;;AAAA;AAAA;AAAA;;;AAAtC;;AAAA;AAAA;;;;;;;;AEuMP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AASG;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAVH;AAAA;AAYA;;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAQG;;;AACA;;AAAA;AAAA;AATH;AAAA;;AAWA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAqBG;;;AF3RO;AAAA;AAAA;AAAA;AAAe;;AAAf;AE4RA;AAAP;AACA;;;AAEA;AAAA;AACyC;AAAtC;AAAX;;;AACY;AAAA;;;AAAA;;AAGA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;;;AAAA;;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAIA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AACgC;;AAAA;AAAA;AAA7B;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAIA;;AAAA;AAAA;AAI8B;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAF3B;AAAA;AAAA;AAAA;AAAA;AA5CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AKzQ+B;;AAAc;;AAAnC;;;AAAP;ALsRA;;AAAA;AAAA;AACO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AF1UU;AAAA;AAAA;AAAA;AAAe;;AAAf;AEwHH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AKzE4B;;AAAqB;;AAA1C;;;AAAP;APxC0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AEgWA;;;AACA;;;AACA;;AAAA;AAAA;AACO;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAkC;AAAA;;AAAA;AAAA;AAAlC;;AAAA;AAAP;AAEA;AAAA;;AAAA;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAC2C;AAAA;;AAAA;AAAA;AAA3C;AAAA;;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AApCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AAgDiB;AACX;;AAA0B;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA1B;AAAA;;;AAAA;AAAA;;;AACe;;AAAd;;AAED;AAAA;;AAAA;AAAA;AAAX;;;AAC0B;;AAAd;;AAGsB;AAAA;;AAAA;AAAA;AACF;AAAA;;AAAA;AAAA;AF/WjB;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAAA;AEkX6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACU;AAAA;;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AACO;AAAA;;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AACD;AAAA;;AAAA;AAAA;AAEqB;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACpB;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACE;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAfT;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CiB;;AF3ZP;AAAA;AAAA;AAAA;AAAe;;AAAf;AE4Zf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAVrB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAsBQ;AAAA;;AAAA;AAAA;AAAoC;AAAA;;AAAA;AAAA;AADlC;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBuC;AAAA;;AAAA;AAAA;AATvC;AAAA;AAAA;AAAA;AAAA;AAAA;AFvWA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AOjB+B;;AAAgB;;AAArC;;;AAAP;AP9C0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmFA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AOjD+B;;AAAsB;;AAA3C;;;AAAP;APxCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+GA;AAAP;AACA;;;AACA;;;AAC8B;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAIU;AAFsB;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAhC;AAOO;;AAlCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AOrF+B;;AAAsB;;AAA3C;;;AAAP;APuGA;;;AA5I0B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+Ie;AAAA;AAAA;AAAA;AAAA;AACf;AAAA;;AACA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AACA;;;AACqB;;AAzBxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBU;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AA3K0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA6KA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL6B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+LO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AO5DA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AAqGG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxEM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA+FJ;;;AA7FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA2FJ;;;AAzFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAuFJ;;;AArFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAmFJ;;;AAjFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAkFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAmGG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1EM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA8FJ;;;AA5FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA0FJ;;;AAxFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAsFJ;;;AApFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAqFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzJ+B;;AAAgB;;AAArC;;;AAAP;AAyKA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA5QL;;AAAA;AAAA;AAAA;AAAA;;AA2QC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAvQL;;AAAA;AAAA;AAAA;AAAA;;AAsQC;AAGO;AAAA;AAxClB;;;AAiCe;;AAlQL;;AAAA;AAAA;AAAA;AAAA;;AAiQC;AAGO;AAAA;AAnClB;;;AA4Be;;AA7PL;;AAAA;AAAA;AAAA;AAAA;;AA4PC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAxPL;;AAAA;AAAA;AAAA;AAAA;;AAuPC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AJzKD;;;;;AACiB;;AAAA;AACC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACG;AAAA;;AAAA;AAAA;AAAd;AAAX;;;AAC0B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAclB;;AAAA;;AAAA;AAAA;;AAAA;AACA;;AAAA;AAdkB;AAAA;;AAAA;AAAA;AAAb;;AAAA;AAAb;;;AAE0D;AAAA;;AAAA;AAAA;AAA1C;;AAAA;AAAA;AAAA;;AAEc;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AACZ;;AAAA;AAAlB;;;AAEoC;;AACL;AAFf;;;AAIA;;AAAc;AAAd;AAAA;AAAA;;AACkB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;;AACR;;AAAa;;AAAb;AAAA;;;;;AAItB;;;AACkC;;AAAA;;AAAA;AAA2C;AAA3C;AAAvB;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAP;AAQJ;;;AACsB;AACD;AAAA;;AAAA;AAAA;AAAd;;AAAA;AAAX;;;AACmD;;AAAc;AAAd;AAArB;;;AAAA;;AACtB;;AAAA;AAAA;AAEJ;;;AAG8C;;AAAS;AAAT;AAAxB;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACX;;AAAA;AAAsC;;;AAAtC;AAAP;AAEJ;;;;;;AAEJ;;AAAA;;;AACkC;AAAA;;AAAA;AAAA;AAGF;;AAAA;;AAAA;AAAA;;AACR;;AAAA;;;AAAA;AAAA;AACb;AAAA;;AAAA;AAAA;AAAX;;;ADCe;;AAAe;;AAAf;AAAA;;AAAe;;AAAf;ACEA;;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AA5BkB;AAAlB;;AACR;;AAAA;;;AAC8B;;AAAA;;;AAAA;;;;;;;AA+B1B;;;AAEQ;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;AAEkB;AAAA;;AAAA;AAAA;AAAd;;AAAA;AAFJ;;;;AADJ;;AAAA;AAMJ;;;AAII;;AAAA;;AAAA;;;AACmB;;AAAA;;;AACK;AAAA;AAAA;AACR;AAAA;AAAA;AACO;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAGnB;;AAAA;;AAAA;;;AAAA;AAAA;;AAAA;AAGI;;;AAAA;;AAAA;AAHJ;AADJ;AAhKJ;;;AACW;AAAA;;AAAA;AAAA;AAA0B;AAAA;AAAA;AAAA;AAAA;;AAAA;AAA1B;AAAP;AAEJ;;;AAIQ;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;;ACpBJ;;;AACO;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;;;;;;AAMR;;;AAEQ;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AAJR;AAAA;;;;;AAOJ;;;AAEyC;;AAAjC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;;AAKJ;;;AACI;AAIQ;;AAHO;AAAA;;AAAA;AAAA;;;;;;;;;;;AADf;;;;;;AAAA;;AFwEJ;;;;;;;AAEQ;;AAAA;;;AAAA;;;;AAAA;AACE;;AADF;AADJ;AAIkB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAnB;;AAAA;;AAAA;AAAA;;;AAEgC;;AACL;AAFf;;;AAIS;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AACkB;AAAN;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;;AACF;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;AAApB;AAAA;AAAP;;;;;;;;;;;;;AFzFZ;;;AACe;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAEJ;;;AACmB;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAR;;AAAA;AAAP;AAEJ;;;AAEyB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADd;;AAAA;AAAA;;;AAAP;AAQG;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;;AOQR;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.approval_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "intcblock 0 1 32 8 255 200 86400" - }, - "14": { - "op": "bytecblock 0x151f7c75 0x52333023 \"status\" \"circulating_units\" \"issuance_date\" \"maturity_date\" \"unit_value\" \"total_coupons\" 0x52323023 \"settlement_asset_id\" \"primary_distribution_opening_date\" \"secondary_market_closure_date\" 0x74696d654576656e7473 0x52373023 0x52343023 \"total_units\" \"denomination_asset_id\" \"day_count_convention\" \"secondary_market_opening_date\" 0x636f75706f6e5261746573 0x52363023 0x52353023 0x52323523 \"asset_suspended\" \"asset_defaulted\" \"metadata\" \"principal_discount\" \"primary_distribution_closure_date\" \"paid_coupon_units\" \"due_coupons_watermark\" 0x0000 0x00 0x52383023 \"interest_rate\" 0x068101 0x003b 0x8c29904e 0x0012" - }, - "499": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "501": { - "op": "bnz main_after_if_else@2", - "stack_out": [] - }, - "504": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "506": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323023", - "tmp%0#3" - ], - "stack_out": [ - "0x52323023", - "tmp%0#3" - ] - }, - "508": { - "op": "app_global_put", - "stack_out": [] - }, - "509": { - "op": "bytec 22 // 0x52323523", - "defined_out": [ - "0x52323523" - ], - "stack_out": [ - "0x52323523" - ] - }, - "511": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323523", - "tmp%1#3" - ], - "stack_out": [ - "0x52323523", - "tmp%1#3" - ] - }, - "513": { - "op": "app_global_put", - "stack_out": [] - }, - "514": { - "op": "bytec 23 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"" - ], - "stack_out": [ - "\"asset_suspended\"" - ] - }, - "516": { - "op": "intc_0 // 0", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "\"asset_suspended\"", - "0" - ] - }, - "517": { - "op": "app_global_put", - "stack_out": [] - }, - "518": { - "op": "bytec 24 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"" - ], - "stack_out": [ - "\"asset_defaulted\"" - ] - }, - "520": { - "op": "intc_0 // 0", - "stack_out": [ - "\"asset_defaulted\"", - "0" - ] - }, - "521": { - "op": "app_global_put", - "stack_out": [] - }, - "522": { - "op": "bytec 15 // \"total_units\"", - "defined_out": [ - "\"total_units\"" - ], - "stack_out": [ - "\"total_units\"" - ] - }, - "524": { - "op": "intc_0 // 0", - "stack_out": [ - "\"total_units\"", - "0" - ] - }, - "525": { - "op": "app_global_put", - "stack_out": [] - }, - "526": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"" - ], - "stack_out": [ - "\"circulating_units\"" - ] - }, - "527": { - "op": "intc_0 // 0", - "stack_out": [ - "\"circulating_units\"", - "0" - ] - }, - "528": { - "op": "app_global_put", - "stack_out": [] - }, - "529": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"" - ], - "stack_out": [ - "\"unit_value\"" - ] - }, - "531": { - "op": "intc_0 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "532": { - "op": "app_global_put", - "stack_out": [] - }, - "533": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "\"status\"" - ] - }, - "534": { - "op": "intc_0 // 0", - "stack_out": [ - "\"status\"", - "0" - ] - }, - "535": { - "op": "app_global_put", - "stack_out": [] - }, - "536": { - "op": "bytec 16 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"" - ], - "stack_out": [ - "\"denomination_asset_id\"" - ] - }, - "538": { - "op": "intc_0 // 0", - "stack_out": [ - "\"denomination_asset_id\"", - "0" - ] - }, - "539": { - "op": "app_global_put", - "stack_out": [] - }, - "540": { - "op": "bytec 9 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"" - ], - "stack_out": [ - "\"settlement_asset_id\"" - ] - }, - "542": { - "op": "intc_0 // 0", - "stack_out": [ - "\"settlement_asset_id\"", - "0" - ] - }, - "543": { - "op": "app_global_put", - "stack_out": [] - }, - "544": { - "op": "bytec 6 // \"unit_value\"", - "stack_out": [ - "\"unit_value\"" - ] - }, - "546": { - "op": "intc_0 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "547": { - "op": "app_global_put", - "stack_out": [] - }, - "548": { - "op": "bytec 17 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "\"day_count_convention\"" - ] - }, - "550": { - "op": "intc_0 // 0", - "stack_out": [ - "\"day_count_convention\"", - "0" - ] - }, - "551": { - "op": "app_global_put", - "stack_out": [] - }, - "552": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"" - ], - "stack_out": [ - "\"metadata\"" - ] - }, - "554": { - "op": "pushbytes 0x", - "defined_out": [ - "\"metadata\"", - "0x" - ], - "stack_out": [ - "\"metadata\"", - "0x" - ] - }, - "556": { - "op": "app_global_put", - "stack_out": [] - }, - "557": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"" - ], - "stack_out": [ - "\"principal_discount\"" - ] - }, - "559": { - "op": "intc_0 // 0", - "stack_out": [ - "\"principal_discount\"", - "0" - ] - }, - "560": { - "op": "app_global_put", - "stack_out": [] - }, - "561": { - "op": "bytec 33 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"" - ], - "stack_out": [ - "\"interest_rate\"" - ] - }, - "563": { - "op": "intc_0 // 0", - "stack_out": [ - "\"interest_rate\"", - "0" - ] - }, - "564": { - "op": "app_global_put", - "stack_out": [] - }, - "565": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"" - ], - "stack_out": [ - "\"total_coupons\"" - ] - }, - "567": { - "op": "intc_0 // 0", - "stack_out": [ - "\"total_coupons\"", - "0" - ] - }, - "568": { - "op": "app_global_put", - "stack_out": [] - }, - "569": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"" - ], - "stack_out": [ - "\"primary_distribution_opening_date\"" - ] - }, - "571": { - "op": "intc_0 // 0", - "stack_out": [ - "\"primary_distribution_opening_date\"", - "0" - ] - }, - "572": { - "op": "app_global_put", - "stack_out": [] - }, - "573": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"" - ], - "stack_out": [ - "\"primary_distribution_closure_date\"" - ] - }, - "575": { - "op": "intc_0 // 0", - "stack_out": [ - "\"primary_distribution_closure_date\"", - "0" - ] - }, - "576": { - "op": "app_global_put", - "stack_out": [] - }, - "577": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"" - ], - "stack_out": [ - "\"issuance_date\"" - ] - }, - "579": { - "op": "intc_0 // 0", - "stack_out": [ - "\"issuance_date\"", - "0" - ] - }, - "580": { - "op": "app_global_put", - "stack_out": [] - }, - "581": { - "op": "bytec 18 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"" - ], - "stack_out": [ - "\"secondary_market_opening_date\"" - ] - }, - "583": { - "op": "intc_0 // 0", - "stack_out": [ - "\"secondary_market_opening_date\"", - "0" - ] - }, - "584": { - "op": "app_global_put", - "stack_out": [] - }, - "585": { - "op": "bytec 11 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"" - ], - "stack_out": [ - "\"secondary_market_closure_date\"" - ] - }, - "587": { - "op": "intc_0 // 0", - "stack_out": [ - "\"secondary_market_closure_date\"", - "0" - ] - }, - "588": { - "op": "app_global_put", - "stack_out": [] - }, - "589": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"" - ], - "stack_out": [ - "\"maturity_date\"" - ] - }, - "591": { - "op": "intc_0 // 0", - "stack_out": [ - "\"maturity_date\"", - "0" - ] - }, - "592": { - "op": "app_global_put", - "stack_out": [] - }, - "593": { - "op": "bytec 28 // \"paid_coupon_units\"", - "defined_out": [ - "\"paid_coupon_units\"" - ], - "stack_out": [ - "\"paid_coupon_units\"" - ] - }, - "595": { - "op": "intc_0 // 0", - "stack_out": [ - "\"paid_coupon_units\"", - "0" - ] - }, - "596": { - "op": "app_global_put", - "stack_out": [] - }, - "597": { - "op": "bytec 29 // \"due_coupons_watermark\"", - "defined_out": [ - "\"due_coupons_watermark\"" - ], - "stack_out": [ - "\"due_coupons_watermark\"" - ] - }, - "599": { - "op": "intc_0 // 0", - "stack_out": [ - "\"due_coupons_watermark\"", - "0" - ] - }, - "600": { - "op": "app_global_put", - "stack_out": [] - }, - "601": { - "op": "txn GlobalNumByteSlice", - "defined_out": [ - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2" - ] - }, - "603": { - "op": "pushint 3", - "defined_out": [ - "3", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "3" - ] - }, - "605": { - "op": "==", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "tmp%1#2" - ] - }, - "606": { - "error": "Wrong Global Bytes allocation", - "op": "assert // Wrong Global Bytes allocation", - "stack_out": [] - }, - "607": { - "op": "txn GlobalNumUint", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "609": { - "op": "pushint 20", - "defined_out": [ - "20", - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1", - "20" - ] - }, - "611": { - "op": "==", - "defined_out": [ - "tmp%3#1" - ], - "stack_out": [ - "tmp%3#1" - ] - }, - "612": { - "error": "Wrong Global UInts allocation", - "op": "assert // Wrong Global UInts allocation", - "stack_out": [] - }, - "613": { - "op": "txn LocalNumByteSlice", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "615": { - "op": "!", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "616": { - "error": "Wrong Local Bytes allocation", - "op": "assert // Wrong Local Bytes allocation", - "stack_out": [] - }, - "617": { - "op": "txn LocalNumUint", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "619": { - "op": "!", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "620": { - "error": "Wrong Local UInts allocation", - "op": "assert // Wrong Local UInts allocation", - "stack_out": [] - }, - "621": { - "block": "main_after_if_else@2", - "stack_in": [], - "op": "pushbytes 0x25dba95b // method \"asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\"", - "defined_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ], - "stack_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ] - }, - "627": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%0#1" - ], - "stack_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%0#1" - ] - }, - "630": { - "op": "match main_asset_update_route@4", - "stack_out": [] - }, - "634": { - "block": "main_switch_case_next@5", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "636": { - "op": "!", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "637": { - "op": "assert", - "stack_out": [] - }, - "638": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "640": { - "op": "bz main_create_NoOp@36", - "stack_out": [] - }, - "643": { - "op": "pushbytess 0x89474134 0x44363d49 0x53bef045 0x67db4f20 0xf6a96c8d 0x8cf14b51 0x9c76b6a3 0x4fd6a3cc 0x1d6fc255 0x25e9997f 0x6c85e3ee 0x402dba47 0xfad2173e 0x08efea35 0xe4a5ab54 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method \"asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))\", method \"get_coupon_rates()uint16[]\", method \"get_payment_amount(address)(uint64,uint64)\", method \"get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)\", method \"pay_coupon(address,byte[])(uint64,uint64,byte[])\", method \"pay_principal(address,byte[])(uint64,uint64,byte[])\", method \"asset_transfer(address,address,uint64)uint64\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"set_default_status(bool)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)\", method \"account_gov_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_close(address)(uint64,uint64)\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_info(address)(address,uint64,uint64,uint64,bool)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,byte[])uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_config(uint8,address)(uint64,uint64)\"", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(get_coupon_rates()uint16[])", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_time_events()uint64[])", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(primary_distribution(address,uint64)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_default_status(bool)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))" - ], - "stack_out": [ - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_coupon_rates()uint16[])", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(set_default_status(bool)uint64)", - "Method(primary_distribution(address,uint64)uint64)", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_time_events()uint64[])", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))" - ] - }, - "785": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(get_coupon_rates()uint16[])", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_time_events()uint64[])", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(primary_distribution(address,uint64)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_default_status(bool)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "tmp%10#0" - ], - "stack_out": [ - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_coupon_rates()uint16[])", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(set_default_status(bool)uint64)", - "Method(primary_distribution(address,uint64)uint64)", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_time_events()uint64[])", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "tmp%10#0" - ] - }, - "788": { - "op": "match asset_config get_account_units_current_value get_coupon_rates get_payment_amount get_coupons_status pay_coupon pay_principal asset_transfer set_secondary_time_events set_default_status primary_distribution get_asset_info get_time_events get_secondary_market_schedule get_asset_metadata account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config", - "stack_out": [] - }, - "846": { - "op": "err" - }, - "847": { - "block": "main_create_NoOp@36", - "stack_in": [], - "op": "pushbytes 0x3f0efc6c // method \"asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\"", - "defined_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ], - "stack_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ] - }, - "853": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%11#0" - ], - "stack_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%11#0" - ] - }, - "856": { - "op": "match asset_create", - "stack_out": [] - }, - "860": { - "op": "err" - }, - "861": { - "block": "main_asset_update_route@4", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1" - ] - }, - "863": { - "op": "pushint 4 // UpdateApplication", - "defined_out": [ - "UpdateApplication", - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1", - "UpdateApplication" - ] - }, - "865": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "866": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%2#0", - "tmp%3#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%3#0" - ] - }, - "868": { - "op": "&&", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "869": { - "op": "assert", - "stack_out": [] - }, - "870": { - "op": "b asset_update" - }, - "873": { - "subroutine": "_puya_lib.util.ensure_budget", - "params": { - "required_budget#0": "uint64", - "fee_source#0": "uint64" - }, - "block": "ensure_budget", - "stack_in": [], - "op": "proto 2 0" - }, - "876": { - "op": "frame_dig -2", - "defined_out": [ - "required_budget#0 (copy)" - ], - "stack_out": [ - "required_budget#0 (copy)" - ] - }, - "878": { - "op": "pushint 10", - "defined_out": [ - "10", - "required_budget#0 (copy)" - ], - "stack_out": [ - "required_budget#0 (copy)", - "10" - ] - }, - "880": { - "op": "+", - "defined_out": [ - "required_budget_with_buffer#0" - ], - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "881": { - "block": "ensure_budget_while_top@1", - "stack_in": [ - "required_budget_with_buffer#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "required_budget_with_buffer#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "required_budget_with_buffer#0" - ] - }, - "883": { - "op": "global OpcodeBudget", - "defined_out": [ - "required_budget_with_buffer#0", - "tmp%1#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "required_budget_with_buffer#0", - "tmp%1#0" - ] - }, - "885": { - "op": ">", - "defined_out": [ - "required_budget_with_buffer#0", - "tmp%2#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "tmp%2#0" - ] - }, - "886": { - "op": "bz ensure_budget_after_while@6", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "889": { - "op": "itxn_begin" - }, - "890": { - "op": "pushint 6 // appl", - "defined_out": [ - "appl", - "required_budget_with_buffer#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "appl" - ] - }, - "892": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "894": { - "op": "pushint 5 // DeleteApplication", - "defined_out": [ - "DeleteApplication", - "required_budget_with_buffer#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "DeleteApplication" - ] - }, - "896": { - "op": "itxn_field OnCompletion", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "898": { - "op": "bytec 34 // 0x068101", - "defined_out": [ - "0x068101", - "required_budget_with_buffer#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "0x068101" - ] - }, - "900": { - "op": "itxn_field ApprovalProgram", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "902": { - "op": "bytec 34 // 0x068101", - "stack_out": [ - "required_budget_with_buffer#0", - "0x068101" - ] - }, - "904": { - "op": "itxn_field ClearStateProgram", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "906": { - "op": "frame_dig -1", - "defined_out": [ - "fee_source#0 (copy)", - "required_budget_with_buffer#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "fee_source#0 (copy)" - ] - }, - "908": { - "op": "switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "914": { - "block": "ensure_budget_switch_case_next@5", - "stack_in": [ - "required_budget_with_buffer#0" - ], - "op": "itxn_submit" - }, - "915": { - "op": "b ensure_budget_while_top@1" - }, - "918": { - "block": "ensure_budget_switch_case_1@4", - "stack_in": [ - "required_budget_with_buffer#0" - ], - "op": "global MinTxnFee", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "tmp%3#0" - ] - }, - "920": { - "op": "itxn_field Fee", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "922": { - "op": "b ensure_budget_switch_case_next@5" - }, - "925": { - "block": "ensure_budget_switch_case_0@3", - "stack_in": [ - "required_budget_with_buffer#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "required_budget_with_buffer#0", - "0" - ] - }, - "926": { - "op": "itxn_field Fee", - "stack_out": [ - "required_budget_with_buffer#0" - ] - }, - "928": { - "op": "b ensure_budget_switch_case_next@5" - }, - "931": { - "block": "ensure_budget_after_while@6", - "stack_in": [ - "required_budget_with_buffer#0" - ], - "retsub": true, - "op": "retsub" - }, - "932": { - "subroutine": "modules.actus.pam.PAMCoreMixin.asset_config[routing]", - "params": {}, - "block": "asset_config", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "interest_rate#2" - ] - }, - "934": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0" - ] - }, - "937": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "938": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "len%0#0" - ] - }, - "939": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "len%0#0", - "8" - ] - }, - "940": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "eq%0#0" - ] - }, - "941": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "tmp%0#0" - ] - }, - "942": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0" - ] - }, - "943": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "denomination_asset_id#0", - "tmp%2#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0" - ] - }, - "946": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "947": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "len%1#0" - ] - }, - "948": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "949": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%1#0", - "tmp%2#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "950": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0" - ] - }, - "951": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0" - ] - }, - "952": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ] - }, - "955": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ] - }, - "956": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%2#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "len%2#0" - ] - }, - "957": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "len%2#0", - "8" - ] - }, - "958": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%2#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "eq%2#0" - ] - }, - "959": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ] - }, - "960": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0" - ] - }, - "961": { - "op": "txna ApplicationArgs 4", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0" - ] - }, - "964": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ] - }, - "965": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%3#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "len%3#0" - ] - }, - "966": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "len%3#0", - "8" - ] - }, - "967": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%3#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "eq%3#0" - ] - }, - "968": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0" - ] - }, - "969": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0" - ] - }, - "970": { - "op": "txna ApplicationArgs 5", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0" - ] - }, - "973": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ] - }, - "974": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%4#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "len%4#0" - ] - }, - "975": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "len%4#0", - "8" - ] - }, - "976": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%4#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "eq%4#0" - ] - }, - "977": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0" - ] - }, - "978": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0" - ] - }, - "979": { - "op": "txna ApplicationArgs 6", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "982": { - "op": "dup", - "defined_out": [ - "day_count_convention#0", - "day_count_convention#0 (copy)", - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "day_count_convention#0 (copy)" - ] - }, - "983": { - "op": "len", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "len%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%5#0" - ] - }, - "984": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "day_count_convention#0", - "denomination_asset_id#0", - "len%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%5#0", - "1" - ] - }, - "985": { - "op": "==", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "eq%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%5#0" - ] - }, - "986": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "987": { - "op": "txna ApplicationArgs 7" - }, - "990": { - "op": "dup", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "interest_rate#0", - "interest_rate#0" - ] - }, - "991": { - "op": "cover 7", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "interest_rate#0" - ] - }, - "993": { - "op": "len", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%6#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%6#0" - ] - }, - "994": { - "op": "pushint 2", - "defined_out": [ - "2", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%6#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%6#0", - "2" - ] - }, - "996": { - "op": "==", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "eq%6#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%6#0" - ] - }, - "997": { - "error": "invalid number of bytes for arc4.uint16", - "op": "assert // invalid number of bytes for arc4.uint16", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "998": { - "op": "txna ApplicationArgs 8" - }, - "1001": { - "op": "dup", - "defined_out": [ - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0" - ] - }, - "1002": { - "op": "cover 7", - "defined_out": [ - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0" - ] - }, - "1004": { - "op": "dup", - "defined_out": [ - "coupon_rates#0", - "coupon_rates#0 (copy)", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0 (copy)" - ] - }, - "1005": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0 (copy)", - "0" - ] - }, - "1006": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0" - ] - }, - "1007": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0" - ] - }, - "1008": { - "op": "cover 8", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0" - ] - }, - "1010": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "1012": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%0#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "mul%0#0" - ] - }, - "1013": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "mul%0#0", - "2" - ] - }, - "1015": { - "op": "+", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "add%0#0" - ] - }, - "1016": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%0#0", - "coupon_rates#0" - ] - }, - "1017": { - "op": "len", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%7#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%0#0", - "len%7#0" - ] - }, - "1018": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%7#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%7#0" - ] - }, - "1019": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1020": { - "op": "txna ApplicationArgs 9" - }, - "1023": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0" - ] - }, - "1024": { - "op": "cover 7", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0" - ] - }, - "1026": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "1027": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0 (copy)", - "0" - ] - }, - "1028": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0" - ] - }, - "1029": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%1#0" - ] - }, - "1030": { - "op": "cover 8", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0" - ] - }, - "1032": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0", - "8" - ] - }, - "1033": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%1#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "mul%1#0" - ] - }, - "1034": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "mul%1#0", - "2" - ] - }, - "1036": { - "op": "+", - "defined_out": [ - "add%1#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "add%1#0" - ] - }, - "1037": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%1#0", - "time_events#0" - ] - }, - "1038": { - "op": "len", - "defined_out": [ - "add%1#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%8#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%1#0", - "len%8#0" - ] - }, - "1039": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%8#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%8#0" - ] - }, - "1040": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1041": { - "op": "txna ApplicationArgs 10", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0" - ] - }, - "1044": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0", - "time_periods#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0 (copy)" - ] - }, - "1045": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0 (copy)", - "0" - ] - }, - "1046": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0" - ] - }, - "1047": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0", - "aggregate%array_length%2#0" - ] - }, - "1048": { - "op": "cover 8", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0" - ] - }, - "1050": { - "op": "pushint 16", - "defined_out": [ - "16", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0", - "16" - ] - }, - "1052": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%2#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "mul%2#0" - ] - }, - "1053": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "mul%2#0", - "2" - ] - }, - "1055": { - "op": "+", - "defined_out": [ - "add%2#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "add%2#0" - ] - }, - "1056": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%2#0", - "time_periods#0" - ] - }, - "1057": { - "op": "len", - "defined_out": [ - "add%2#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%9#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%2#0", - "len%9#0" - ] - }, - "1058": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%9#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%9#0" - ] - }, - "1059": { - "error": "invalid number of bytes for arc4.dynamic_array>", - "op": "assert // invalid number of bytes for arc4.dynamic_array>", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1060": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "1063": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "0" - ] - }, - "1064": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "0", - "\"status\"" - ] - }, - "1065": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1066": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "maybe_value%0#0" - ] - }, - "1067": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "tmp%0#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%0#1" - ] - }, - "1068": { - "error": "D-ASA already configured", - "op": "assert // D-ASA already configured", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1069": { - "op": "dig 5", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "denomination_asset_id#0 (copy)", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "denomination_asset_id#0 (copy)" - ] - }, - "1071": { - "op": "asset_params_get AssetCreator", - "defined_out": [ - "_creator#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "exists#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "_creator#0", - "exists#0" - ] - }, - "1073": { - "op": "bury 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "exists#0" - ] - }, - "1075": { - "error": "Denomination asset is not properly set", - "op": "assert // Denomination asset is not properly set", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1076": { - "op": "bytec 16 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"denomination_asset_id\"" - ] - }, - "1078": { - "op": "dig 6", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"denomination_asset_id\"", - "denomination_asset_id#0 (copy)" - ] - }, - "1080": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1081": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "settlement_asset_id#0 (copy)", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "settlement_asset_id#0 (copy)" - ] - }, - "1083": { - "op": "uncover 6", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "settlement_asset_id#0 (copy)", - "denomination_asset_id#0" - ] - }, - "1085": { - "op": "==", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%0#1" - ] - }, - "1086": { - "error": "Different settlement asset not supported, must be equal to denomination asset", - "op": "assert // Different settlement asset not supported, must be equal to denomination asset", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1087": { - "op": "bytec 9 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"settlement_asset_id\"" - ] - }, - "1089": { - "op": "dig 5", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"settlement_asset_id\"", - "settlement_asset_id#0 (copy)" - ] - }, - "1091": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1092": { - "op": "itxn_begin" - }, - "1093": { - "op": "global MinTxnFee", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1095": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "1097": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "0" - ] - }, - "1098": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "1100": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1102": { - "op": "uncover 5", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "settlement_asset_id#0" - ] - }, - "1104": { - "op": "itxn_field XferAsset", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1106": { - "op": "pushint 4 // axfer", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "axfer", - "coupon_rates#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "1108": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1110": { - "op": "itxn_field Fee", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1112": { - "op": "itxn_submit" - }, - "1113": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal#0 (copy)", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0 (copy)" - ] - }, - "1115": { - "op": "dig 2", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "minimum_denomination#0 (copy)", - "principal#0", - "principal#0 (copy)", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0 (copy)", - "minimum_denomination#0 (copy)" - ] - }, - "1117": { - "op": "%", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%1#0" - ] - }, - "1118": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "tmp%2#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%2#1" - ] - }, - "1119": { - "error": "Minimum denomination is not a divisor of principal", - "op": "assert // Minimum denomination is not a divisor of principal", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1120": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"unit_value\"" - ] - }, - "1122": { - "op": "dig 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"unit_value\"", - "minimum_denomination#0 (copy)" - ] - }, - "1124": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1125": { - "op": "uncover 3", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0" - ] - }, - "1127": { - "op": "uncover 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "principal#0", - "minimum_denomination#0" - ] - }, - "1129": { - "op": "/", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "tmp%3#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "tmp%3#0" - ] - }, - "1130": { - "op": "bytec 15 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "tmp%3#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "tmp%3#0", - "\"total_units\"" - ] - }, - "1132": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "\"total_units\"", - "tmp%3#0" - ] - }, - "1133": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0" - ] - }, - "1134": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "\"principal_discount\"" - ] - }, - "1136": { - "op": "uncover 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "\"principal_discount\"", - "principal_discount#0" - ] - }, - "1138": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0" - ] - }, - "1139": { - "op": "btoi", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1140": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2" - ] - }, - "1141": { - "op": "bz asset_config_bool_true@3", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1144": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2" - ] - }, - "1145": { - "op": "intc 4 // 255", - "defined_out": [ - "255", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2", - "255" - ] - }, - "1147": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#1" - ] - }, - "1148": { - "op": "bz asset_config_bool_false@4", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1151": { - "block": "asset_config_bool_true@3", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ] - }, - "1152": { - "error": "Invalid day-count convention ID", - "block": "asset_config_bool_merge@5", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ], - "op": "assert // Invalid day-count convention ID", - "defined_out": [], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1153": { - "op": "bytec 17 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"day_count_convention\"" - ] - }, - "1155": { - "op": "dig 1", - "defined_out": [ - "\"day_count_convention\"", - "day_count_convention#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"day_count_convention\"", - "day_count_convention#2" - ] - }, - "1157": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1158": { - "op": "dig 6", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0" - ] - }, - "1160": { - "op": "btoi", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2" - ] - }, - "1161": { - "op": "bury 8", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1163": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0" - ] - }, - "1164": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0", - "\"principal_discount\"" - ] - }, - "1166": { - "op": "app_global_get_ex", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1167": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "maybe_value%0#0" - ] - }, - "1168": { - "op": "bnz asset_config_after_if_else@7", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1171": { - "op": "dig 7", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2" - ] - }, - "1173": { - "error": "Interest rate is not properly defined", - "op": "assert // Interest rate is not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1174": { - "block": "asset_config_after_if_else@7", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "bytec 33 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"interest_rate\"" - ] - }, - "1176": { - "op": "dig 8", - "defined_out": [ - "\"interest_rate\"", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"interest_rate\"", - "interest_rate#2" - ] - }, - "1178": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1179": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1181": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "1182": { - "error": "Coupon rates are not properly defined", - "op": "assert // Coupon rates are not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1183": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "aggregate%array_length%0#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "\"total_coupons\"" - ] - }, - "1185": { - "op": "dig 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "\"total_coupons\"", - "aggregate%array_length%0#0 (copy)" - ] - }, - "1187": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1188": { - "op": "bytec 19 // 0x636f75706f6e5261746573", - "defined_out": [ - "0x636f75706f6e5261746573", - "aggregate%array_length%0#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "0x636f75706f6e5261746573" - ] - }, - "1190": { - "op": "box_del", - "defined_out": [ - "aggregate%array_length%0#0", - "interest_rate#2", - "{box_del}" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "{box_del}" - ] - }, - "1191": { - "op": "pop", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1192": { - "op": "bytec 19 // 0x636f75706f6e5261746573", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "0x636f75706f6e5261746573" - ] - }, - "1194": { - "op": "dig 7", - "defined_out": [ - "0x636f75706f6e5261746573", - "aggregate%array_length%0#0", - "coupon_rates#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "0x636f75706f6e5261746573", - "coupon_rates#0" - ] - }, - "1196": { - "op": "box_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1197": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%array_length%0#0", - "coupon_rates#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "4" - ] - }, - "1199": { - "op": "+", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "interest_rate#2", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#0" - ] - }, - "1200": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#0", - "aggregate%array_length%1#0" - ] - }, - "1202": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "tmp%2#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%2#1" - ] - }, - "1203": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1204": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1206": { - "callsub": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "1209": { - "op": "bytec 12 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "1211": { - "op": "box_del", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "{box_del}" - ] - }, - "1212": { - "op": "pop", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1213": { - "op": "bytec 12 // 0x74696d654576656e7473", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "1215": { - "op": "dig 1", - "defined_out": [ - "0x74696d654576656e7473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473", - "time_events#0 (copy)" - ] - }, - "1217": { - "op": "box_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1218": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "1219": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1222": { - "op": "dig 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "1224": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "2" - ] - }, - "1226": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%0#0" - ] - }, - "1227": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%0#0", - "\"primary_distribution_opening_date\"" - ] - }, - "1229": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "\"primary_distribution_opening_date\"", - "values%0#0" - ] - }, - "1230": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1231": { - "op": "dig 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "1233": { - "op": "pushint 10", - "defined_out": [ - "10", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "10" - ] - }, - "1235": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%1#0" - ] - }, - "1236": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%1#0", - "\"primary_distribution_closure_date\"" - ] - }, - "1238": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "\"primary_distribution_closure_date\"", - "values%1#0" - ] - }, - "1239": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1240": { - "op": "dig 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "1242": { - "op": "pushint 18", - "defined_out": [ - "18", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "18" - ] - }, - "1244": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%2#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%2#0" - ] - }, - "1245": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%2#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%2#0", - "\"issuance_date\"" - ] - }, - "1247": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "\"issuance_date\"", - "values%2#0" - ] - }, - "1248": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1249": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "time_events#0" - ] - }, - "1250": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "time_events#0", - "0" - ] - }, - "1251": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%6#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%6#0" - ] - }, - "1252": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%6#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%6#0", - "1" - ] - }, - "1253": { - "op": "-", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ] - }, - "1254": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "tmp%1#0", - "8" - ] - }, - "1255": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%3#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%3#0" - ] - }, - "1256": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%3#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "values%3#0" - ] - }, - "1257": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "values%3#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "values%3#0", - "\"maturity_date\"" - ] - }, - "1259": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"maturity_date\"", - "values%3#0" - ] - }, - "1260": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1261": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%2#0" - ] - }, - "1263": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#1" - ] - }, - "1264": { - "error": "Time periods are not properly defined", - "op": "assert // Time periods are not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1265": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"status\"" - ] - }, - "1266": { - "op": "pushint 100", - "defined_out": [ - "\"status\"", - "100", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_rates#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"status\"", - "100" - ] - }, - "1268": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1269": { - "op": "intc_1 // 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "1" - ] - }, - "1270": { - "op": "return", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1271": { - "block": "asset_config_bool_false@4", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ] - }, - "1272": { - "op": "b asset_config_bool_merge@5" - }, - "1275": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.get_account_units_current_value[routing]", - "params": {}, - "block": "get_account_units_current_value", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "1276": { - "op": "pushbytes \"\"", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0" - ] - }, - "1278": { - "op": "dupn 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ] - }, - "1280": { - "op": "txna ApplicationArgs 1" - }, - "1283": { - "op": "dup", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "holding_address#0" - ] - }, - "1284": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "len%0#0" - ] - }, - "1285": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1286": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1287": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0" - ] - }, - "1288": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1291": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1292": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "1293": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "1294": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1295": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1296": { - "op": "btoi", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1297": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "1298": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "1300": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1301": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "1302": { - "op": "bz get_account_units_current_value_bool_false@4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1305": { - "op": "global LatestTimestamp", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "1307": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0" - ] - }, - "1308": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "1310": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1311": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%1#0" - ] - }, - "1312": { - "op": ">=", - "defined_out": [ - "holding_address#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "1313": { - "op": "bz get_account_units_current_value_bool_false@4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1316": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1317": { - "error": "Primary distribution not yet executed", - "block": "get_account_units_current_value_bool_merge@5", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Primary distribution not yet executed", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1318": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x52333023" - ] - }, - "1319": { - "op": "dig 2", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x52333023", - "holding_address#0" - ] - }, - "1321": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1322": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1323": { - "op": "bury 9", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1325": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1326": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_exists%0#0" - ] - }, - "1328": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1329": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "units#0" - ] - }, - "1330": { - "op": "bz get_account_units_current_value_bool_false@8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1333": { - "op": "dig 7", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1335": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1336": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0" - ] - }, - "1337": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0", - "32" - ] - }, - "1338": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "values%0#0" - ] - }, - "1339": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "values%0#0", - "units#0" - ] - }, - "1341": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%4#1" - ] - }, - "1342": { - "op": "bz get_account_units_current_value_bool_false@8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1345": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ] - }, - "1346": { - "error": "Invalid amount of units for the account", - "block": "get_account_units_current_value_bool_merge@9", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ], - "op": "assert // Invalid amount of units for the account", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1347": { - "op": "dig 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1349": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1350": { - "op": "dig 2", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "holding_address#0 (copy)", - "units#0" - ] - }, - "1352": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "account_units_nominal_value#0" - ] - }, - "1355": { - "op": "bury 8", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1357": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "accrued_interest#0" - ] - }, - "1358": { - "op": "bury 7", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1360": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "numerator#0" - ] - }, - "1361": { - "op": "bury 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1363": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "denominator#0" - ] - }, - "1364": { - "op": "bury 6", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1366": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "due_coupons#0" - ] - }, - "1369": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "due_coupons#0", - "due_coupons#0" - ] - }, - "1370": { - "op": "bury 6", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "due_coupons#0" - ] - }, - "1372": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "holding_address#0" - ] - }, - "1373": { - "op": "dig 1", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "due_coupons#0 (copy)", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "holding_address#0", - "due_coupons#0 (copy)" - ] - }, - "1375": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "op": "callsub assert_no_pending_coupon_payment", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0" - ] - }, - "1378": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.is_accruing_interest", - "op": "callsub is_accruing_interest", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "tmp%7#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%7#0" - ] - }, - "1381": { - "op": "bz get_account_units_current_value_after_if_else@11", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1384": { - "op": "dig 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0" - ] - }, - "1386": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "due_coupons#0 (copy)" - ] - }, - "1387": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "day_count_factor#0" - ] - }, - "1390": { - "op": "dig 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "day_count_factor#0", - "holding_address#0" - ] - }, - "1392": { - "op": "dig 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "day_count_factor#0", - "holding_address#0", - "units#0" - ] - }, - "1394": { - "op": "uncover 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "holding_address#0", - "units#0", - "due_coupons#0" - ] - }, - "1396": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.accrued_interest_amount", - "op": "callsub accrued_interest_amount", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "accrued_interest#0" - ] - }, - "1399": { - "op": "bury 7", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1401": { - "op": "dup", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "1402": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "1403": { - "op": "extract_uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "numerator#0" - ] - }, - "1404": { - "op": "bury 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1406": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "account_units_nominal_value#0", - "accrued_interest#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "8" - ] - }, - "1407": { - "op": "extract_uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "denominator#0" - ] - }, - "1408": { - "op": "bury 5", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1410": { - "block": "get_account_units_current_value_after_if_else@11", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "dig 2", - "defined_out": [ - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "numerator#0" - ] - }, - "1412": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1413": { - "op": "dig 5", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0", - "denominator#0" - ] - }, - "1415": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1416": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0" - ] - }, - "1417": { - "op": "dig 7", - "defined_out": [ - "account_units_nominal_value#0", - "aggregate%head%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "account_units_nominal_value#0" - ] - }, - "1419": { - "op": "itob", - "defined_out": [ - "account_units_nominal_value#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1420": { - "op": "dig 7", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "accrued_interest#0" - ] - }, - "1422": { - "op": "itob", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1423": { - "op": "concat", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%head%3#0" - ] - }, - "1424": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%3#0", - "aggregate%head%1#0" - ] - }, - "1425": { - "op": "concat", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%4#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%4#0" - ] - }, - "1426": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%4#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%4#0", - "0x151f7c75" - ] - }, - "1427": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%head%4#0" - ] - }, - "1428": { - "op": "concat", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "numerator#0", - "tmp%5#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%5#0" - ] - }, - "1429": { - "op": "log", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1430": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "1" - ] - }, - "1431": { - "op": "return", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1432": { - "block": "get_account_units_current_value_bool_false@8", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%1#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ] - }, - "1433": { - "op": "b get_account_units_current_value_bool_merge@9" - }, - "1436": { - "block": "get_account_units_current_value_bool_false@4", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1437": { - "op": "b get_account_units_current_value_bool_merge@5" - }, - "1440": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.get_coupon_rates[routing]", - "params": {}, - "block": "get_coupon_rates", - "stack_in": [], - "op": "bytec 30 // 0x0000" - }, - "1442": { - "op": "intc_0 // 0" - }, - "1443": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "coupon_rates#0" - ], - "stack_out": [ - "coupon_rates#0", - "0", - "\"status\"" - ] - }, - "1444": { - "op": "app_global_get_ex", - "defined_out": [ - "coupon_rates#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "coupon_rates#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1445": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "coupon_rates#0", - "maybe_value%0#0" - ] - }, - "1446": { - "op": "pushint 100", - "defined_out": [ - "100", - "coupon_rates#0", - "maybe_value%0#0" - ], - "stack_out": [ - "coupon_rates#0", - "maybe_value%0#0", - "100" - ] - }, - "1448": { - "op": "==", - "defined_out": [ - "coupon_rates#0", - "tmp%0#2" - ], - "stack_out": [ - "coupon_rates#0", - "tmp%0#2" - ] - }, - "1449": { - "op": "bz get_coupon_rates_after_if_else@3", - "stack_out": [ - "coupon_rates#0" - ] - }, - "1452": { - "op": "bytec 19 // 0x636f75706f6e5261746573", - "defined_out": [ - "0x636f75706f6e5261746573", - "coupon_rates#0" - ], - "stack_out": [ - "coupon_rates#0", - "0x636f75706f6e5261746573" - ] - }, - "1454": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%1#0", - "coupon_rates#0" - ], - "stack_out": [ - "coupon_rates#0", - "coupon_rates#0", - "aggregate%box_get%1#0" - ] - }, - "1455": { - "op": "swap", - "stack_out": [ - "coupon_rates#0", - "aggregate%box_get%1#0", - "coupon_rates#0" - ] - }, - "1456": { - "op": "bury 2", - "stack_out": [ - "coupon_rates#0", - "aggregate%box_get%1#0" - ] - }, - "1458": { - "error": "check self.coupon_rates exists", - "op": "assert // check self.coupon_rates exists", - "stack_out": [ - "coupon_rates#0" - ] - }, - "1459": { - "block": "get_coupon_rates_after_if_else@3", - "stack_in": [ - "coupon_rates#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "coupon_rates#0", - "0x151f7c75" - ] - }, - "1460": { - "op": "dig 1", - "defined_out": [ - "0x151f7c75", - "coupon_rates#0" - ], - "stack_out": [ - "coupon_rates#0", - "0x151f7c75", - "coupon_rates#0" - ] - }, - "1462": { - "op": "concat", - "defined_out": [ - "coupon_rates#0", - "tmp%1#0" - ], - "stack_out": [ - "coupon_rates#0", - "tmp%1#0" - ] - }, - "1463": { - "op": "log", - "stack_out": [ - "coupon_rates#0" - ] - }, - "1464": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "coupon_rates#0" - ], - "stack_out": [ - "coupon_rates#0", - "1" - ] - }, - "1465": { - "op": "return", - "stack_out": [ - "coupon_rates#0" - ] - }, - "1466": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.get_payment_amount[routing]", - "params": {}, - "block": "get_payment_amount", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "paid_coupons#0" - ] - }, - "1468": { - "op": "txna ApplicationArgs 1" - }, - "1471": { - "op": "dupn 2", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1473": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "holding_address#0", - "len%0#0" - ] - }, - "1474": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1475": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1476": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "holding_address#0" - ] - }, - "1477": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "holding_address#0", - "0x52333023" - ] - }, - "1478": { - "op": "swap", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "0x52333023", - "holding_address#0" - ] - }, - "1479": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1" - ] - }, - "1480": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1481": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1482": { - "op": "bury 1", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1484": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1" - ] - }, - "1485": { - "op": "intc_0 // 0" - }, - "1486": { - "op": "dupn 2" - }, - "1488": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "0", - "\"status\"" - ] - }, - "1489": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1490": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "maybe_value%0#0" - ] - }, - "1491": { - "op": "pushint 100", - "defined_out": [ - "100", - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "maybe_value%0#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "maybe_value%0#0", - "100" - ] - }, - "1493": { - "op": "==", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "principal_amount#0", - "tmp%0#2" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%0#2" - ] - }, - "1494": { - "op": "bz get_payment_amount_after_if_else@6", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ] - }, - "1497": { - "op": "dig 2", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "box_prefixed_key%0#1" - ] - }, - "1499": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1500": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%box_get%0#0" - ] - }, - "1501": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%box_get%0#0", - "48" - ] - }, - "1503": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "paid_coupons#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0" - ] - }, - "1504": { - "op": "dup", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0", - "paid_coupons#0" - ] - }, - "1505": { - "op": "bury 6", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0" - ] - }, - "1507": { - "op": "intc_0 // 0", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0", - "0" - ] - }, - "1508": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "paid_coupons#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0", - "0", - "\"total_coupons\"" - ] - }, - "1510": { - "op": "app_global_get_ex", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1511": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "paid_coupons#0", - "maybe_value%0#0" - ] - }, - "1512": { - "op": "<", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "paid_coupons#0", - "principal_amount#0", - "tmp%1#1" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%1#1" - ] - }, - "1513": { - "op": "bz get_payment_amount_else_body@4", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ] - }, - "1516": { - "op": "dig 3", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "holding_address#0" - ] - }, - "1518": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "paid_coupons#0", - "principal_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%2#1" - ] - }, - "1521": { - "op": "dig 5", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%2#1", - "paid_coupons#0" - ] - }, - "1523": { - "op": "intc_1 // 1", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%2#1", - "paid_coupons#0", - "1" - ] - }, - "1524": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "interest_amount#0", - "paid_coupons#0", - "principal_amount#0", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%2#1", - "tmp%3#1" - ] - }, - "1525": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_interest_amount", - "op": "callsub coupon_interest_amount", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "interest_amount#0" - ] - }, - "1528": { - "op": "bury 2", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ] - }, - "1530": { - "block": "get_payment_amount_after_if_else@6", - "stack_in": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ], - "op": "dig 1", - "defined_out": [ - "interest_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "interest_amount#0" - ] - }, - "1532": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "interest_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1533": { - "op": "dig 1", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%val_as_bytes%0#0", - "principal_amount#0" - ] - }, - "1535": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1536": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%head%1#0" - ] - }, - "1537": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "1538": { - "op": "swap", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "1539": { - "op": "concat", - "defined_out": [ - "interest_amount#0", - "principal_amount#0", - "tmp%3#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "tmp%3#0" - ] - }, - "1540": { - "op": "log", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ] - }, - "1541": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "interest_amount#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "1" - ] - }, - "1542": { - "op": "return", - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ] - }, - "1543": { - "block": "get_payment_amount_else_body@4", - "stack_in": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ], - "op": "dig 3", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "holding_address#0" - ] - }, - "1545": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "holding_address#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0", - "principal_amount#0" - ] - }, - "1548": { - "op": "bury 1", - "defined_out": [ - "holding_address#0", - "principal_amount#0" - ], - "stack_out": [ - "paid_coupons#0", - "holding_address#0", - "box_prefixed_key%0#1", - "interest_amount#0", - "principal_amount#0" - ] - }, - "1550": { - "op": "b get_payment_amount_after_if_else@6" - }, - "1553": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.get_coupons_status[routing]", - "params": {}, - "block": "get_coupons_status", - "stack_in": [], - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "due_coupons#0" - ] - }, - "1556": { - "op": "dupn 2", - "defined_out": [ - "due_coupons#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "due_coupons#0", - "due_coupons#0", - "due_coupons#0 (copy)" - ] - }, - "1558": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.next_coupon_due_date", - "op": "callsub next_coupon_due_date", - "defined_out": [ - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "due_coupons#0", - "due_coupons#0", - "next_coupon_due_date#0" - ] - }, - "1561": { - "op": "swap", - "defined_out": [ - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "due_coupons#0" - ] - }, - "1562": { - "op": "dup", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "due_coupons#0", - "due_coupons#0 (copy)" - ] - }, - "1563": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "op": "callsub all_due_coupons_paid", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "due_coupons#0", - "all_due_coupons_paid#0" - ] - }, - "1566": { - "op": "swap", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "due_coupons#0" - ] - }, - "1567": { - "op": "intc_0 // 0", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "due_coupons#0", - "numerator#0" - ] - }, - "1568": { - "op": "swap", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1569": { - "op": "intc_0 // 0", - "defined_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "due_coupons#0", - "denominator#0" - ] - }, - "1570": { - "op": "swap", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "due_coupons#0" - ] - }, - "1571": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.is_accruing_interest", - "op": "callsub is_accruing_interest", - "defined_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%3#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "tmp%3#0" - ] - }, - "1574": { - "op": "bz get_coupons_status_after_if_else@3", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0" - ] - }, - "1577": { - "op": "dig 4", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "due_coupons#0" - ] - }, - "1579": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "all_due_coupons_paid#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "day_count_factor#0" - ] - }, - "1582": { - "op": "dup", - "defined_out": [ - "all_due_coupons_paid#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "1583": { - "op": "intc_0 // 0", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "1584": { - "op": "extract_uint64", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "day_count_factor#0", - "numerator#0" - ] - }, - "1585": { - "op": "bury 3", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "day_count_factor#0" - ] - }, - "1587": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "all_due_coupons_paid#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "day_count_factor#0", - "8" - ] - }, - "1588": { - "op": "extract_uint64", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "denominator#0" - ] - }, - "1589": { - "op": "bury 1", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0" - ] - }, - "1591": { - "block": "get_coupons_status_after_if_else@3", - "stack_in": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "0" - ] - }, - "1592": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "0", - "\"total_coupons\"" - ] - }, - "1594": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1595": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0" - ] - }, - "1596": { - "op": "dig 2", - "defined_out": [ - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ] - }, - "1598": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1599": { - "op": "dig 2", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0", - "aggregate%val_as_bytes%0#0", - "denominator#0" - ] - }, - "1601": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1602": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "maybe_value%0#0", - "aggregate%head%1#0" - ] - }, - "1603": { - "op": "swap", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "maybe_value%0#0" - ] - }, - "1604": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1605": { - "op": "dig 6", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "due_coupons#0" - ] - }, - "1607": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1608": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%head%3#0" - ] - }, - "1609": { - "op": "dig 5", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "next_coupon_due_date#0" - ] - }, - "1611": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%4#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "1612": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%4#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%1#0", - "aggregate%head%4#0" - ] - }, - "1613": { - "op": "swap", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%4#0", - "aggregate%head%1#0" - ] - }, - "1614": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%5#0" - ] - }, - "1615": { - "op": "bytec 31 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%5#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%5#0", - "0x00" - ] - }, - "1617": { - "op": "intc_0 // 0", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%5#0", - "0x00", - "0" - ] - }, - "1618": { - "op": "dig 5", - "defined_out": [ - "0", - "0x00", - "aggregate%head%5#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%5#0", - "0x00", - "0", - "all_due_coupons_paid#0" - ] - }, - "1620": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "aggregate%head%5#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%5#0", - "aggregate%encoded_bool%0#0" - ] - }, - "1621": { - "op": "concat", - "defined_out": [ - "aggregate%head%6#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%6#0" - ] - }, - "1622": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%6#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "aggregate%head%6#0", - "0x151f7c75" - ] - }, - "1623": { - "op": "swap", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "0x151f7c75", - "aggregate%head%6#0" - ] - }, - "1624": { - "op": "concat", - "defined_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%1#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "tmp%1#0" - ] - }, - "1625": { - "op": "log", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0" - ] - }, - "1626": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0", - "1" - ] - }, - "1627": { - "op": "return", - "stack_out": [ - "due_coupons#0", - "next_coupon_due_date#0", - "all_due_coupons_paid#0", - "numerator#0", - "denominator#0" - ] - }, - "1628": { - "subroutine": "modules.payment_agent.coupon.CouponPaymentAgentMixin.pay_coupon[routing]", - "params": {}, - "block": "pay_coupon", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "1631": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1632": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "1633": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1634": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "1635": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "1636": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "1639": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1640": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)", - "0" - ] - }, - "1641": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0" - ] - }, - "1642": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "1644": { - "op": "+", - "defined_out": [ - "add%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "add%0#0" - ] - }, - "1645": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "add%0#0", - "tmp%2#0 (copy)" - ] - }, - "1647": { - "op": "len", - "defined_out": [ - "add%0#0", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "add%0#0", - "len%1#0" - ] - }, - "1648": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1649": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "1650": { - "op": "extract 2 0", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0" - ] - }, - "1653": { - "op": "swap", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0" - ] - }, - "1654": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0" - ] - }, - "1655": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0", - "\"status\"" - ] - }, - "1656": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1657": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "maybe_value%0#0" - ] - }, - "1658": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "100" - ] - }, - "1660": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_info#0", - "tmp%0#5" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "tmp%0#5" - ] - }, - "1661": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "payment_info#0", - "holding_address#0" - ] - }, - "1662": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "1665": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "1668": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0x52333023" - ] - }, - "1669": { - "op": "dig 1", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "1671": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1672": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "1673": { - "op": "cover 2", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1675": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1676": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%0#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1677": { - "op": "bury 1", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "1679": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1680": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1681": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1682": { - "op": "pop", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0" - ] - }, - "1683": { - "op": "intc_2 // 32", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "32" - ] - }, - "1684": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "units#2" - ] - }, - "1685": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "units#2", - "units#2" - ] - }, - "1686": { - "op": "cover 3", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "box_prefixed_key%0#3", - "units#2" - ] - }, - "1688": { - "error": "No D-ASA units", - "op": "assert // No D-ASA units", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1689": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "box_prefixed_key%0#3", - "due_coupons#0" - ] - }, - "1692": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "box_prefixed_key%0#3" - ] - }, - "1693": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "1694": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "aggregate%box_get%2#0" - ] - }, - "1695": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%2#0", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "aggregate%box_get%2#0", - "48" - ] - }, - "1697": { - "op": "extract_uint64", - "defined_out": [ - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "account_paid_coupons#0" - ] - }, - "1698": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "due_coupons#0" - ] - }, - "1699": { - "op": "dig 1", - "defined_out": [ - "account_paid_coupons#0", - "account_paid_coupons#0 (copy)", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "due_coupons#0", - "account_paid_coupons#0 (copy)" - ] - }, - "1701": { - "op": ">", - "defined_out": [ - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%3#3", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "tmp%3#3" - ] - }, - "1702": { - "error": "No due coupon to pay", - "op": "assert // No due coupon to pay", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0" - ] - }, - "1703": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "account_paid_coupons#0 (copy)" - ] - }, - "1704": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "op": "callsub all_due_coupons_paid", - "defined_out": [ - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%4#2", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "tmp%4#2" - ] - }, - "1707": { - "error": "Pending due coupon payment", - "op": "assert // Pending due coupon payment", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0" - ] - }, - "1708": { - "op": "dig 1", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "holding_address#0 (copy)" - ] - }, - "1710": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%0#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "tmp%0#1" - ] - }, - "1713": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "tmp%0#1", - "account_paid_coupons#0" - ] - }, - "1714": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%0#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "tmp%0#1", - "account_paid_coupons#0", - "1" - ] - }, - "1715": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%0#1", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "tmp%0#1", - "tmp%1#0" - ] - }, - "1716": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_interest_amount", - "op": "callsub coupon_interest_amount", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "payment_amount#1" - ] - }, - "1719": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "holding_address#0" - ] - }, - "1720": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1721": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.assert_payment_authorization", - "op": "callsub assert_payment_authorization", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "holding_address#0" - ] - }, - "1724": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.is_payment_executable", - "op": "callsub is_payment_executable", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "tmp%2#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#1" - ] - }, - "1727": { - "op": "bz pay_coupon_else_body@3", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1730": { - "op": "dupn 2", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_amount#1 (copy)", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1", - "payment_amount#1 (copy)" - ] - }, - "1732": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.assert_enough_funds", - "op": "callsub assert_enough_funds", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1" - ] - }, - "1735": { - "op": "dig 3", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1", - "box_prefixed_key%0#3" - ] - }, - "1737": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "1738": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1", - "aggregate%box_get%4#0" - ] - }, - "1739": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1", - "aggregate%extract%2#0" - ] - }, - "1742": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%extract%2#0", - "payment_amount#1" - ] - }, - "1743": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.pay", - "op": "callsub pay", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1746": { - "block": "pay_coupon_after_if_else@4", - "stack_in": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3" - ] - }, - "1748": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1749": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "1750": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%box_get%6#0" - ] - }, - "1751": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%6#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%box_get%6#0", - "48" - ] - }, - "1753": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "values%0#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "values%0#1" - ] - }, - "1754": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "box_prefixed_key%0#3", - "values%0#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "values%0#1", - "1" - ] - }, - "1755": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "1756": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%val_as_bytes%0#0" - ] - }, - "1757": { - "op": "pushint 48" - }, - "1759": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "48", - "aggregate%val_as_bytes%0#0" - ] - }, - "1760": { - "op": "box_replace", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1761": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0" - ] - }, - "1762": { - "op": "bytec 28 // \"paid_coupon_units\"", - "defined_out": [ - "\"paid_coupon_units\"", - "0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0", - "\"paid_coupon_units\"" - ] - }, - "1764": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1765": { - "error": "check self.paid_coupon_units exists", - "op": "assert // check self.paid_coupon_units exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0" - ] - }, - "1766": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "units#2" - ] - }, - "1768": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0" - ] - }, - "1769": { - "op": "bytec 28 // \"paid_coupon_units\"", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "\"paid_coupon_units\"" - ] - }, - "1771": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "\"paid_coupon_units\"", - "tmp%1#0" - ] - }, - "1772": { - "op": "app_global_put", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1773": { - "op": "global CurrentApplicationID", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1" - ] - }, - "1775": { - "op": "global LatestTimestamp", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0" - ] - }, - "1777": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "0" - ] - }, - "1778": { - "op": "bytec 16 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0", - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "0", - "\"denomination_asset_id\"" - ] - }, - "1780": { - "op": "app_global_get_ex", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1781": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0" - ] - }, - "1782": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#1", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "1783": { - "op": "asset_params_get AssetUnitName", - "defined_out": [ - "box_prefixed_key%0#3", - "check%0#0", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "check%0#0" - ] - }, - "1785": { - "error": "asset exists", - "op": "assert // asset exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0" - ] - }, - "1786": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "0" - ] - }, - "1787": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "0", - "\"circulating_units\"" - ] - }, - "1788": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_exists%2#0", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1789": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0" - ] - }, - "1790": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "1791": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0", - "\"unit_value\"" - ] - }, - "1793": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_exists%3#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1794": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "1795": { - "op": "*", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2" - ] - }, - "1796": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "tmp%0#1" - ] - }, - "1798": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%1#0" - ] - }, - "1799": { - "op": "pushbytes 0x080037", - "defined_out": [ - "0x080037", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%1#0", - "0x080037" - ] - }, - "1804": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%2#0" - ] - }, - "1805": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%2#0", - "tmp%1#0" - ] - }, - "1807": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%2#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1808": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%3#0" - ] - }, - "1809": { - "op": "dig 4", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%3#0", - "payment_amount#1" - ] - }, - "1811": { - "op": "itob", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1812": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0" - ] - }, - "1813": { - "op": "dig 1", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "1815": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0" - ] - }, - "1816": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "maybe_value%0#0" - ] - }, - "1818": { - "op": "itob", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%4#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "1819": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0" - ] - }, - "1820": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0", - "value%0#0 (copy)" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "value%0#0 (copy)" - ] - }, - "1822": { - "op": "len", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length%1#0" - ] - }, - "1823": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%2#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%as_bytes%2#0" - ] - }, - "1824": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0" - ] - }, - "1827": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "value%0#0" - ] - }, - "1829": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%encoded_value%1#0" - ] - }, - "1830": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0" - ] - }, - "1831": { - "op": "bytec 35 // 0x003b", - "defined_out": [ - "0x003b", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "0x003b" - ] - }, - "1833": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0" - ] - }, - "1834": { - "op": "uncover 3", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "tmp%2#2" - ] - }, - "1836": { - "op": "itob", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%5#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "1837": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0" - ] - }, - "1838": { - "op": "bytec 30 // 0x0000", - "defined_out": [ - "0x0000", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "0x0000" - ] - }, - "1840": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0" - ] - }, - "1841": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "0" - ] - }, - "1842": { - "op": "itob", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%6#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%6#0" - ] - }, - "1843": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0" - ] - }, - "1844": { - "op": "pushbytes 0x00024950", - "defined_out": [ - "0x00024950", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "0x00024950" - ] - }, - "1850": { - "op": "concat", - "defined_out": [ - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%concat%0#0" - ] - }, - "1851": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0" - ] - }, - "1852": { - "op": "concat", - "defined_out": [ - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0" - ] - }, - "1853": { - "op": "bytec 36 // method \"Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)\"", - "defined_out": [ - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))" - ] - }, - "1855": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0" - ] - }, - "1856": { - "op": "concat", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "event%0#0", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "event%0#0" - ] - }, - "1857": { - "op": "log", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0" - ] - }, - "1858": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%3#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "tmp%3#1" - ] - }, - "1860": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "1861": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0" - ] - }, - "1862": { - "op": "dig 4", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0" - ] - }, - "1864": { - "op": "dup", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "payment_info#0 (copy)", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "payment_info#0 (copy)" - ] - }, - "1865": { - "op": "len", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length%2#0" - ] - }, - "1866": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%4#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%as_bytes%4#0" - ] - }, - "1867": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length_uint16%2#0" - ] - }, - "1870": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "payment_info#0" - ] - }, - "1871": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "aggregate%encoded_value%2#0" - ] - }, - "1872": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0" - ] - }, - "1873": { - "op": "bytec 37 // 0x0012", - "defined_out": [ - "0x0012", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "0x0012" - ] - }, - "1875": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%12#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%encoded_value%2#0", - "aggregate%head%12#0" - ] - }, - "1876": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%12#0", - "aggregate%encoded_value%2#0" - ] - }, - "1877": { - "op": "concat", - "defined_out": [ - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%concat%2#0" - ] - }, - "1878": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%concat%2#0", - "0x151f7c75" - ] - }, - "1879": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0x151f7c75", - "aggregate%concat%2#0" - ] - }, - "1880": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "tmp%5#0", - "units#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%5#0" - ] - }, - "1881": { - "op": "log", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1882": { - "op": "intc_1 // 1", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "1" - ] - }, - "1883": { - "op": "return", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1884": { - "block": "pay_coupon_else_body@3", - "stack_in": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "payment_amount#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1" - ] - }, - "1885": { - "op": "bury 1", - "defined_out": [ - "payment_amount#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1887": { - "op": "b pay_coupon_after_if_else@4" - }, - "1890": { - "subroutine": "modules.payment_agent.principal.PrincipalPaymentAgentMixin.pay_principal[routing]", - "params": {}, - "block": "pay_principal", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "1893": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1894": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "1895": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1896": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "1897": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "1898": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "1901": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1902": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)", - "0" - ] - }, - "1903": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0" - ] - }, - "1904": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "1906": { - "op": "+", - "defined_out": [ - "add%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "add%0#0" - ] - }, - "1907": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "add%0#0", - "tmp%2#0 (copy)" - ] - }, - "1909": { - "op": "len", - "defined_out": [ - "add%0#0", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "add%0#0", - "len%1#0" - ] - }, - "1910": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1911": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "1912": { - "op": "extract 2 0", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0" - ] - }, - "1915": { - "op": "swap", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0" - ] - }, - "1916": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0" - ] - }, - "1917": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0", - "\"status\"" - ] - }, - "1918": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1919": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "maybe_value%0#0" - ] - }, - "1920": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "100" - ] - }, - "1922": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_info#0", - "tmp%0#5" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "tmp%0#5" - ] - }, - "1923": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "payment_info#0", - "holding_address#0" - ] - }, - "1924": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "1927": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "1930": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0x52333023" - ] - }, - "1931": { - "op": "dig 1", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "1933": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1934": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "1935": { - "op": "cover 2", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1937": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1938": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%0#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1939": { - "op": "bury 1", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "1941": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1942": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1943": { - "op": "pop", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "aggregate%box_get%0#0" - ] - }, - "1944": { - "op": "intc_2 // 32", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "aggregate%box_get%0#0", - "32" - ] - }, - "1945": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "units#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "units#0" - ] - }, - "1946": { - "error": "No D-ASA units", - "op": "assert // No D-ASA units", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0" - ] - }, - "1947": { - "op": "global LatestTimestamp", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1" - ] - }, - "1949": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "0" - ] - }, - "1950": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "0", - "\"maturity_date\"" - ] - }, - "1952": { - "op": "app_global_get_ex", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1953": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "maybe_value%0#0" - ] - }, - "1954": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%3#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%3#3" - ] - }, - "1955": { - "error": "Not mature", - "op": "assert // Not mature", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0" - ] - }, - "1956": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%0#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%0#1" - ] - }, - "1959": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "op": "callsub all_due_coupons_paid", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%1#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%1#1" - ] - }, - "1962": { - "error": "Pending due coupon payment", - "op": "assert // Pending due coupon payment", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0" - ] - }, - "1963": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1964": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0" - ] - }, - "1967": { - "op": "swap", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "holding_address#0" - ] - }, - "1968": { - "op": "dup", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1969": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.assert_payment_authorization", - "op": "callsub assert_payment_authorization", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "holding_address#0" - ] - }, - "1972": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.is_payment_executable", - "op": "callsub is_payment_executable", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%1#1" - ] - }, - "1975": { - "op": "bz pay_principal_else_body@3", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1978": { - "op": "dupn 2", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0 (copy)", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0", - "payment_amount#0 (copy)" - ] - }, - "1980": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.assert_enough_funds", - "op": "callsub assert_enough_funds", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0" - ] - }, - "1983": { - "op": "dig 2", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0", - "box_prefixed_key%0#3" - ] - }, - "1985": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "1986": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0", - "aggregate%box_get%2#0" - ] - }, - "1987": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0", - "aggregate%extract%1#0" - ] - }, - "1990": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%extract%1#0", - "payment_amount#0" - ] - }, - "1991": { - "callsub": "modules.payment_agent.common.PaymentAgentCommonMixin.pay", - "op": "callsub pay", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1994": { - "block": "pay_principal_after_if_else@4", - "stack_in": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0" - ] - }, - "1995": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0", - "\"circulating_units\"" - ] - }, - "1996": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1997": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0" - ] - }, - "1998": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "box_prefixed_key%0#3" - ] - }, - "2000": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "maybe_value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "box_prefixed_key%0#3 (copy)", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2001": { - "op": "cover 2", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2003": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "box_prefixed_key%0#3", - "maybe_value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "2004": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "aggregate%box_get%4#0" - ] - }, - "2005": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%4#0", - "box_prefixed_key%0#3", - "maybe_value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "aggregate%box_get%4#0", - "32" - ] - }, - "2006": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "values%0#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "values%0#1" - ] - }, - "2007": { - "op": "-", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "2008": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "tmp%0#1", - "\"circulating_units\"" - ] - }, - "2009": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "\"circulating_units\"", - "tmp%0#1" - ] - }, - "2010": { - "op": "app_global_put", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3" - ] - }, - "2011": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "0" - ] - }, - "2012": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "aggregate%val_as_bytes%0#0" - ] - }, - "2013": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3" - ] - }, - "2014": { - "op": "intc_2 // 32", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "32" - ] - }, - "2015": { - "op": "dig 2", - "defined_out": [ - "32", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "32", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "2017": { - "op": "box_replace", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2018": { - "callsub": "modules.accounting.AccountingModule.end_if_no_circulating_units", - "op": "callsub end_if_no_circulating_units" - }, - "2021": { - "op": "global CurrentApplicationID", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1" - ] - }, - "2023": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2" - ] - }, - "2025": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "0" - ] - }, - "2026": { - "op": "bytec 16 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "0", - "\"denomination_asset_id\"" - ] - }, - "2028": { - "op": "app_global_get_ex", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2029": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0" - ] - }, - "2030": { - "op": "dup", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "2031": { - "op": "asset_params_get AssetUnitName", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "check%0#0", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "check%0#0" - ] - }, - "2033": { - "error": "asset exists", - "op": "assert // asset exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0" - ] - }, - "2034": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "0" - ] - }, - "2035": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "0", - "\"circulating_units\"" - ] - }, - "2036": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_exists%2#0", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2037": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0" - ] - }, - "2038": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "2039": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0", - "\"unit_value\"" - ] - }, - "2041": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_exists%3#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2042": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "2043": { - "op": "*", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1" - ] - }, - "2044": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "tmp%0#1" - ] - }, - "2046": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%1#0" - ] - }, - "2047": { - "op": "pushbytes 0x030037", - "defined_out": [ - "0x030037", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%1#0", - "0x030037" - ] - }, - "2052": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%2#0" - ] - }, - "2053": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%2#0", - "tmp%1#2" - ] - }, - "2055": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%2#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2056": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%3#0" - ] - }, - "2057": { - "op": "dig 5", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%3#0", - "payment_amount#0" - ] - }, - "2059": { - "op": "itob", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2060": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0" - ] - }, - "2061": { - "op": "dig 1", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "2063": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0" - ] - }, - "2064": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "maybe_value%0#0" - ] - }, - "2066": { - "op": "itob", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%4#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "2067": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0" - ] - }, - "2068": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0", - "value%0#0 (copy)" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "value%0#0 (copy)" - ] - }, - "2070": { - "op": "len", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length%1#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length%1#0" - ] - }, - "2071": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%2#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%as_bytes%2#0" - ] - }, - "2072": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0" - ] - }, - "2075": { - "op": "uncover 4", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "value%0#0" - ] - }, - "2077": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%encoded_value%1#0" - ] - }, - "2078": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0" - ] - }, - "2079": { - "op": "bytec 35 // 0x003b", - "defined_out": [ - "0x003b", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "0x003b" - ] - }, - "2081": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0" - ] - }, - "2082": { - "op": "uncover 3", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "tmp%2#1" - ] - }, - "2084": { - "op": "itob", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%5#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "2085": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0" - ] - }, - "2086": { - "op": "bytec 30 // 0x0000", - "defined_out": [ - "0x0000", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "0x0000" - ] - }, - "2088": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0" - ] - }, - "2089": { - "op": "uncover 3", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2091": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0" - ] - }, - "2092": { - "op": "pushbytes 0x00025052", - "defined_out": [ - "0x00025052", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "0x00025052" - ] - }, - "2098": { - "op": "concat", - "defined_out": [ - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%concat%0#0" - ] - }, - "2099": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0" - ] - }, - "2100": { - "op": "concat", - "defined_out": [ - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0" - ] - }, - "2101": { - "op": "bytec 36 // method \"Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)\"", - "defined_out": [ - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))" - ] - }, - "2103": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0" - ] - }, - "2104": { - "op": "concat", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "event%0#0", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "event%0#0" - ] - }, - "2105": { - "op": "log", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2106": { - "op": "global LatestTimestamp", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "tmp%2#1" - ] - }, - "2108": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "2109": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0" - ] - }, - "2110": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0" - ] - }, - "2112": { - "op": "dup", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0", - "payment_info#0 (copy)" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "payment_info#0 (copy)" - ] - }, - "2113": { - "op": "len", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length%2#0" - ] - }, - "2114": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%4#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%as_bytes%4#0" - ] - }, - "2115": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length_uint16%2#0" - ] - }, - "2118": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "payment_info#0" - ] - }, - "2119": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "aggregate%encoded_value%2#0" - ] - }, - "2120": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0" - ] - }, - "2121": { - "op": "bytec 37 // 0x0012", - "defined_out": [ - "0x0012", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "0x0012" - ] - }, - "2123": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%12#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%encoded_value%2#0", - "aggregate%head%12#0" - ] - }, - "2124": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%12#0", - "aggregate%encoded_value%2#0" - ] - }, - "2125": { - "op": "concat", - "defined_out": [ - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%concat%2#0" - ] - }, - "2126": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%concat%2#0", - "0x151f7c75" - ] - }, - "2127": { - "op": "swap", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0x151f7c75", - "aggregate%concat%2#0" - ] - }, - "2128": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0", - "tmp%5#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%5#0" - ] - }, - "2129": { - "op": "log", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "2130": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "1" - ] - }, - "2131": { - "op": "return", - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "2132": { - "block": "pay_principal_else_body@3", - "stack_in": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0" - ] - }, - "2133": { - "op": "bury 1", - "defined_out": [ - "payment_amount#0" - ], - "stack_out": [ - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "2135": { - "op": "b pay_principal_after_if_else@4" - }, - "2138": { - "subroutine": "modules.transfer_agent.coupon.CouponTransferAgentMixin.asset_transfer[routing]", - "params": {}, - "block": "asset_transfer", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0" - ] - }, - "2139": { - "op": "dupn 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ] - }, - "2141": { - "op": "pushbytes \"\"", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0" - ] - }, - "2143": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0" - ] - }, - "2144": { - "op": "txna ApplicationArgs 1" - }, - "2147": { - "op": "dup", - "defined_out": [ - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "sender_holding_address#0" - ] - }, - "2148": { - "op": "len", - "defined_out": [ - "len%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "len%0#0" - ] - }, - "2149": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "len%0#0", - "32" - ] - }, - "2150": { - "op": "==", - "defined_out": [ - "eq%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "eq%0#0" - ] - }, - "2151": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0" - ] - }, - "2152": { - "op": "txna ApplicationArgs 2" - }, - "2155": { - "op": "dup", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "receiver_holding_address#0" - ] - }, - "2156": { - "op": "len", - "defined_out": [ - "len%1#0", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "len%1#0" - ] - }, - "2157": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "len%1#0", - "32" - ] - }, - "2158": { - "op": "==", - "defined_out": [ - "eq%1#0", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "eq%1#0" - ] - }, - "2159": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0" - ] - }, - "2160": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0" - ] - }, - "2163": { - "op": "dup", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ] - }, - "2164": { - "op": "len", - "defined_out": [ - "len%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "len%2#0" - ] - }, - "2165": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "len%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "len%2#0", - "8" - ] - }, - "2166": { - "op": "==", - "defined_out": [ - "eq%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "eq%2#0" - ] - }, - "2167": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0" - ] - }, - "2168": { - "op": "btoi", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2169": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2170": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"status\"" - ] - }, - "2171": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2172": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2173": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "100" - ] - }, - "2175": { - "op": "==", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%0#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#1" - ] - }, - "2176": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2179": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2180": { - "op": "bytec 18 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2182": { - "op": "app_global_get_ex", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2183": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2184": { - "op": "global LatestTimestamp", - "defined_out": [ - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "tmp%1#1" - ] - }, - "2186": { - "op": "<=", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%2#2", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%2#2" - ] - }, - "2187": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2190": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2191": { - "op": "bytec 11 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2193": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2194": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "2195": { - "op": "bz asset_transfer_bool_true@5", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2198": { - "op": "global LatestTimestamp", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1" - ] - }, - "2200": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "0" - ] - }, - "2201": { - "op": "bytec 11 // \"secondary_market_closure_date\"", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2203": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2204": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "maybe_value%2#0" - ] - }, - "2205": { - "op": "<", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%5#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%5#0" - ] - }, - "2206": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2209": { - "block": "asset_transfer_bool_true@5", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2210": { - "error": "Secondary market is closed", - "block": "asset_transfer_bool_merge@7", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Secondary market is closed", - "defined_out": [], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2211": { - "op": "txn Sender", - "defined_out": [ - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3" - ] - }, - "2213": { - "op": "dig 3", - "defined_out": [ - "sender_holding_address#0", - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3", - "sender_holding_address#0" - ] - }, - "2215": { - "op": "dup", - "defined_out": [ - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3", - "sender_holding_address#0 (copy)", - "sender_holding_address#0 (copy)" - ] - }, - "2216": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "tmp%0#3", - "sender_holding_address#0 (copy)" - ] - }, - "2218": { - "op": "==", - "defined_out": [ - "sender_holding_address#0", - "tmp%1#4" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "tmp%1#4" - ] - }, - "2219": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0" - ] - }, - "2220": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2223": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2226": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "0x52333023" - ] - }, - "2227": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "0x52333023", - "sender_holding_address#0 (copy)" - ] - }, - "2229": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "2230": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2" - ] - }, - "2231": { - "op": "bury 9", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "2233": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2234": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#2", - "maybe_exists%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2235": { - "op": "bury 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "maybe_exists%0#0" - ] - }, - "2237": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "2238": { - "op": "bytec_1 // 0x52333023", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023" - ] - }, - "2239": { - "op": "dig 4", - "defined_out": [ - "0x52333023", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023", - "receiver_holding_address#0" - ] - }, - "2241": { - "op": "dup", - "defined_out": [ - "0x52333023", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "receiver_holding_address#0 (copy)", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023", - "receiver_holding_address#0 (copy)", - "receiver_holding_address#0 (copy)" - ] - }, - "2242": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "0x52333023", - "receiver_holding_address#0 (copy)" - ] - }, - "2244": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2245": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "2246": { - "op": "bury 10", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2248": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2249": { - "op": "box_len", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2250": { - "op": "bury 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "2252": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2253": { - "op": "dig 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "sender_holding_address#0 (copy)" - ] - }, - "2255": { - "callsub": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "op": "callsub assert_is_not_account_suspended", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2258": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "receiver_holding_address#0 (copy)" - ] - }, - "2260": { - "callsub": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "op": "callsub assert_is_not_account_suspended", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2263": { - "op": "uncover 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "sender_holding_address#0" - ] - }, - "2265": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "sender_holding_address#0", - "receiver_holding_address#0" - ] - }, - "2267": { - "op": "!=", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%0#1" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "2268": { - "error": "Sender and receiver must be different", - "op": "assert // Sender and receiver must be different", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ] - }, - "2269": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0" - ] - }, - "2271": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0", - "units#0 (copy)" - ] - }, - "2272": { - "error": "Transfer units must be greater than zero", - "op": "assert // Transfer units must be greater than zero", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0" - ] - }, - "2273": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2275": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2276": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0" - ] - }, - "2277": { - "op": "dup", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)" - ] - }, - "2278": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "32" - ] - }, - "2279": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%box_get%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "values%0#0" - ] - }, - "2280": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "values%0#0", - "units#0" - ] - }, - "2282": { - "op": ">=", - "defined_out": [ - "aggregate%box_get%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%2#2", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "tmp%2#2" - ] - }, - "2283": { - "error": "Insufficient sender units to transfer", - "op": "assert // Insufficient sender units to transfer", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0" - ] - }, - "2284": { - "op": "extract 40 8", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%extract%1#0" - ] - }, - "2287": { - "op": "bury 9", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2289": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "2290": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0" - ] - }, - "2291": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0", - "32" - ] - }, - "2292": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%1#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%1#0" - ] - }, - "2293": { - "op": "bz asset_transfer_else_body@9", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2296": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2298": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "2299": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0" - ] - }, - "2300": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%6#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0", - "40" - ] - }, - "2302": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0" - ] - }, - "2303": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "box_prefixed_key%0#3" - ] - }, - "2305": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "2306": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0" - ] - }, - "2307": { - "op": "pushint 40", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0", - "40" - ] - }, - "2309": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "values%1#0" - ] - }, - "2310": { - "op": "==", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#1" - ] - }, - "2311": { - "op": "bz asset_transfer_bool_false@20", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2314": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2316": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%10#0", - "aggregate%box_get%11#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0", - "aggregate%box_get%11#0" - ] - }, - "2317": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0" - ] - }, - "2318": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%10#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0", - "48" - ] - }, - "2320": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0" - ] - }, - "2321": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "box_prefixed_key%0#3" - ] - }, - "2323": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%12#0", - "aggregate%box_get%13#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0", - "aggregate%box_get%13#0" - ] - }, - "2324": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0" - ] - }, - "2325": { - "op": "pushint 48", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0", - "48" - ] - }, - "2327": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0", - "values%3#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "values%3#0" - ] - }, - "2328": { - "op": "==", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#4" - ] - }, - "2329": { - "op": "bz asset_transfer_bool_false@20", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2332": { - "op": "intc_1 // 1", - "defined_out": [ - "aggregate%extract%1#0", - "and_result%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2333": { - "error": "Sender and receiver units are not fungible", - "block": "asset_transfer_bool_merge@21", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Sender and receiver units are not fungible", - "defined_out": [], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2334": { - "block": "asset_transfer_after_if_else@10", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 6", - "defined_out": [ - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2336": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2337": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%16#0", - "aggregate%box_get%17#0", - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0", - "aggregate%box_get%17#0" - ] - }, - "2338": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0" - ] - }, - "2339": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%16#0", - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0", - "40" - ] - }, - "2341": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_unit_value#0" - ] - }, - "2342": { - "op": "bury 5", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2344": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0" - ] - }, - "2347": { - "op": "dig 4", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0" - ] - }, - "2349": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0 (copy)", - "sender_holding_address#0 (copy)" - ] - }, - "2350": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "due_coupons#0", - "sender_holding_address#0 (copy)" - ] - }, - "2352": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "due_coupons#0 (copy)", - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "due_coupons#0", - "sender_holding_address#0 (copy)", - "due_coupons#0 (copy)" - ] - }, - "2354": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "op": "callsub assert_no_pending_coupon_payment", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "due_coupons#0" - ] - }, - "2357": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0" - ] - }, - "2358": { - "op": "dig 3", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "units#0" - ] - }, - "2360": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "units#0 (copy)", - "units#0 (copy)" - ] - }, - "2361": { - "op": "cover 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "due_coupons#0", - "sender_holding_address#0", - "units#0 (copy)" - ] - }, - "2363": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "sender_holding_address#0", - "units#0 (copy)", - "due_coupons#0" - ] - }, - "2365": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.accrued_interest_amount", - "op": "callsub accrued_interest_amount", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "accrued_interest#0" - ] - }, - "2368": { - "op": "bury 7", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0" - ] - }, - "2370": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2372": { - "op": "box_get", - "defined_out": [ - "accrued_interest#0", - "aggregate%box_get%18#0", - "aggregate%box_get%19#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0", - "aggregate%box_get%19#0" - ] - }, - "2373": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0" - ] - }, - "2374": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "accrued_interest#0", - "aggregate%box_get%18#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0", - "32" - ] - }, - "2375": { - "op": "extract_uint64", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0" - ] - }, - "2376": { - "op": "dup2", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "units#0 (copy)", - "values%0#0", - "values%0#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0", - "units#0 (copy)", - "values%0#0 (copy)" - ] - }, - "2377": { - "op": "<=", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "tmp%0#1", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0", - "tmp%0#1" - ] - }, - "2378": { - "error": "Insufficient sender units to transfer", - "op": "assert // Insufficient sender units to transfer", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0" - ] - }, - "2379": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "values%0#0", - "units#0" - ] - }, - "2380": { - "op": "-", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "tmp%1#1" - ] - }, - "2381": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0" - ] - }, - "2382": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2384": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2 (copy)", - "32" - ] - }, - "2385": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "32", - "aggregate%val_as_bytes%0#0" - ] - }, - "2387": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2388": { - "op": "box_get", - "defined_out": [ - "accrued_interest#0", - "aggregate%box_get%22#0", - "aggregate%box_get%23#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0", - "aggregate%box_get%23#0" - ] - }, - "2389": { - "op": "pop", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0" - ] - }, - "2390": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0", - "32" - ] - }, - "2391": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0" - ] - }, - "2392": { - "op": "bnz asset_transfer_after_if_else@16", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2395": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2396": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2397": { - "op": "dig 7", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2" - ] - }, - "2399": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2400": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2402": { - "op": "pushint 40", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "40" - ] - }, - "2404": { - "op": "dig 2", - "defined_out": [ - "40", - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "40", - "aggregate%val_as_bytes%1#0 (copy)" - ] - }, - "2406": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0" - ] - }, - "2407": { - "op": "pushint 48" - }, - "2409": { - "op": "swap", - "defined_out": [ - "48", - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "48", - "aggregate%val_as_bytes%1#0" - ] - }, - "2410": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2411": { - "block": "asset_transfer_after_if_else@16", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 5", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2413": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2414": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%24#0", - "aggregate%box_get%25#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0", - "aggregate%box_get%25#0" - ] - }, - "2415": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0" - ] - }, - "2416": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%24#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0", - "32" - ] - }, - "2417": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0" - ] - }, - "2418": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0", - "units#0" - ] - }, - "2420": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "units#0", - "units#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0", - "units#0 (copy)", - "units#0 (copy)" - ] - }, - "2421": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "values%0#0", - "units#0 (copy)" - ] - }, - "2423": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#6", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "tmp%0#6" - ] - }, - "2424": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2425": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3" - ] - }, - "2427": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "32" - ] - }, - "2428": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "box_prefixed_key%0#3", - "32", - "aggregate%val_as_bytes%2#0" - ] - }, - "2430": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0" - ] - }, - "2431": { - "op": "dig 4", - "defined_out": [ - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "sender_unit_value#0" - ] - }, - "2433": { - "op": "*", - "defined_out": [ - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "2434": { - "op": "dig 5", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#1", - "accrued_interest#0" - ] - }, - "2436": { - "op": "+", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "2437": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2438": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "accrued_interest#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "2439": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "2440": { - "op": "concat", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%8#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%8#0" - ] - }, - "2441": { - "op": "log", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2442": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "1" - ] - }, - "2443": { - "op": "return", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2444": { - "block": "asset_transfer_bool_false@20", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2445": { - "op": "b asset_transfer_bool_merge@21" - }, - "2448": { - "block": "asset_transfer_else_body@9", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 5", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2450": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2451": { - "op": "pushint 40", - "defined_out": [ - "40", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "40" - ] - }, - "2453": { - "op": "dig 10", - "defined_out": [ - "40", - "aggregate%extract%1#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "40", - "aggregate%extract%1#0" - ] - }, - "2455": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2456": { - "op": "dig 7", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#2" - ] - }, - "2458": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%14#0", - "aggregate%box_get%15#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%14#0", - "aggregate%box_get%15#0" - ] - }, - "2459": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%14#0" - ] - }, - "2460": { - "op": "extract 48 8", - "defined_out": [ - "aggregate%extract%1#0", - "aggregate%extract%7#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%extract%7#0" - ] - }, - "2463": { - "op": "pushint 48" - }, - "2465": { - "op": "swap", - "defined_out": [ - "48", - "aggregate%extract%1#0", - "aggregate%extract%7#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "48", - "aggregate%extract%7#0" - ] - }, - "2466": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2467": { - "op": "b asset_transfer_after_if_else@10" - }, - "2470": { - "block": "asset_transfer_bool_false@6", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2471": { - "op": "b asset_transfer_bool_merge@7" - }, - "2474": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.asset_create[routing]", - "params": {}, - "block": "asset_create", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "arranger#0" - ], - "stack_out": [ - "arranger#0" - ] - }, - "2477": { - "op": "dup", - "defined_out": [ - "arranger#0", - "arranger#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "arranger#0 (copy)" - ] - }, - "2478": { - "op": "len", - "defined_out": [ - "arranger#0", - "len%0#0" - ], - "stack_out": [ - "arranger#0", - "len%0#0" - ] - }, - "2479": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "arranger#0", - "len%0#0" - ], - "stack_out": [ - "arranger#0", - "len%0#0", - "32" - ] - }, - "2480": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%0#0" - ], - "stack_out": [ - "arranger#0", - "eq%0#0" - ] - }, - "2481": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "arranger#0" - ] - }, - "2482": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "arranger#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0" - ] - }, - "2485": { - "op": "dup", - "defined_out": [ - "arranger#0", - "metadata#0", - "metadata#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "metadata#0 (copy)" - ] - }, - "2486": { - "op": "len", - "defined_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ] - }, - "2487": { - "op": "dig 1", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)" - ] - }, - "2489": { - "op": "pushint 38", - "defined_out": [ - "38", - "arranger#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "38" - ] - }, - "2491": { - "error": "invalid tuple encoding", - "op": "extract_uint16 // on error: invalid tuple encoding", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2492": { - "op": "dup", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)" - ] - }, - "2493": { - "op": "pushint 40", - "defined_out": [ - "40", - "arranger#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "40" - ] - }, - "2495": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%1#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "eq%1#0" - ] - }, - "2496": { - "error": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "op": "assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2497": { - "op": "dig 2", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "metadata#0 (copy)" - ] - }, - "2499": { - "op": "swap", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0" - ] - }, - "2500": { - "op": "dig 2", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0", - "tuple_len%0#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0", - "tuple_len%0#0 (copy)" - ] - }, - "2502": { - "op": "substring3", - "defined_out": [ - "arranger#0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "substring3%0#0" - ] - }, - "2503": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "arranger#0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "substring3%0#0", - "0" - ] - }, - "2504": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0" - ] - }, - "2505": { - "op": "pushint 42", - "defined_out": [ - "42", - "aggregate%array_length%0#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0", - "42" - ] - }, - "2507": { - "op": "+", - "defined_out": [ - "add%1#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "add%1#0" - ] - }, - "2508": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%2#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "eq%2#0" - ] - }, - "2509": { - "error": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "op": "assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "stack_out": [ - "arranger#0", - "metadata#0" - ] - }, - "2510": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0x52323023", - "arranger#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "0x52323023" - ] - }, - "2512": { - "op": "uncover 2", - "stack_out": [ - "metadata#0", - "0x52323023", - "arranger#0" - ] - }, - "2514": { - "op": "app_global_put", - "stack_out": [ - "metadata#0" - ] - }, - "2515": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "\"metadata\"" - ] - }, - "2517": { - "op": "swap", - "stack_out": [ - "\"metadata\"", - "metadata#0" - ] - }, - "2518": { - "op": "app_global_put", - "stack_out": [] - }, - "2519": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2520": { - "op": "return", - "stack_out": [] - }, - "2521": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.asset_update[routing]", - "params": {}, - "block": "asset_update", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "metadata#0" - ], - "stack_out": [ - "metadata#0" - ] - }, - "2524": { - "op": "dup", - "defined_out": [ - "metadata#0", - "metadata#0 (copy)" - ], - "stack_out": [ - "metadata#0", - "metadata#0 (copy)" - ] - }, - "2525": { - "op": "len", - "defined_out": [ - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0" - ] - }, - "2526": { - "op": "dig 1", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)" - ] - }, - "2528": { - "op": "pushint 38", - "defined_out": [ - "38", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "38" - ] - }, - "2530": { - "error": "invalid tuple encoding", - "op": "extract_uint16 // on error: invalid tuple encoding", - "defined_out": [ - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2531": { - "op": "dup", - "defined_out": [ - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)" - ] - }, - "2532": { - "op": "pushint 40", - "defined_out": [ - "40", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "40" - ] - }, - "2534": { - "op": "==", - "defined_out": [ - "eq%0#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "eq%0#0" - ] - }, - "2535": { - "error": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "op": "assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2536": { - "op": "dig 2", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "metadata#0 (copy)" - ] - }, - "2538": { - "op": "swap", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0" - ] - }, - "2539": { - "op": "dig 2", - "defined_out": [ - "extract_uint16%0#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0", - "tuple_len%0#0 (copy)" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0", - "tuple_len%0#0 (copy)" - ] - }, - "2541": { - "op": "substring3", - "defined_out": [ - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "substring3%0#0" - ] - }, - "2542": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "substring3%0#0", - "0" - ] - }, - "2543": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0" - ] - }, - "2544": { - "op": "pushint 42", - "defined_out": [ - "42", - "aggregate%array_length%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0", - "42" - ] - }, - "2546": { - "op": "+", - "defined_out": [ - "add%1#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "add%1#0" - ] - }, - "2547": { - "op": "==", - "defined_out": [ - "eq%1#0", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "eq%1#0" - ] - }, - "2548": { - "error": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "op": "assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "stack_out": [ - "metadata#0" - ] - }, - "2549": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2552": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "\"metadata\"" - ] - }, - "2554": { - "op": "swap", - "stack_out": [ - "\"metadata\"", - "metadata#0" - ] - }, - "2555": { - "op": "app_global_put", - "stack_out": [] - }, - "2556": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2557": { - "op": "return", - "stack_out": [] - }, - "2558": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.set_secondary_time_events[routing]", - "params": {}, - "block": "set_secondary_time_events", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0" - ] - }, - "2559": { - "op": "txna ApplicationArgs 1" - }, - "2562": { - "op": "dupn 2", - "defined_out": [ - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "2564": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)", - "0" - ] - }, - "2565": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2566": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "2567": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "8" - ] - }, - "2568": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "mul%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "mul%0#0" - ] - }, - "2569": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "mul%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "mul%0#0", - "2" - ] - }, - "2571": { - "op": "+", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0" - ] - }, - "2572": { - "op": "uncover 2", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0", - "secondary_market_time_events#0" - ] - }, - "2574": { - "op": "len", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "len%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0", - "len%0#0" - ] - }, - "2575": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "eq%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "eq%0#0" - ] - }, - "2576": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2577": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2580": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "0" - ] - }, - "2581": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "0", - "\"status\"" - ] - }, - "2582": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_length%0#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2583": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0" - ] - }, - "2584": { - "op": "intc 5 // 200", - "defined_out": [ - "200", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "200" - ] - }, - "2586": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0", - "tmp%0#2" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "tmp%0#2" - ] - }, - "2587": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0", - "tmp%1#1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "tmp%1#1" - ] - }, - "2588": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2589": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2592": { - "op": "dup", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "2593": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2594": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "1" - ] - }, - "2595": { - "op": ">", - "defined_out": [ - "secondary_market_time_events#0", - "tmp%5#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%5#0" - ] - }, - "2596": { - "op": "bz set_secondary_time_events_after_if_else@3", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2599": { - "op": "dup", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0" - ] - }, - "2600": { - "callsub": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "2603": { - "op": "bury 1", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2605": { - "block": "set_secondary_time_events_after_if_else@3", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2606": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"issuance_date\"" - ] - }, - "2608": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2609": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0" - ] - }, - "2610": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ] - }, - "2612": { - "op": "dup", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "2613": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "2616": { - "op": "bury 4", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ] - }, - "2618": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "2" - ] - }, - "2620": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "values%0#0" - ] - }, - "2621": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "maybe_value%0#0" - ] - }, - "2622": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "values%0#0", - "values%0#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "maybe_value%0#0", - "values%0#0 (copy)" - ] - }, - "2624": { - "op": "<=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%6#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "tmp%6#0" - ] - }, - "2625": { - "error": "Invalid secondary market opening date", - "op": "assert // Invalid secondary market opening date", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0" - ] - }, - "2626": { - "op": "bytec 18 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "\"secondary_market_opening_date\"" - ] - }, - "2628": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "\"secondary_market_opening_date\"", - "values%0#0" - ] - }, - "2629": { - "op": "app_global_put", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2630": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2631": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"maturity_date\"" - ] - }, - "2633": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2634": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%1#0" - ] - }, - "2635": { - "op": "bz set_secondary_time_events_after_if_else@5", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2638": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2639": { - "op": "bytec 5 // \"maturity_date\"", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"maturity_date\"" - ] - }, - "2641": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2642": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0" - ] - }, - "2643": { - "op": "dig 1", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ] - }, - "2645": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2646": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%3#0", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_length%3#0" - ] - }, - "2647": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%3#0", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_length%3#0", - "1" - ] - }, - "2648": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "tmp%9#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "tmp%9#0" - ] - }, - "2649": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "tmp%9#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "tmp%9#0", - "8" - ] - }, - "2650": { - "op": "*", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%bytes_offset%1#0" - ] - }, - "2651": { - "op": "dig 3", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0" - ] - }, - "2653": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0" - ] - }, - "2654": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "values%2#0" - ] - }, - "2655": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "maybe_value%2#0" - ] - }, - "2656": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "values%2#0", - "values%2#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "maybe_value%2#0", - "values%2#0 (copy)" - ] - }, - "2658": { - "op": ">=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%10#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "tmp%10#0" - ] - }, - "2659": { - "error": "Invalid secondary market closure date", - "op": "assert // Invalid secondary market closure date", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0" - ] - }, - "2660": { - "op": "bytec 11 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "\"secondary_market_closure_date\"" - ] - }, - "2662": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "\"secondary_market_closure_date\"", - "values%2#0" - ] - }, - "2663": { - "op": "app_global_put", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2664": { - "block": "set_secondary_time_events_after_if_else@5", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2665": { - "op": "bytec 18 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2667": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2668": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0" - ] - }, - "2669": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "0" - ] - }, - "2670": { - "op": "bytec 11 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "maybe_value%3#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2672": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%3#0", - "maybe_value%4#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2673": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_value%4#0" - ] - }, - "2674": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%4#0", - "maybe_value%3#0" - ] - }, - "2675": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%4#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%4#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2676": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%4#0" - ] - }, - "2677": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2678": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%head%1#0" - ] - }, - "2679": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "2680": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "2681": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%2#0" - ] - }, - "2682": { - "op": "log", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2683": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "1" - ] - }, - "2684": { - "op": "return", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2685": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.set_default_status[routing]", - "params": {}, - "block": "set_default_status", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "2688": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "2689": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "2690": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "2691": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "2692": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "2693": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "2694": { - "op": "getbit", - "defined_out": [ - "defaulted#0" - ], - "stack_out": [ - "defaulted#0" - ] - }, - "2695": { - "op": "bytec 20 // 0x52363023", - "defined_out": [ - "0x52363023", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "0x52363023" - ] - }, - "2697": { - "op": "txn Sender", - "defined_out": [ - "0x52363023", - "defaulted#0", - "tmp%0#2" - ], - "stack_out": [ - "defaulted#0", - "0x52363023", - "tmp%0#2" - ] - }, - "2699": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "defaulted#0", - "tmp%1#0" - ], - "stack_out": [ - "defaulted#0", - "tmp%1#0" - ] - }, - "2702": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "defaulted#0" - ] - }, - "2703": { - "op": "bytec 24 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "\"asset_defaulted\"" - ] - }, - "2705": { - "op": "swap", - "stack_out": [ - "\"asset_defaulted\"", - "defaulted#0" - ] - }, - "2706": { - "op": "app_global_put", - "stack_out": [] - }, - "2707": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2709": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2710": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2711": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2712": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "2713": { - "op": "log", - "stack_out": [] - }, - "2714": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "2715": { - "op": "return", - "stack_out": [] - }, - "2716": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.primary_distribution[routing]", - "params": {}, - "block": "primary_distribution", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "2718": { - "op": "txna ApplicationArgs 1" - }, - "2721": { - "op": "dup", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "holding_address#0" - ] - }, - "2722": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "len%0#0" - ] - }, - "2723": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2724": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "eq%0#0" - ] - }, - "2725": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0" - ] - }, - "2726": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "2729": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "2730": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "2731": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "2732": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "2733": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "2734": { - "op": "btoi", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2735": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2736": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"status\"" - ] - }, - "2737": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2738": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2739": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "100" - ] - }, - "2741": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%0#4", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%0#4" - ] - }, - "2742": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2745": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2746": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2748": { - "op": "app_global_get_ex", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2749": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2750": { - "op": "global LatestTimestamp" - }, - "2752": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "2753": { - "op": "bury 5", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0" - ] - }, - "2755": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%1#2", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "2756": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2759": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2760": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2762": { - "op": "app_global_get_ex", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2763": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "2764": { - "op": "dig 3", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "awst_tmp%0#0" - ] - }, - "2766": { - "op": ">", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "2767": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2770": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2771": { - "error": "Primary distribution is closed", - "block": "primary_distribution_bool_merge@6", - "stack_in": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Primary distribution is closed", - "defined_out": [], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2772": { - "op": "bytec 21 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52353023" - ] - }, - "2774": { - "op": "txn Sender", - "defined_out": [ - "0x52353023", - "tmp%0#3" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52353023", - "tmp%0#3" - ] - }, - "2776": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "2779": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2780": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52333023" - ] - }, - "2781": { - "op": "dig 2", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52333023", - "holding_address#0" - ] - }, - "2783": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "2784": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2785": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2786": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2788": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "2789": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2792": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2795": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0" - ] - }, - "2797": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "units#0 (copy)" - ] - }, - "2798": { - "error": "Can not distribute zero units", - "op": "assert // Can not distribute zero units", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0" - ] - }, - "2799": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "0" - ] - }, - "2800": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "0", - "\"circulating_units\"" - ] - }, - "2801": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2802": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0" - ] - }, - "2803": { - "op": "dig 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0", - "units#0 (copy)" - ] - }, - "2805": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2806": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "0" - ] - }, - "2807": { - "op": "bytec 15 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "0", - "\"total_units\"" - ] - }, - "2809": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2810": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0" - ] - }, - "2811": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_value%1#0", - "tmp%1#1", - "tmp%1#1 (copy)", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "tmp%1#1 (copy)" - ] - }, - "2813": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "tmp%2#1" - ] - }, - "2814": { - "error": "Insufficient remaining D-ASA units", - "op": "assert // Insufficient remaining D-ASA units", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2815": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "\"circulating_units\"" - ] - }, - "2816": { - "op": "dig 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "\"circulating_units\"", - "tmp%1#1 (copy)" - ] - }, - "2818": { - "op": "app_global_put", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2819": { - "op": "dig 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2821": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2822": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0" - ] - }, - "2823": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "2824": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "values%0#0" - ] - }, - "2825": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "values%0#0", - "units#0" - ] - }, - "2827": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "tmp%4#1" - ] - }, - "2828": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2829": { - "op": "dig 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2831": { - "op": "intc_2 // 32", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1 (copy)", - "32" - ] - }, - "2832": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "box_prefixed_key%0#1 (copy)", - "32", - "aggregate%val_as_bytes%0#0" - ] - }, - "2834": { - "op": "box_replace", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1" - ] - }, - "2835": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "0" - ] - }, - "2836": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "0", - "\"unit_value\"" - ] - }, - "2838": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%3#0", - "maybe_value%3#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2839": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "maybe_value%3#0" - ] - }, - "2840": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%1#0" - ] - }, - "2841": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1" - ] - }, - "2843": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "40" - ] - }, - "2845": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "box_prefixed_key%0#1", - "40", - "aggregate%val_as_bytes%1#0" - ] - }, - "2847": { - "op": "box_replace", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "2848": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0" - ] - }, - "2849": { - "op": "bytec 15 // \"total_units\"", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0", - "\"total_units\"" - ] - }, - "2851": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%4#0", - "maybe_value%4#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2852": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%4#0" - ] - }, - "2853": { - "op": "swap", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%4#0", - "tmp%1#1" - ] - }, - "2854": { - "op": "-", - "defined_out": [ - "holding_address#0", - "tmp%5#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%5#1" - ] - }, - "2855": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%2#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2856": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%2#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "0x151f7c75" - ] - }, - "2857": { - "op": "swap", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%val_as_bytes%2#0" - ] - }, - "2858": { - "op": "concat", - "defined_out": [ - "holding_address#0", - "tmp%6#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%6#0" - ] - }, - "2859": { - "op": "log", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2860": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "1" - ] - }, - "2861": { - "op": "return", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2862": { - "block": "primary_distribution_bool_false@5", - "stack_in": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2863": { - "op": "b primary_distribution_bool_merge@6" - }, - "2866": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_asset_info[routing]", - "params": {}, - "block": "get_asset_info", - "stack_in": [], - "op": "intc_0 // 0" - }, - "2867": { - "op": "global LatestTimestamp" - }, - "2869": { - "op": "intc_0 // 0" - }, - "2870": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "tmp%0#1", - "0", - "\"maturity_date\"" - ] - }, - "2872": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2873": { - "op": "swap", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2874": { - "op": "dup", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "2875": { - "op": "cover 2", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2877": { - "op": "cover 3", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2879": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%0#1", - "maybe_value%0#0" - ] - }, - "2880": { - "op": ">", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "tmp%1#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%1#1" - ] - }, - "2881": { - "op": "bz get_asset_info_after_if_else@4", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2884": { - "op": "dup", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0" - ] - }, - "2885": { - "op": "bz get_asset_info_after_if_else@4", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2888": { - "op": "pushint 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0" - ] - }, - "2890": { - "op": "bury 2", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2892": { - "block": "get_asset_info_after_if_else@4", - "stack_in": [ - "performance#0", - "maybe_value%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0" - ] - }, - "2893": { - "op": "bytec 24 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0", - "\"asset_defaulted\"" - ] - }, - "2895": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2896": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2897": { - "op": "bz get_asset_info_after_if_else@6", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2900": { - "op": "pushint 3", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0" - ] - }, - "2902": { - "op": "bury 2", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2904": { - "block": "get_asset_info_after_if_else@6", - "stack_in": [ - "performance#0", - "maybe_value%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0" - ] - }, - "2905": { - "op": "bytec 16 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0", - "\"denomination_asset_id\"" - ] - }, - "2907": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2908": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0" - ] - }, - "2909": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "2910": { - "op": "bytec 9 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "2912": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2913": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "2914": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "0" - ] - }, - "2915": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "0", - "\"circulating_units\"" - ] - }, - "2916": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2917": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0" - ] - }, - "2918": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "0" - ] - }, - "2919": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "0", - "\"unit_value\"" - ] - }, - "2921": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2922": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2923": { - "op": "dup2", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "maybe_value%1#0", - "maybe_value%1#0 (copy)", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%0#0 (copy)", - "maybe_value%1#0 (copy)" - ] - }, - "2924": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1" - ] - }, - "2925": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "0" - ] - }, - "2926": { - "op": "bytec 17 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "0", - "\"day_count_convention\"" - ] - }, - "2928": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%5#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%5#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "maybe_value%5#0", - "maybe_exists%5#0" - ] - }, - "2929": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "maybe_value%5#0" - ] - }, - "2930": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2931": { - "op": "dup", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "2932": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%bitlen%0#0" - ] - }, - "2933": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%bitlen%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%bitlen%0#0", - "8" - ] - }, - "2934": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%no_overflow%0#0" - ] - }, - "2935": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2936": { - "op": "extract 7 1", - "defined_out": [ - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0" - ] - }, - "2939": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "0" - ] - }, - "2940": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "0", - "\"principal_discount\"" - ] - }, - "2942": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint8%0#0", - "maybe_exists%6#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%6#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "maybe_value%6#0", - "maybe_exists%6#0" - ] - }, - "2943": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "maybe_value%6#0" - ] - }, - "2944": { - "op": "itob", - "defined_out": [ - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2945": { - "op": "dup", - "defined_out": [ - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)" - ] - }, - "2946": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%bitlen%1#0" - ] - }, - "2947": { - "op": "pushint 16", - "defined_out": [ - "16", - "aggregate%bitlen%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%bitlen%1#0", - "16" - ] - }, - "2949": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%no_overflow%1#0" - ] - }, - "2950": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2951": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0" - ] - }, - "2954": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "0" - ] - }, - "2955": { - "op": "bytec 33 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "0", - "\"interest_rate\"" - ] - }, - "2957": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_exists%7#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%7#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "maybe_value%7#0", - "maybe_exists%7#0" - ] - }, - "2958": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "maybe_value%7#0" - ] - }, - "2959": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2960": { - "op": "dup", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%2#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%2#0 (copy)" - ] - }, - "2961": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%2#0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%bitlen%2#0" - ] - }, - "2962": { - "op": "pushint 16", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%bitlen%2#0", - "16" - ] - }, - "2964": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%2#0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%no_overflow%2#0" - ] - }, - "2965": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2966": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0" - ] - }, - "2969": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "0" - ] - }, - "2970": { - "op": "bytec 15 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "0", - "\"total_units\"" - ] - }, - "2972": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%8#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_exists%8#0" - ] - }, - "2973": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0" - ] - }, - "2974": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "0" - ] - }, - "2975": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2977": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%10#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_exists%10#0" - ] - }, - "2978": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0" - ] - }, - "2979": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "0" - ] - }, - "2980": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2982": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%11#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_exists%11#0" - ] - }, - "2983": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0" - ] - }, - "2984": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "0" - ] - }, - "2985": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "0", - "\"issuance_date\"" - ] - }, - "2987": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%12#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_exists%12#0" - ] - }, - "2988": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0" - ] - }, - "2989": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "0" - ] - }, - "2990": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "0", - "\"maturity_date\"" - ] - }, - "2992": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%13#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_exists%13#0" - ] - }, - "2993": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0" - ] - }, - "2994": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "0" - ] - }, - "2995": { - "op": "bytec 23 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "0", - "\"asset_suspended\"" - ] - }, - "2997": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%14#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_exists%14#0" - ] - }, - "2998": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0" - ] - }, - "2999": { - "op": "dig 15", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ] - }, - "3001": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "3002": { - "op": "dup", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "3003": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%bitlen%3#0" - ] - }, - "3004": { - "op": "intc_3 // 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%bitlen%3#0", - "8" - ] - }, - "3005": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%no_overflow%3#0" - ] - }, - "3006": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "3007": { - "op": "extract 7 1", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0" - ] - }, - "3010": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "maybe_value%2#0" - ] - }, - "3012": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "3013": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "maybe_value%3#0" - ] - }, - "3015": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "aggregate%val_as_bytes%5#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "3016": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0" - ] - }, - "3017": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0", - "tmp%0#1" - ] - }, - "3019": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%6#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%6#0" - ] - }, - "3020": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0" - ] - }, - "3021": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0", - "maybe_value%1#0" - ] - }, - "3023": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%7#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%7#0" - ] - }, - "3024": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%3#0" - ] - }, - "3025": { - "op": "uncover 10", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%3#0", - "aggregate%uint8%0#0" - ] - }, - "3027": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%4#0" - ] - }, - "3028": { - "op": "uncover 9", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%4#0", - "aggregate%uint16%0#0" - ] - }, - "3030": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%uint16%1#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%5#0" - ] - }, - "3031": { - "op": "uncover 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%5#0", - "aggregate%uint16%1#0" - ] - }, - "3033": { - "op": "concat", - "defined_out": [ - "aggregate%head%6#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0" - ] - }, - "3034": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0", - "maybe_value%8#0" - ] - }, - "3036": { - "op": "itob", - "defined_out": [ - "aggregate%head%6#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%8#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "3037": { - "op": "concat", - "defined_out": [ - "aggregate%head%7#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0" - ] - }, - "3038": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0", - "maybe_value%0#0" - ] - }, - "3040": { - "op": "itob", - "defined_out": [ - "aggregate%head%7#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%9#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%9#0" - ] - }, - "3041": { - "op": "concat", - "defined_out": [ - "aggregate%head%8#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0" - ] - }, - "3042": { - "op": "uncover 6", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0", - "maybe_value%10#0" - ] - }, - "3044": { - "op": "itob", - "defined_out": [ - "aggregate%head%8#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%10#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%10#0" - ] - }, - "3045": { - "op": "concat", - "defined_out": [ - "aggregate%head%9#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0" - ] - }, - "3046": { - "op": "uncover 5", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0", - "maybe_value%11#0" - ] - }, - "3048": { - "op": "itob", - "defined_out": [ - "aggregate%head%9#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%11#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%11#0" - ] - }, - "3049": { - "op": "concat", - "defined_out": [ - "aggregate%head%10#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0" - ] - }, - "3050": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0", - "maybe_value%12#0" - ] - }, - "3052": { - "op": "itob", - "defined_out": [ - "aggregate%head%10#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%12#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0", - "aggregate%val_as_bytes%12#0" - ] - }, - "3053": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0" - ] - }, - "3054": { - "op": "uncover 3", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0", - "maybe_value%13#0" - ] - }, - "3056": { - "op": "itob", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%13#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0", - "aggregate%val_as_bytes%13#0" - ] - }, - "3057": { - "op": "concat", - "defined_out": [ - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0" - ] - }, - "3058": { - "op": "bytec 31 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00" - ] - }, - "3060": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00", - "0" - ] - }, - "3061": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00", - "0", - "maybe_value%14#0" - ] - }, - "3063": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "aggregate%encoded_bool%0#0" - ] - }, - "3064": { - "op": "concat", - "defined_out": [ - "aggregate%head%13#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%13#0" - ] - }, - "3065": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%13#0", - "aggregate%uint8%1#0" - ] - }, - "3066": { - "op": "concat", - "defined_out": [ - "aggregate%head%14#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%14#0" - ] - }, - "3067": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%14#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%14#0", - "0x151f7c75" - ] - }, - "3068": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0x151f7c75", - "aggregate%head%14#0" - ] - }, - "3069": { - "op": "concat", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "tmp%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%1#0" - ] - }, - "3070": { - "op": "log", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "3071": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "1" - ] - }, - "3072": { - "op": "return", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "3073": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_time_events[routing]", - "params": {}, - "block": "get_time_events", - "stack_in": [], - "op": "bytec 30 // 0x0000" - }, - "3075": { - "op": "intc_0 // 0" - }, - "3076": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0", - "\"status\"" - ] - }, - "3077": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3078": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "time_events#0", - "maybe_value%0#0" - ] - }, - "3079": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "100" - ] - }, - "3081": { - "op": "==", - "defined_out": [ - "time_events#0", - "tmp%0#2" - ], - "stack_out": [ - "time_events#0", - "tmp%0#2" - ] - }, - "3082": { - "op": "bz get_time_events_after_if_else@3", - "stack_out": [ - "time_events#0" - ] - }, - "3085": { - "op": "bytec 12 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "3087": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%1#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "time_events#0", - "aggregate%box_get%1#0" - ] - }, - "3088": { - "op": "swap", - "stack_out": [ - "time_events#0", - "aggregate%box_get%1#0", - "time_events#0" - ] - }, - "3089": { - "op": "bury 2", - "stack_out": [ - "time_events#0", - "aggregate%box_get%1#0" - ] - }, - "3091": { - "error": "check self.time_events exists", - "op": "assert // check self.time_events exists", - "stack_out": [ - "time_events#0" - ] - }, - "3092": { - "block": "get_time_events_after_if_else@3", - "stack_in": [ - "time_events#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "time_events#0", - "0x151f7c75" - ] - }, - "3093": { - "op": "dig 1", - "defined_out": [ - "0x151f7c75", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0x151f7c75", - "time_events#0" - ] - }, - "3095": { - "op": "concat", - "defined_out": [ - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "time_events#0", - "tmp%1#0" - ] - }, - "3096": { - "op": "log", - "stack_out": [ - "time_events#0" - ] - }, - "3097": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "1" - ] - }, - "3098": { - "op": "return", - "stack_out": [ - "time_events#0" - ] - }, - "3099": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_secondary_market_schedule[routing]", - "params": {}, - "block": "get_secondary_market_schedule", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3100": { - "op": "bytec 18 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "0", - "\"secondary_market_opening_date\"" - ] - }, - "3102": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3103": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3104": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "3105": { - "op": "bytec 11 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "3107": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "3108": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "3109": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "maybe_value%0#0" - ] - }, - "3110": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3111": { - "op": "pushbytes 0x0002", - "defined_out": [ - "0x0002", - "aggregate%val_as_bytes%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%val_as_bytes%0#0", - "0x0002" - ] - }, - "3115": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "0x0002", - "aggregate%val_as_bytes%0#0" - ] - }, - "3116": { - "op": "concat", - "defined_out": [ - "aggregate%head%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%head%0#0" - ] - }, - "3117": { - "op": "swap", - "stack_out": [ - "aggregate%head%0#0", - "maybe_value%1#0" - ] - }, - "3118": { - "op": "itob", - "defined_out": [ - "aggregate%head%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%head%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "3119": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0" - ] - }, - "3120": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "3121": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "3122": { - "op": "concat", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "3123": { - "op": "log", - "stack_out": [] - }, - "3124": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3125": { - "op": "return", - "stack_out": [] - }, - "3126": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_asset_metadata[routing]", - "params": {}, - "block": "get_asset_metadata", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3127": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "0" - ], - "stack_out": [ - "0", - "\"metadata\"" - ] - }, - "3129": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3130": { - "error": "check self.metadata exists", - "op": "assert // check self.metadata exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3131": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "3132": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "3133": { - "op": "concat", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "3134": { - "op": "log", - "stack_out": [] - }, - "3135": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3136": { - "op": "return", - "stack_out": [] - }, - "3137": { - "subroutine": "modules.accounting.AccountingModule.account_gov_suspension[routing]", - "params": {}, - "block": "account_gov_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3140": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3141": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3142": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3143": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3144": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3145": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3148": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "3149": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "3150": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "1" - ] - }, - "3151": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "3152": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3153": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0" - ] - }, - "3154": { - "op": "getbit", - "defined_out": [ - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "3155": { - "op": "bytec 13 // 0x52373023", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023" - ] - }, - "3157": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "3159": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ] - }, - "3162": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "3163": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52333023" - ] - }, - "3164": { - "op": "uncover 2", - "stack_out": [ - "suspended#0", - "0x52333023", - "holding_address#0" - ] - }, - "3166": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "3167": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3168": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3169": { - "op": "bury 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3171": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "3172": { - "op": "dup", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3173": { - "op": "pushint 56", - "defined_out": [ - "56", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56" - ] - }, - "3175": { - "op": "intc_1 // 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56", - "1" - ] - }, - "3176": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0", - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0" - ] - }, - "3177": { - "op": "intc_0 // 0", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0" - ] - }, - "3178": { - "op": "uncover 3", - "stack_out": [ - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0", - "suspended#0" - ] - }, - "3180": { - "op": "setbit", - "defined_out": [ - "aggregate%updated_target%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%updated_target%0#0" - ] - }, - "3181": { - "op": "pushint 56" - }, - "3183": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "56", - "aggregate%updated_target%0#0" - ] - }, - "3184": { - "op": "box_replace", - "stack_out": [] - }, - "3185": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3187": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3188": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3189": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3190": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "3191": { - "op": "log", - "stack_out": [] - }, - "3192": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3193": { - "op": "return", - "stack_out": [] - }, - "3194": { - "subroutine": "modules.accounting.AccountingModule.account_open[routing]", - "params": {}, - "block": "account_open", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3197": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3198": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3199": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3200": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3201": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3202": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3205": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ] - }, - "3206": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0" - ] - }, - "3207": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0", - "32" - ] - }, - "3208": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "eq%1#0" - ] - }, - "3209": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3210": { - "op": "bytec 14 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023" - ] - }, - "3212": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "3214": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "3217": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3218": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0" - ] - }, - "3219": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0", - "\"status\"" - ] - }, - "3220": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3221": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0" - ] - }, - "3222": { - "op": "intc 5 // 200", - "defined_out": [ - "200", - "holding_address#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "200" - ] - }, - "3224": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ] - }, - "3225": { - "op": "!", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "3226": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3227": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3230": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "3233": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52333023" - ] - }, - "3234": { - "op": "uncover 2", - "stack_out": [ - "payment_address#0", - "0x52333023", - "holding_address#0" - ] - }, - "3236": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "3237": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3238": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3239": { - "op": "bury 1", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3241": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "tmp%2#1" - ] - }, - "3242": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "3243": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "0" - ] - }, - "3244": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3245": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0" - ] - }, - "3247": { - "op": "dig 1", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "3249": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0" - ] - }, - "3250": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "3252": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%2#0" - ] - }, - "3253": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3254": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0" - ] - }, - "3255": { - "op": "bytec 31 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0", - "0x00" - ] - }, - "3257": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%4#0" - ] - }, - "3258": { - "op": "box_put", - "stack_out": [] - }, - "3259": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "3261": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0" - ] - }, - "3262": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "3263": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "3264": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "3265": { - "op": "log", - "stack_out": [] - }, - "3266": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3267": { - "op": "return", - "stack_out": [] - }, - "3268": { - "subroutine": "modules.accounting.AccountingModule.account_close[routing]", - "params": {}, - "block": "account_close", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3271": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3272": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3273": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3274": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3275": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3276": { - "op": "bytec 14 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52343023" - ] - }, - "3278": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "3280": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "tmp%1#2" - ] - }, - "3283": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0" - ] - }, - "3284": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3287": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "3288": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "3289": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3290": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3291": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3292": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3294": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3295": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3296": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3297": { - "op": "pop", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "3298": { - "op": "intc_2 // 32", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "3299": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ] - }, - "3300": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "box_prefixed_key%0#1" - ] - }, - "3301": { - "op": "box_del", - "defined_out": [ - "closed_units#0", - "{box_del}" - ], - "stack_out": [ - "closed_units#0", - "{box_del}" - ] - }, - "3302": { - "op": "pop", - "stack_out": [ - "closed_units#0" - ] - }, - "3303": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "0" - ] - }, - "3304": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "0", - "\"circulating_units\"" - ] - }, - "3305": { - "op": "app_global_get_ex", - "defined_out": [ - "closed_units#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3306": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "closed_units#0", - "maybe_value%0#0" - ] - }, - "3307": { - "op": "dig 1", - "defined_out": [ - "closed_units#0", - "closed_units#0 (copy)", - "maybe_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "maybe_value%0#0", - "closed_units#0 (copy)" - ] - }, - "3309": { - "op": "-", - "defined_out": [ - "closed_units#0", - "tmp%0#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%0#1" - ] - }, - "3310": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "closed_units#0", - "tmp%0#1", - "\"circulating_units\"" - ] - }, - "3311": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "\"circulating_units\"", - "tmp%0#1" - ] - }, - "3312": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0" - ] - }, - "3313": { - "callsub": "modules.accounting.AccountingModule.end_if_no_circulating_units", - "op": "callsub end_if_no_circulating_units" - }, - "3316": { - "op": "global LatestTimestamp", - "defined_out": [ - "closed_units#0", - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1" - ] - }, - "3318": { - "op": "swap", - "stack_out": [ - "tmp%1#1", - "closed_units#0" - ] - }, - "3319": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3320": { - "op": "swap", - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "tmp%1#1" - ] - }, - "3321": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "3322": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0" - ] - }, - "3323": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "3324": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "3325": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "3326": { - "op": "log", - "stack_out": [] - }, - "3327": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3328": { - "op": "return", - "stack_out": [] - }, - "3329": { - "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", - "params": {}, - "block": "account_update_payment_address", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3332": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3333": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3334": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3335": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3336": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3337": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3340": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "3341": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "3342": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "32" - ] - }, - "3343": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "3344": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3345": { - "op": "txn Sender", - "defined_out": [ - "holding_address#0", - "tmp%0#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1" - ] - }, - "3347": { - "op": "dig 2", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1", - "holding_address#0 (copy)" - ] - }, - "3349": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%1#1" - ] - }, - "3350": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3351": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3354": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "3357": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0x52333023" - ] - }, - "3358": { - "op": "uncover 2", - "stack_out": [ - "tmp%2#0", - "0x52333023", - "holding_address#0" - ] - }, - "3360": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "3361": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3362": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3363": { - "op": "bury 1", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3365": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "3366": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "0" - ] - }, - "3367": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#1", - "0", - "tmp%2#0" - ] - }, - "3369": { - "op": "box_replace", - "stack_out": [] - }, - "3370": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "3372": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3373": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3374": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3375": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "3376": { - "op": "log", - "stack_out": [] - }, - "3377": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3378": { - "op": "return", - "stack_out": [] - }, - "3379": { - "subroutine": "modules.accounting.AccountingModule.account_get_info[routing]", - "params": {}, - "block": "account_get_info", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3382": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3383": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3384": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3385": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3386": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3387": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "3388": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "3389": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3390": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3391": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3392": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3394": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3395": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3396": { - "op": "pop", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "3397": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "0x151f7c75" - ] - }, - "3398": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ] - }, - "3399": { - "op": "concat", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "3400": { - "op": "log", - "stack_out": [] - }, - "3401": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3402": { - "op": "return", - "stack_out": [] - }, - "3403": { - "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", - "params": {}, - "block": "rbac_rotate_arranger", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0" - ] - }, - "3406": { - "op": "dup", - "defined_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ], - "stack_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ] - }, - "3407": { - "op": "len", - "defined_out": [ - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0" - ] - }, - "3408": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0", - "32" - ] - }, - "3409": { - "op": "==", - "defined_out": [ - "eq%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "eq%0#0" - ] - }, - "3410": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "new_arranger#0" - ] - }, - "3411": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3414": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0x52323023", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "0x52323023" - ] - }, - "3416": { - "op": "swap", - "stack_out": [ - "0x52323023", - "new_arranger#0" - ] - }, - "3417": { - "op": "app_global_put", - "stack_out": [] - }, - "3418": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3420": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3421": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3422": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3423": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3424": { - "op": "log", - "stack_out": [] - }, - "3425": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3426": { - "op": "return", - "stack_out": [] - }, - "3427": { - "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", - "params": {}, - "block": "rbac_set_op_daemon", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "3430": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "3431": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "3432": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "3433": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "3434": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "3435": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3438": { - "op": "bytec 22 // 0x52323523", - "defined_out": [ - "0x52323523", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52323523" - ] - }, - "3440": { - "op": "swap", - "stack_out": [ - "0x52323523", - "address#0" - ] - }, - "3441": { - "op": "app_global_put", - "stack_out": [] - }, - "3442": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3444": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3445": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3446": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3447": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3448": { - "op": "log", - "stack_out": [] - }, - "3449": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3450": { - "op": "return", - "stack_out": [] - }, - "3451": { - "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", - "params": {}, - "block": "rbac_assign_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3454": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3455": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3456": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3457": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3458": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3459": { - "op": "txna ApplicationArgs 2" - }, - "3462": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3463": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3465": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3466": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3467": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3468": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3469": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "3472": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ] - }, - "3473": { - "op": "intc_0 // 0", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)", - "0" - ] - }, - "3474": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0" - ] - }, - "3475": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "3477": { - "op": "+", - "defined_out": [ - "add%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0" - ] - }, - "3478": { - "op": "dig 1", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "tmp%3#0 (copy)" - ] - }, - "3480": { - "op": "len", - "defined_out": [ - "add%0#0", - "len%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "len%2#0" - ] - }, - "3481": { - "op": "==", - "defined_out": [ - "eq%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "eq%2#0" - ] - }, - "3482": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "3483": { - "op": "extract 2 0", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "config#0" - ] - }, - "3486": { - "op": "swap", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#0" - ] - }, - "3487": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3490": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3493": { - "op": "btoi", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3494": { - "op": "dupn 2", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3496": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3499": { - "op": "pushint 20", - "defined_out": [ - "20", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "20" - ] - }, - "3501": { - "op": "==", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%0#2" - ] - }, - "3502": { - "op": "bz rbac_assign_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3505": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0x52323023", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023" - ] - }, - "3507": { - "op": "dig 3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023", - "role_address#0" - ] - }, - "3509": { - "op": "app_global_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3510": { - "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%2#1" - ] - }, - "3512": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3513": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3514": { - "op": "swap", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3515": { - "op": "concat", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#0" - ] - }, - "3516": { - "op": "log", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3517": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "1" - ] - }, - "3518": { - "op": "return", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3519": { - "block": "rbac_assign_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3520": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "3522": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%1#1" - ] - }, - "3523": { - "op": "bz rbac_assign_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3526": { - "op": "bytec 14 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023" - ] - }, - "3528": { - "op": "dig 3", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "3530": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3531": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3532": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3533": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3535": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "tmp%2#2" - ] - }, - "3536": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3537": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "config#0" - ] - }, - "3539": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3540": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3543": { - "block": "rbac_assign_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3544": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "3546": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%3#1" - ] - }, - "3547": { - "op": "bz rbac_assign_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3550": { - "op": "bytec 21 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023" - ] - }, - "3552": { - "op": "dig 3", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "3554": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3555": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "3556": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "3557": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "3559": { - "op": "!", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1", - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "tmp%4#0" - ] - }, - "3560": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3561": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%2#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "config#0" - ] - }, - "3563": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3564": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3567": { - "block": "rbac_assign_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3568": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "3570": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%5#0" - ] - }, - "3571": { - "op": "bz rbac_assign_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3574": { - "op": "bytec 20 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023" - ] - }, - "3576": { - "op": "dig 3", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "3578": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3579": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "3580": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "3581": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "3583": { - "op": "!", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1", - "tmp%6#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "tmp%6#1" - ] - }, - "3584": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3585": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%4#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "config#0" - ] - }, - "3587": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3588": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3591": { - "block": "rbac_assign_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3592": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "3594": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%7#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#1" - ] - }, - "3595": { - "op": "bz rbac_assign_role_after_if_else@11", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3598": { - "op": "bytec 13 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023" - ] - }, - "3600": { - "op": "dig 3", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "3602": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3603": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "3604": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "3605": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "3607": { - "op": "!", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1", - "tmp%8#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "tmp%8#0" - ] - }, - "3608": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3609": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%6#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "config#0" - ] - }, - "3611": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3612": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3615": { - "block": "rbac_assign_role_after_if_else@11", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3616": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "3618": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%9#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%9#0" - ] - }, - "3619": { - "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3622": { - "op": "bytec 32 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023" - ] - }, - "3624": { - "op": "dig 3", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "3626": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3627": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "3628": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "3629": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "3631": { - "op": "!", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1", - "tmp%10#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "tmp%10#0" - ] - }, - "3632": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3633": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%8#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "config#0" - ] - }, - "3635": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3636": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3639": { - "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", - "params": {}, - "block": "rbac_revoke_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3642": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3643": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3644": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3645": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3646": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3647": { - "op": "txna ApplicationArgs 2" - }, - "3650": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3651": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3653": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3654": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3655": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3656": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3657": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3660": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3663": { - "op": "btoi", - "defined_out": [ - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3664": { - "op": "dupn 2", - "defined_out": [ - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3666": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3669": { - "op": "dup", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3670": { - "op": "pushint 20", - "defined_out": [ - "20", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)", - "20" - ] - }, - "3672": { - "op": "!=", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "tmp%0#2" - ] - }, - "3673": { - "error": "Invalid role identifier", - "op": "assert // Invalid role identifier", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3674": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "3676": { - "op": "==", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ] - }, - "3677": { - "op": "bz rbac_revoke_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3680": { - "op": "bytec 14 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023" - ] - }, - "3682": { - "op": "dig 2", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "3684": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3685": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3686": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3687": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3689": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3690": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3691": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3692": { - "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#1" - ] - }, - "3694": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3695": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3696": { - "op": "swap", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3697": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#0" - ] - }, - "3698": { - "op": "log", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3699": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "1" - ] - }, - "3700": { - "op": "return", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3701": { - "block": "rbac_revoke_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3702": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "3704": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#2" - ] - }, - "3705": { - "op": "bz rbac_revoke_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3708": { - "op": "bytec 21 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023" - ] - }, - "3710": { - "op": "dig 2", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "3712": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3713": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "3714": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "3715": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "3717": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3718": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3719": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3720": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3723": { - "block": "rbac_revoke_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3724": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "3726": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%3#0" - ] - }, - "3727": { - "op": "bz rbac_revoke_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3730": { - "op": "bytec 20 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023" - ] - }, - "3732": { - "op": "dig 2", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "3734": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3735": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "3736": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "3737": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "3739": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3740": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3741": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3742": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3745": { - "block": "rbac_revoke_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3746": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "3748": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%4#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%4#1" - ] - }, - "3749": { - "op": "bz rbac_revoke_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3752": { - "op": "bytec 13 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023" - ] - }, - "3754": { - "op": "dig 2", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "3756": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3757": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "3758": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "3759": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "3761": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3762": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3763": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3764": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3767": { - "block": "rbac_revoke_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3768": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "3770": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#1" - ] - }, - "3771": { - "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3774": { - "op": "bytec 32 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023" - ] - }, - "3776": { - "op": "dig 2", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "3778": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3779": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "3780": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "3781": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "3783": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3784": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3785": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3786": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3789": { - "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", - "params": {}, - "block": "rbac_gov_asset_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3792": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "3793": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "3794": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "3795": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "3796": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "3797": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "3798": { - "op": "getbit", - "defined_out": [ - "suspended#0" - ], - "stack_out": [ - "suspended#0" - ] - }, - "3799": { - "op": "bytec 13 // 0x52373023", - "defined_out": [ - "0x52373023", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "0x52373023" - ] - }, - "3801": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "3803": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "suspended#0", - "tmp%1#0" - ] - }, - "3806": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "suspended#0" - ] - }, - "3807": { - "op": "bytec 23 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "\"asset_suspended\"" - ] - }, - "3809": { - "op": "swap", - "stack_out": [ - "\"asset_suspended\"", - "suspended#0" - ] - }, - "3810": { - "op": "app_global_put", - "stack_out": [] - }, - "3811": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3813": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3814": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3815": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3816": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3817": { - "op": "log", - "stack_out": [] - }, - "3818": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3819": { - "op": "return", - "stack_out": [] - }, - "3820": { - "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", - "params": {}, - "block": "rbac_get_arranger", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3821": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0", - "0x52323023" - ], - "stack_out": [ - "0", - "0x52323023" - ] - }, - "3823": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3824": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3825": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "3826": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "3827": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "3828": { - "op": "log", - "stack_out": [] - }, - "3829": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3830": { - "op": "return", - "stack_out": [] - }, - "3831": { - "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", - "params": {}, - "block": "rbac_get_address_roles", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "3834": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "3835": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "3836": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "3837": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "3838": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "3839": { - "op": "bytec 14 // 0x52343023", - "defined_out": [ - "0x52343023", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52343023" - ] - }, - "3841": { - "op": "dig 1", - "stack_out": [ - "address#0", - "0x52343023", - "address#0 (copy)" - ] - }, - "3843": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1" - ] - }, - "3846": { - "op": "bytec 21 // 0x52353023", - "defined_out": [ - "0x52353023", - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023" - ] - }, - "3848": { - "op": "dig 2", - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023", - "address#0 (copy)" - ] - }, - "3850": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ] - }, - "3853": { - "op": "bytec 20 // 0x52363023", - "defined_out": [ - "0x52363023", - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023" - ] - }, - "3855": { - "op": "dig 3", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023", - "address#0 (copy)" - ] - }, - "3857": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ] - }, - "3860": { - "op": "bytec 13 // 0x52373023", - "defined_out": [ - "0x52373023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023" - ] - }, - "3862": { - "op": "dig 4", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023", - "address#0 (copy)" - ] - }, - "3864": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ] - }, - "3867": { - "op": "bytec 32 // 0x52383023", - "defined_out": [ - "0x52383023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023" - ] - }, - "3869": { - "op": "uncover 5", - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023", - "address#0" - ] - }, - "3871": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ] - }, - "3874": { - "op": "bytec 31 // 0x00", - "defined_out": [ - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00" - ] - }, - "3876": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0" - ] - }, - "3877": { - "op": "uncover 6", - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0", - "tmp%0#1" - ] - }, - "3879": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0" - ] - }, - "3880": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1" - ] - }, - "3881": { - "op": "uncover 5", - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1", - "tmp%1#1" - ] - }, - "3883": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0" - ] - }, - "3884": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2" - ] - }, - "3886": { - "op": "uncover 4", - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2", - "tmp%2#1" - ] - }, - "3888": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0" - ] - }, - "3889": { - "op": "pushint 3", - "defined_out": [ - "3", - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0", - "3" - ] - }, - "3891": { - "op": "uncover 3", - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%1#0", - "3", - "tmp%3#1" - ] - }, - "3893": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0" - ] - }, - "3894": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0", - "4" - ] - }, - "3896": { - "op": "uncover 2", - "stack_out": [ - "aggregate%set_bit%2#0", - "4", - "tmp%4#1" - ] - }, - "3898": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0" - ] - }, - "3899": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0", - "0x151f7c75" - ] - }, - "3900": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ] - }, - "3901": { - "op": "concat", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "3902": { - "op": "log", - "stack_out": [] - }, - "3903": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3904": { - "op": "return", - "stack_out": [] - }, - "3905": { - "subroutine": "modules.rbac.RbacModule.rbac_get_role_config[routing]", - "params": {}, - "block": "rbac_get_role_config", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3908": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3909": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3910": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3911": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3912": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3913": { - "op": "txna ApplicationArgs 2" - }, - "3916": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3917": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3919": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3920": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3921": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3922": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3923": { - "op": "btoi", - "defined_out": [ - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "3924": { - "op": "dup", - "defined_out": [ - "role#0", - "role#0 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "role#0 (copy)" - ] - }, - "3925": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "3928": { - "op": "pushints 20 40 50 60 70 80", - "defined_out": [ - "20", - "40", - "50", - "60", - "70", - "80", - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "20", - "40", - "50", - "60", - "70", - "80" - ] - }, - "3936": { - "op": "uncover 6", - "stack_out": [ - "role_address#0", - "20", - "40", - "50", - "60", - "70", - "80", - "role#0" - ] - }, - "3938": { - "op": "match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7", - "stack_out": [ - "role_address#0" - ] - }, - "3952": { - "error": "Invalid role identifier", - "op": "err // Invalid role identifier" - }, - "3953": { - "block": "rbac_get_role_config_switch_case_5@7", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 32 // 0x52383023", - "defined_out": [ - "0x52383023" - ], - "stack_out": [ - "role_address#0", - "0x52383023" - ] - }, - "3955": { - "op": "dig 1", - "defined_out": [ - "0x52383023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52383023", - "role_address#0" - ] - }, - "3957": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3958": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3959": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3960": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3962": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3963": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "3964": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3965": { - "block": "rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9", - "stack_in": [ - "role_address#0", - "tmp%3#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0", - "0x151f7c75" - ] - }, - "3966": { - "op": "swap", - "defined_out": [ - "0x151f7c75", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "0x151f7c75", - "tmp%3#0" - ] - }, - "3967": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "tmp%4#0" - ] - }, - "3968": { - "op": "log", - "stack_out": [ - "role_address#0" - ] - }, - "3969": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "1" - ] - }, - "3970": { - "op": "return", - "stack_out": [ - "role_address#0" - ] - }, - "3971": { - "block": "rbac_get_role_config_switch_case_4@6", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 13 // 0x52373023", - "defined_out": [ - "0x52373023" - ], - "stack_out": [ - "role_address#0", - "0x52373023" - ] - }, - "3973": { - "op": "dig 1", - "defined_out": [ - "0x52373023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52373023", - "role_address#0" - ] - }, - "3975": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3976": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3977": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3978": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3980": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3981": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "3982": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3983": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3986": { - "block": "rbac_get_role_config_switch_case_3@5", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 20 // 0x52363023", - "defined_out": [ - "0x52363023" - ], - "stack_out": [ - "role_address#0", - "0x52363023" - ] - }, - "3988": { - "op": "dig 1", - "defined_out": [ - "0x52363023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52363023", - "role_address#0" - ] - }, - "3990": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3991": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3992": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3993": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3995": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3996": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "3997": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3998": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "4001": { - "block": "rbac_get_role_config_switch_case_2@4", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 21 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "role_address#0", - "0x52353023" - ] - }, - "4003": { - "op": "dig 1", - "defined_out": [ - "0x52353023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52353023", - "role_address#0" - ] - }, - "4005": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "4006": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "4007": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "4008": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "4010": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "4011": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "4012": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "4013": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "4016": { - "block": "rbac_get_role_config_switch_case_1@3", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 14 // 0x52343023", - "defined_out": [ - "0x52343023" - ], - "stack_out": [ - "role_address#0", - "0x52343023" - ] - }, - "4018": { - "op": "dig 1", - "defined_out": [ - "0x52343023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52343023", - "role_address#0" - ] - }, - "4020": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "4021": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "4022": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "4023": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "4025": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "4026": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4027": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "4028": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "4031": { - "block": "rbac_get_role_config_switch_case_0@2", - "stack_in": [ - "role_address#0" - ], - "op": "pushbytes 0x00000000000000000000000000000000", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "4049": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "4052": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons", - "params": {}, - "block": "count_due_coupons", - "stack_in": [], - "op": "proto 0 1" - }, - "4055": { - "op": "pushbytes \"\"", - "stack_out": [ - "coupon_idx#0" - ] - }, - "4057": { - "op": "global LatestTimestamp" - }, - "4059": { - "op": "dup" - }, - "4060": { - "op": "intc_0 // 0" - }, - "4061": { - "op": "bytec 29 // \"due_coupons_watermark\"", - "defined_out": [ - "\"due_coupons_watermark\"", - "0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "current_ts#0", - "0", - "\"due_coupons_watermark\"" - ] - }, - "4063": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "current_ts#0", - "due_coupons#0", - "maybe_exists%0#0" - ] - }, - "4064": { - "op": "swap", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "current_ts#0", - "maybe_exists%0#0", - "due_coupons#0" - ] - }, - "4065": { - "op": "cover 2", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "current_ts#0", - "maybe_exists%0#0" - ] - }, - "4067": { - "error": "check self.due_coupons_watermark exists", - "op": "assert // check self.due_coupons_watermark exists", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "current_ts#0" - ] - }, - "4068": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "current_ts#0", - "0" - ] - }, - "4069": { - "op": "bytec 5 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "current_ts#0", - "due_coupons#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "current_ts#0", - "0", - "\"maturity_date\"" - ] - }, - "4071": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "current_ts#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4072": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "current_ts#0", - "maybe_value%1#0" - ] - }, - "4073": { - "op": ">=", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "tmp%1#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "tmp%1#0" - ] - }, - "4074": { - "op": "bz count_due_coupons_else_body@2", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "4077": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0" - ] - }, - "4078": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0", - "current_ts#0", - "due_coupons#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0", - "\"total_coupons\"" - ] - }, - "4080": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%2#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "due_coupons#0", - "maybe_exists%2#0" - ] - }, - "4081": { - "op": "swap", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_exists%2#0", - "due_coupons#0" - ] - }, - "4082": { - "op": "frame_bury 2", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_exists%2#0" - ] - }, - "4084": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "4085": { - "block": "count_due_coupons_after_if_else@8", - "stack_in": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ], - "op": "bytec 29 // \"due_coupons_watermark\"", - "defined_out": [ - "\"due_coupons_watermark\"" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "\"due_coupons_watermark\"" - ] - }, - "4087": { - "op": "frame_dig 2", - "defined_out": [ - "\"due_coupons_watermark\"", - "due_coupons#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "\"due_coupons_watermark\"", - "due_coupons#0" - ] - }, - "4089": { - "op": "dup", - "defined_out": [ - "\"due_coupons_watermark\"", - "due_coupons#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "\"due_coupons_watermark\"", - "due_coupons#0 (copy)", - "due_coupons#0 (copy)" - ] - }, - "4090": { - "op": "cover 2", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "due_coupons#0", - "\"due_coupons_watermark\"", - "due_coupons#0 (copy)" - ] - }, - "4092": { - "op": "app_global_put", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "due_coupons#0" - ] - }, - "4093": { - "op": "frame_bury 0" - }, - "4095": { - "retsub": true, - "op": "retsub" - }, - "4096": { - "block": "count_due_coupons_else_body@2", - "stack_in": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0" - ] - }, - "4097": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0", - "\"issuance_date\"" - ] - }, - "4099": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "4100": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_value%3#0" - ] - }, - "4101": { - "op": "frame_dig 1", - "defined_out": [ - "current_ts#0", - "maybe_value%3#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_value%3#0", - "current_ts#0" - ] - }, - "4103": { - "op": "<", - "defined_out": [ - "current_ts#0", - "tmp%2#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "tmp%2#0" - ] - }, - "4104": { - "op": "bz count_due_coupons_after_if_else@8", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "4107": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0" - ] - }, - "4108": { - "op": "bytec 29 // \"due_coupons_watermark\"", - "defined_out": [ - "\"due_coupons_watermark\"", - "0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0", - "\"due_coupons_watermark\"" - ] - }, - "4110": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "maybe_exists%4#0", - "maybe_value%4#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "4111": { - "error": "check self.due_coupons_watermark exists", - "op": "assert // check self.due_coupons_watermark exists", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_value%4#0" - ] - }, - "4112": { - "op": "pushint 3", - "defined_out": [ - "3", - "current_ts#0", - "maybe_value%4#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "maybe_value%4#0", - "3" - ] - }, - "4114": { - "op": "+", - "defined_out": [ - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0" - ] - }, - "4115": { - "op": "dup", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0", - "coupon_idx#0" - ] - }, - "4116": { - "op": "frame_bury 0", - "defined_out": [ - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0" - ] - }, - "4118": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0", - "8" - ] - }, - "4119": { - "op": "*", - "defined_out": [ - "box%element_offset%0#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%element_offset%0#0" - ] - }, - "4120": { - "op": "pushint 2", - "defined_out": [ - "2", - "box%element_offset%0#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%element_offset%0#0", - "2" - ] - }, - "4122": { - "op": "+", - "defined_out": [ - "box%offset%0#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%offset%0#0" - ] - }, - "4123": { - "op": "bytec 12 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "box%offset%0#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%offset%0#0", - "0x74696d654576656e7473" - ] - }, - "4125": { - "op": "swap", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0x74696d654576656e7473", - "box%offset%0#0" - ] - }, - "4126": { - "op": "intc_3 // 8", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0x74696d654576656e7473", - "box%offset%0#0", - "8" - ] - }, - "4127": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%box_extract%0#0" - ] - }, - "4128": { - "op": "btoi", - "defined_out": [ - "coupon_due_date#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_due_date#0" - ] - }, - "4129": { - "block": "count_due_coupons_while_top@4", - "stack_in": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_due_date#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_due_date#0", - "current_ts#0" - ] - }, - "4131": { - "op": "<=", - "defined_out": [ - "current_ts#0", - "tmp%4#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "tmp%4#0" - ] - }, - "4132": { - "op": "bz count_due_coupons_after_while@6", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "4135": { - "op": "intc 4 // 255", - "defined_out": [ - "255", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "255" - ] - }, - "4137": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "255", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "255", - "0" - ] - }, - "4138": { - "callsub": "_puya_lib.util.ensure_budget", - "op": "callsub ensure_budget", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "4141": { - "op": "frame_dig 0", - "defined_out": [ - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0" - ] - }, - "4143": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0", - "1" - ] - }, - "4144": { - "op": "+", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0" - ] - }, - "4145": { - "op": "dup", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0", - "coupon_idx#0" - ] - }, - "4146": { - "op": "frame_bury 0", - "defined_out": [ - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0" - ] - }, - "4148": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0", - "8" - ] - }, - "4149": { - "op": "*", - "defined_out": [ - "box%element_offset%1#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%element_offset%1#0" - ] - }, - "4150": { - "op": "pushint 2", - "defined_out": [ - "2", - "box%element_offset%1#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%element_offset%1#0", - "2" - ] - }, - "4152": { - "op": "+", - "defined_out": [ - "box%offset%1#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%offset%1#0" - ] - }, - "4153": { - "op": "bytec 12 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "box%offset%1#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%offset%1#0", - "0x74696d654576656e7473" - ] - }, - "4155": { - "op": "swap", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0x74696d654576656e7473", - "box%offset%1#0" - ] - }, - "4156": { - "op": "intc_3 // 8", - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "0x74696d654576656e7473", - "box%offset%1#0", - "8" - ] - }, - "4157": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%1#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "box%box_extract%1#0" - ] - }, - "4158": { - "op": "btoi", - "defined_out": [ - "coupon_due_date#0", - "coupon_idx#0", - "current_ts#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_due_date#0" - ] - }, - "4159": { - "op": "b count_due_coupons_while_top@4" - }, - "4162": { - "block": "count_due_coupons_after_while@6", - "stack_in": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "coupon_idx#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0" - ] - }, - "4164": { - "op": "pushint 3", - "defined_out": [ - "3", - "coupon_idx#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "coupon_idx#0", - "3" - ] - }, - "4166": { - "op": "-", - "defined_out": [ - "coupon_idx#0", - "due_coupons#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0", - "due_coupons#0" - ] - }, - "4167": { - "op": "frame_bury 2", - "defined_out": [ - "coupon_idx#0", - "due_coupons#0" - ], - "stack_out": [ - "coupon_idx#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "4169": { - "op": "b count_due_coupons_after_if_else@8" - }, - "4172": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_due_date", - "params": { - "coupon#0": "uint64" - }, - "block": "coupon_due_date", - "stack_in": [], - "op": "proto 1 1" - }, - "4175": { - "op": "pushint 3", - "defined_out": [ - "3" - ], - "stack_out": [ - "3" - ] - }, - "4177": { - "op": "frame_dig -1", - "defined_out": [ - "3", - "coupon#0 (copy)" - ], - "stack_out": [ - "3", - "coupon#0 (copy)" - ] - }, - "4179": { - "op": "+", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4180": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "1" - ] - }, - "4181": { - "op": "-", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4182": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0", - "8" - ] - }, - "4183": { - "op": "*", - "defined_out": [ - "box%element_offset%0#0" - ], - "stack_out": [ - "box%element_offset%0#0" - ] - }, - "4184": { - "op": "pushint 2", - "defined_out": [ - "2", - "box%element_offset%0#0" - ], - "stack_out": [ - "box%element_offset%0#0", - "2" - ] - }, - "4186": { - "op": "+", - "defined_out": [ - "box%offset%0#0" - ], - "stack_out": [ - "box%offset%0#0" - ] - }, - "4187": { - "op": "bytec 12 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "box%offset%0#0" - ], - "stack_out": [ - "box%offset%0#0", - "0x74696d654576656e7473" - ] - }, - "4189": { - "op": "swap", - "stack_out": [ - "0x74696d654576656e7473", - "box%offset%0#0" - ] - }, - "4190": { - "op": "intc_3 // 8", - "stack_out": [ - "0x74696d654576656e7473", - "box%offset%0#0", - "8" - ] - }, - "4191": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0" - ], - "stack_out": [ - "box%box_extract%0#0" - ] - }, - "4192": { - "op": "btoi", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4193": { - "retsub": true, - "op": "retsub" - }, - "4194": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.next_coupon_due_date", - "params": { - "due_coupons#0": "uint64" - }, - "block": "next_coupon_due_date", - "stack_in": [], - "op": "proto 1 1" - }, - "4197": { - "op": "intc_0 // 0" - }, - "4198": { - "op": "dup" - }, - "4199": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0", - "coupon_due_date#0" - ], - "stack_out": [ - "coupon_due_date#0", - "0", - "\"total_coupons\"" - ] - }, - "4201": { - "op": "app_global_get_ex", - "defined_out": [ - "coupon_due_date#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "coupon_due_date#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4202": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "coupon_due_date#0", - "maybe_value%0#0" - ] - }, - "4203": { - "op": "frame_dig -1", - "defined_out": [ - "coupon_due_date#0", - "due_coupons#0 (copy)", - "maybe_value%0#0" - ], - "stack_out": [ - "coupon_due_date#0", - "maybe_value%0#0", - "due_coupons#0 (copy)" - ] - }, - "4205": { - "op": ">", - "defined_out": [ - "coupon_due_date#0", - "tmp%0#0" - ], - "stack_out": [ - "coupon_due_date#0", - "tmp%0#0" - ] - }, - "4206": { - "op": "bz next_coupon_due_date_after_if_else@2", - "stack_out": [ - "coupon_due_date#0" - ] - }, - "4209": { - "op": "frame_dig -1", - "stack_out": [ - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "4211": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_due_date#0", - "due_coupons#0 (copy)", - "1" - ] - }, - "4212": { - "op": "+", - "defined_out": [ - "coupon_due_date#0", - "tmp%1#0" - ], - "stack_out": [ - "coupon_due_date#0", - "tmp%1#0" - ] - }, - "4213": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_due_date", - "op": "callsub coupon_due_date", - "stack_out": [ - "coupon_due_date#0", - "coupon_due_date#0" - ] - }, - "4216": { - "op": "frame_bury 0", - "stack_out": [ - "coupon_due_date#0" - ] - }, - "4218": { - "block": "next_coupon_due_date_after_if_else@2", - "stack_in": [ - "coupon_due_date#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "coupon_due_date#0" - ], - "stack_out": [ - "coupon_due_date#0", - "coupon_due_date#0" - ] - }, - "4220": { - "op": "swap" - }, - "4221": { - "retsub": true, - "op": "retsub" - }, - "4222": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_interest_amount", - "params": { - "principal_amount#0": "uint64", - "coupon#0": "uint64" - }, - "block": "coupon_interest_amount", - "stack_in": [], - "op": "proto 2 1" - }, - "4225": { - "op": "frame_dig -1", - "defined_out": [ - "coupon#0 (copy)" - ], - "stack_out": [ - "coupon#0 (copy)" - ] - }, - "4227": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "coupon#0 (copy)" - ], - "stack_out": [ - "coupon#0 (copy)", - "1" - ] - }, - "4228": { - "op": "-", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4229": { - "op": "pushint 2", - "defined_out": [ - "2", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "2" - ] - }, - "4231": { - "op": "*", - "defined_out": [ - "box%element_offset%0#0" - ], - "stack_out": [ - "box%element_offset%0#0" - ] - }, - "4232": { - "op": "pushint 2", - "stack_out": [ - "box%element_offset%0#0", - "2" - ] - }, - "4234": { - "op": "+", - "defined_out": [ - "box%offset%0#0" - ], - "stack_out": [ - "box%offset%0#0" - ] - }, - "4235": { - "op": "bytec 19 // 0x636f75706f6e5261746573", - "defined_out": [ - "0x636f75706f6e5261746573", - "box%offset%0#0" - ], - "stack_out": [ - "box%offset%0#0", - "0x636f75706f6e5261746573" - ] - }, - "4237": { - "op": "swap", - "stack_out": [ - "0x636f75706f6e5261746573", - "box%offset%0#0" - ] - }, - "4238": { - "op": "pushint 2", - "stack_out": [ - "0x636f75706f6e5261746573", - "box%offset%0#0", - "2" - ] - }, - "4240": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0" - ], - "stack_out": [ - "box%box_extract%0#0" - ] - }, - "4241": { - "op": "btoi", - "defined_out": [ - "coupon_rate_bps#0" - ], - "stack_out": [ - "coupon_rate_bps#0" - ] - }, - "4242": { - "op": "frame_dig -2", - "defined_out": [ - "coupon_rate_bps#0", - "principal_amount#0 (copy)" - ], - "stack_out": [ - "coupon_rate_bps#0", - "principal_amount#0 (copy)" - ] - }, - "4244": { - "op": "*", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "4245": { - "op": "pushint 10000", - "defined_out": [ - "10000", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "10000" - ] - }, - "4248": { - "op": "/", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "4249": { - "retsub": true, - "op": "retsub" - }, - "4250": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.day_count_factor", - "params": { - "due_coupons#0": "uint64" - }, - "block": "day_count_factor", - "stack_in": [], - "op": "proto 1 1" - }, - "4253": { - "op": "pushbytes \"\"", - "stack_out": [ - "coupon_accrued_period#0" - ] - }, - "4255": { - "op": "dup", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4256": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "4258": { - "op": "bnz day_count_factor_else_body@2", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4261": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "0" - ] - }, - "4262": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "0", - "\"issuance_date\"" - ] - }, - "4264": { - "op": "app_global_get_ex", - "defined_out": [ - "accruing_start_time#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "maybe_exists%0#0" - ] - }, - "4265": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ] - }, - "4266": { - "block": "day_count_factor_after_if_else@3", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "tmp%2#0" - ] - }, - "4268": { - "op": "dig 1", - "defined_out": [ - "accruing_start_time#0", - "accruing_start_time#0 (copy)", - "tmp%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "tmp%2#0", - "accruing_start_time#0 (copy)" - ] - }, - "4270": { - "op": "-", - "defined_out": [ - "accruing_start_time#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "coupon_accrued_period#0" - ] - }, - "4271": { - "op": "frame_bury 0", - "defined_out": [ - "accruing_start_time#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ] - }, - "4273": { - "op": "frame_dig -1", - "defined_out": [ - "accruing_start_time#0", - "coupon_accrued_period#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "due_coupons#0 (copy)" - ] - }, - "4275": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.next_coupon_due_date", - "op": "callsub next_coupon_due_date", - "defined_out": [ - "accruing_start_time#0", - "coupon_accrued_period#0", - "tmp%4#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "tmp%4#0" - ] - }, - "4278": { - "op": "swap", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "tmp%4#0", - "accruing_start_time#0" - ] - }, - "4279": { - "op": "-", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "4280": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "0" - ] - }, - "4281": { - "op": "bytec 17 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "0", - "\"day_count_convention\"" - ] - }, - "4283": { - "op": "app_global_get_ex", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4284": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "maybe_value%1#0" - ] - }, - "4285": { - "op": "bnz day_count_factor_after_if_else@5", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "4288": { - "op": "frame_dig 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0" - ] - }, - "4290": { - "op": "intc 6 // 86400", - "defined_out": [ - "86400", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0", - "86400" - ] - }, - "4292": { - "op": "/", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0" - ] - }, - "4293": { - "op": "frame_bury 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "4295": { - "op": "intc 6 // 86400", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "86400" - ] - }, - "4297": { - "op": "/", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "4298": { - "block": "day_count_factor_after_if_else@5", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0" - ] - }, - "4300": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "4301": { - "op": "swap", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "aggregate%val_as_bytes%0#0", - "coupon_period#0" - ] - }, - "4302": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "4303": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "aggregate%head%1#0" - ] - }, - "4304": { - "op": "frame_bury 0" - }, - "4306": { - "retsub": true, - "op": "retsub" - }, - "4307": { - "block": "day_count_factor_else_body@2", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "coupon_due_date#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_due_date#0" - ] - }, - "4308": { - "op": "frame_bury 1", - "defined_out": [ - "coupon_due_date#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4310": { - "op": "frame_dig -1", - "defined_out": [ - "coupon_due_date#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "4312": { - "op": "bz day_count_factor_after_if_else@8", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4315": { - "op": "frame_dig -1", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "4317": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_due_date", - "op": "callsub coupon_due_date", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_due_date#0" - ] - }, - "4320": { - "op": "frame_bury 1", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4322": { - "block": "day_count_factor_after_if_else@8", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "accruing_start_time#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ] - }, - "4324": { - "op": "b day_count_factor_after_if_else@3" - }, - "4327": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.is_accruing_interest", - "params": { - "due_coupons#0": "uint64" - }, - "block": "is_accruing_interest", - "stack_in": [], - "op": "proto 1 1" - }, - "4330": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4331": { - "op": "bytec 4 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "0", - "\"issuance_date\"" - ] - }, - "4333": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4334": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4335": { - "op": "bz is_accruing_interest_bool_false@4", - "stack_out": [] - }, - "4338": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4340": { - "op": "intc_0 // 0", - "stack_out": [ - "tmp%1#0", - "0" - ] - }, - "4341": { - "op": "bytec 4 // \"issuance_date\"", - "stack_out": [ - "tmp%1#0", - "0", - "\"issuance_date\"" - ] - }, - "4343": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4344": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "tmp%1#0", - "maybe_value%1#0" - ] - }, - "4345": { - "op": ">=", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "4346": { - "op": "bz is_accruing_interest_bool_false@4", - "stack_out": [] - }, - "4349": { - "op": "intc_0 // 0", - "stack_out": [ - "0" - ] - }, - "4350": { - "op": "bytec 7 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0" - ], - "stack_out": [ - "0", - "\"total_coupons\"" - ] - }, - "4352": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0" - ], - "stack_out": [ - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "4353": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "maybe_value%2#0" - ] - }, - "4354": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "maybe_value%2#0" - ], - "stack_out": [ - "maybe_value%2#0", - "due_coupons#0 (copy)" - ] - }, - "4356": { - "op": ">", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "4357": { - "op": "bz is_accruing_interest_bool_false@4", - "stack_out": [] - }, - "4360": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "and_result%0#0" - ] - }, - "4361": { - "retsub": true, - "op": "retsub" - }, - "4362": { - "block": "is_accruing_interest_bool_false@4", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "and_result%0#0" - ] - }, - "4363": { - "retsub": true, - "op": "retsub" - }, - "4364": { - "subroutine": "modules.core_financial.coupon.FixedCouponCashflowMixin.accrued_interest_amount", - "params": { - "holding_address#0": "bytes", - "units#0": "uint64", - "due_coupons#0": "uint64" - }, - "block": "accrued_interest_amount", - "stack_in": [], - "op": "proto 3 1" - }, - "4367": { - "op": "frame_dig -3", - "defined_out": [ - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0 (copy)" - ] - }, - "4369": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0 (copy)", - "due_coupons#0 (copy)" - ] - }, - "4371": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "op": "callsub assert_no_pending_coupon_payment", - "stack_out": [] - }, - "4374": { - "op": "frame_dig -1", - "stack_out": [ - "due_coupons#0 (copy)" - ] - }, - "4376": { - "callsub": "modules.core_financial.coupon.FixedCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "day_count_factor#0" - ], - "stack_out": [ - "day_count_factor#0" - ] - }, - "4379": { - "op": "dup", - "defined_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)" - ], - "stack_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "4380": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ], - "stack_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "4381": { - "op": "extract_uint64", - "defined_out": [ - "coupon_accrued_period#0", - "day_count_factor#0" - ], - "stack_out": [ - "day_count_factor#0", - "coupon_accrued_period#0" - ] - }, - "4382": { - "op": "swap", - "stack_out": [ - "coupon_accrued_period#0", - "day_count_factor#0" - ] - }, - "4383": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "coupon_accrued_period#0", - "day_count_factor#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "day_count_factor#0", - "8" - ] - }, - "4384": { - "op": "extract_uint64", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0" - ] - }, - "4385": { - "op": "frame_dig -1", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "due_coupons#0 (copy)" - ] - }, - "4387": { - "op": "pushint 2", - "defined_out": [ - "2", - "coupon_accrued_period#0", - "coupon_period#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "due_coupons#0 (copy)", - "2" - ] - }, - "4389": { - "op": "*", - "defined_out": [ - "box%element_offset%0#0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "box%element_offset%0#0" - ] - }, - "4390": { - "op": "pushint 2", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "box%element_offset%0#0", - "2" - ] - }, - "4392": { - "op": "+", - "defined_out": [ - "box%offset%0#0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "box%offset%0#0" - ] - }, - "4393": { - "op": "bytec 19 // 0x636f75706f6e5261746573", - "defined_out": [ - "0x636f75706f6e5261746573", - "box%offset%0#0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "box%offset%0#0", - "0x636f75706f6e5261746573" - ] - }, - "4395": { - "op": "swap", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "0x636f75706f6e5261746573", - "box%offset%0#0" - ] - }, - "4396": { - "op": "pushint 2", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "0x636f75706f6e5261746573", - "box%offset%0#0", - "2" - ] - }, - "4398": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "box%box_extract%0#0" - ] - }, - "4399": { - "op": "btoi", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "next_coupon_rate_bps#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "next_coupon_rate_bps#0" - ] - }, - "4400": { - "op": "frame_dig -3", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "next_coupon_rate_bps#0", - "holding_address#0 (copy)" - ] - }, - "4402": { - "op": "frame_dig -2", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "holding_address#0 (copy)", - "next_coupon_rate_bps#0", - "units#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "next_coupon_rate_bps#0", - "holding_address#0 (copy)", - "units#0 (copy)" - ] - }, - "4404": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "next_coupon_rate_bps#0", - "tmp%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "next_coupon_rate_bps#0", - "tmp%2#0" - ] - }, - "4407": { - "op": "*", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%3#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%3#0" - ] - }, - "4408": { - "op": "uncover 2", - "stack_out": [ - "coupon_period#0", - "tmp%3#0", - "coupon_accrued_period#0" - ] - }, - "4410": { - "op": "*", - "defined_out": [ - "coupon_period#0", - "tmp%4#0" - ], - "stack_out": [ - "coupon_period#0", - "tmp%4#0" - ] - }, - "4411": { - "op": "pushint 10000", - "defined_out": [ - "10000", - "coupon_period#0", - "tmp%4#0" - ], - "stack_out": [ - "coupon_period#0", - "tmp%4#0", - "10000" - ] - }, - "4414": { - "op": "uncover 2", - "stack_out": [ - "tmp%4#0", - "10000", - "coupon_period#0" - ] - }, - "4416": { - "op": "*", - "defined_out": [ - "tmp%4#0", - "tmp%5#0" - ], - "stack_out": [ - "tmp%4#0", - "tmp%5#0" - ] - }, - "4417": { - "op": "/", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "4418": { - "retsub": true, - "op": "retsub" - }, - "4419": { - "subroutine": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "params": { - "due_coupons#0": "uint64" - }, - "block": "all_due_coupons_paid", - "stack_in": [], - "op": "proto 1 1" - }, - "4422": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4423": { - "op": "bytec 28 // \"paid_coupon_units\"", - "defined_out": [ - "\"paid_coupon_units\"", - "0" - ], - "stack_out": [ - "0", - "\"paid_coupon_units\"" - ] - }, - "4425": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4426": { - "error": "check self.paid_coupon_units exists", - "op": "assert // check self.paid_coupon_units exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4427": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "4428": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"circulating_units\"" - ] - }, - "4429": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4430": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "4431": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "due_coupons#0 (copy)" - ] - }, - "4433": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "tmp%0#0" - ] - }, - "4434": { - "op": ">=", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4435": { - "retsub": true, - "op": "retsub" - }, - "4436": { - "subroutine": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "params": { - "holding_address#0": "bytes", - "due_coupons#0": "uint64" - }, - "block": "assert_no_pending_coupon_payment", - "stack_in": [], - "op": "proto 2 0" - }, - "4439": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4440": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4442": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4443": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4444": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4445": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "48" - ] - }, - "4447": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4448": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "values%0#0", - "due_coupons#0 (copy)" - ] - }, - "4450": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4451": { - "error": "Pending due coupon payment", - "op": "assert // Pending due coupon payment", - "stack_out": [] - }, - "4452": { - "retsub": true, - "op": "retsub" - }, - "4453": { - "subroutine": "modules.payment_agent.common.PaymentAgentCommonMixin.assert_payment_authorization", - "params": { - "holding_address#0": "bytes" - }, - "block": "assert_payment_authorization", - "stack_in": [], - "op": "proto 1 0" - }, - "4456": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4457": { - "op": "bytec 22 // 0x52323523", - "defined_out": [ - "0", - "0x52323523" - ], - "stack_out": [ - "0", - "0x52323523" - ] - }, - "4459": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4460": { - "error": "check self.op_daemon exists", - "op": "assert // check self.op_daemon exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4461": { - "op": "global ZeroAddress", - "defined_out": [ - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "tmp%0#0" - ] - }, - "4463": { - "op": "!=", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4464": { - "op": "bz assert_payment_authorization_after_if_else@7", - "stack_out": [] - }, - "4467": { - "op": "txn Sender", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "4469": { - "op": "intc_0 // 0", - "stack_out": [ - "tmp%2#0", - "0" - ] - }, - "4470": { - "op": "bytec 22 // 0x52323523", - "stack_out": [ - "tmp%2#0", - "0", - "0x52323523" - ] - }, - "4472": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4473": { - "error": "check self.op_daemon exists", - "op": "assert // check self.op_daemon exists", - "stack_out": [ - "tmp%2#0", - "maybe_value%1#0" - ] - }, - "4474": { - "op": "==", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "4475": { - "op": "bnz assert_payment_authorization_bool_true@4", - "stack_out": [] - }, - "4478": { - "op": "txn Sender", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "4480": { - "op": "frame_dig -1", - "defined_out": [ - "holding_address#0 (copy)", - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0", - "holding_address#0 (copy)" - ] - }, - "4482": { - "op": "==", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "4483": { - "op": "bnz assert_payment_authorization_bool_true@4", - "stack_out": [] - }, - "4486": { - "op": "txn Sender", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "4488": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0", - "0x52333023" - ] - }, - "4489": { - "op": "frame_dig -1", - "stack_out": [ - "tmp%6#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4491": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0", - "box_prefixed_key%0#0" - ] - }, - "4492": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4493": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "tmp%6#0", - "aggregate%box_get%0#0" - ] - }, - "4494": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%0#0", - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0", - "aggregate%extract%0#0" - ] - }, - "4497": { - "op": "==", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "4498": { - "op": "bz assert_payment_authorization_bool_false@5", - "stack_out": [] - }, - "4501": { - "block": "assert_payment_authorization_bool_true@4", - "stack_in": [], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4502": { - "error": "Not authorized", - "block": "assert_payment_authorization_bool_merge@6", - "stack_in": [ - "or_result%0#0" - ], - "op": "assert // Not authorized", - "defined_out": [], - "stack_out": [] - }, - "4503": { - "block": "assert_payment_authorization_after_if_else@7", - "stack_in": [], - "retsub": true, - "op": "retsub" - }, - "4504": { - "block": "assert_payment_authorization_bool_false@5", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4505": { - "op": "b assert_payment_authorization_bool_merge@6" - }, - "4508": { - "subroutine": "modules.payment_agent.common.PaymentAgentCommonMixin.is_payment_executable", - "params": { - "holding_address#0": "bytes" - }, - "block": "is_payment_executable", - "stack_in": [], - "op": "proto 1 1" - }, - "4511": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4512": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4514": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4515": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0" - ] - }, - "4516": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4517": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%box_get%0#0" - ] - }, - "4518": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%extract%0#0" - ] - }, - "4521": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%extract%0#0", - "0" - ] - }, - "4522": { - "op": "bytec 9 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "aggregate%extract%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%extract%0#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "4524": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%extract%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%extract%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4525": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%extract%0#0", - "maybe_value%0#0" - ] - }, - "4526": { - "op": "asset_holding_get AssetBalance", - "defined_out": [ - "box_prefixed_key%0#0", - "tmp%0#0", - "tmp%1#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "tmp%0#0", - "tmp%1#0" - ] - }, - "4528": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#0", - "tmp%1#0" - ] - }, - "4530": { - "op": "bz is_payment_executable_bool_false@3", - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4533": { - "op": "frame_dig 0", - "stack_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0" - ] - }, - "4535": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "4536": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%box_get%2#0" - ] - }, - "4537": { - "op": "pushint 448", - "defined_out": [ - "448", - "aggregate%box_get%2#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%box_get%2#0", - "448" - ] - }, - "4540": { - "op": "getbit", - "defined_out": [ - "aggregate%get_bit%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%get_bit%0#0" - ] - }, - "4541": { - "op": "bnz is_payment_executable_bool_false@3", - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4544": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "and_result%0#0" - ] - }, - "4545": { - "block": "is_payment_executable_bool_merge@4", - "stack_in": [ - "box_prefixed_key%0#0", - "and_result%0#0" - ], - "op": "swap", - "defined_out": [ - "and_result%0#0" - ] - }, - "4546": { - "retsub": true, - "op": "retsub" - }, - "4547": { - "block": "is_payment_executable_bool_false@3", - "stack_in": [ - "box_prefixed_key%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "and_result%0#0" - ] - }, - "4548": { - "op": "b is_payment_executable_bool_merge@4" - }, - "4551": { - "subroutine": "modules.payment_agent.common.PaymentAgentCommonMixin.assert_enough_funds", - "params": { - "payment_amount#0": "uint64" - }, - "block": "assert_enough_funds", - "stack_in": [], - "op": "proto 1 0" - }, - "4554": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4556": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "4557": { - "op": "bytec 9 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "4559": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4560": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0" - ] - }, - "4561": { - "op": "asset_holding_get AssetBalance", - "defined_out": [ - "check%0#0", - "value%0#0" - ], - "stack_out": [ - "value%0#0", - "check%0#0" - ] - }, - "4563": { - "error": "account opted into asset", - "op": "assert // account opted into asset", - "stack_out": [ - "value%0#0" - ] - }, - "4564": { - "op": "frame_dig -1", - "defined_out": [ - "payment_amount#0 (copy)", - "value%0#0" - ], - "stack_out": [ - "value%0#0", - "payment_amount#0 (copy)" - ] - }, - "4566": { - "op": ">=", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4567": { - "error": "Not enough funds for the payment", - "op": "assert // Not enough funds for the payment", - "stack_out": [] - }, - "4568": { - "retsub": true, - "op": "retsub" - }, - "4569": { - "subroutine": "modules.payment_agent.common.PaymentAgentCommonMixin.pay", - "params": { - "receiver#0": "bytes", - "amount#0": "uint64" - }, - "block": "pay", - "stack_in": [], - "op": "proto 2 0" - }, - "4572": { - "op": "itxn_begin" - }, - "4573": { - "op": "global MinTxnFee", - "defined_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "4575": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "0" - ] - }, - "4576": { - "op": "bytec 9 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "4578": { - "op": "app_global_get_ex", - "defined_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4579": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ] - }, - "4580": { - "op": "frame_dig -1", - "defined_out": [ - "amount#0 (copy)", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "amount#0 (copy)" - ] - }, - "4582": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ] - }, - "4584": { - "op": "frame_dig -2", - "defined_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "receiver#0 (copy)" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "receiver#0 (copy)" - ] - }, - "4586": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ] - }, - "4588": { - "op": "itxn_field XferAsset", - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "4590": { - "op": "pushint 4 // axfer", - "defined_out": [ - "axfer", - "inner_txn_params%0%%param_Fee_idx_0#0" - ], - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "4592": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "4594": { - "op": "itxn_field Fee", - "stack_out": [] - }, - "4596": { - "op": "itxn_submit" - }, - "4597": { - "retsub": true, - "op": "retsub" - }, - "4598": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "params": { - "time_events#0": "bytes" - }, - "block": "assert_time_events_sorted", - "stack_in": [], - "op": "proto 1 1" - }, - "4601": { - "op": "pushbytes \"\"", - "stack_out": [ - "time_f#0" - ] - }, - "4603": { - "op": "dupn 2", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0" - ] - }, - "4605": { - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "time_events#0 (copy)" - ] - }, - "4607": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0" - ] - }, - "4610": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "4612": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "2" - ] - }, - "4614": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "values%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "values%0#0" - ] - }, - "4615": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%0#0", - "values%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "values%0#0", - "tmp%0#0" - ] - }, - "4617": { - "op": ">", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ] - }, - "4618": { - "error": "Time events must be set in the future", - "op": "assert // Time events must be set in the future", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0" - ] - }, - "4619": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "4621": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "0" - ] - }, - "4622": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%0#0" - ] - }, - "4623": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%0#0", - "1" - ] - }, - "4624": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0" - ] - }, - "4625": { - "op": "intc_0 // 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4626": { - "block": "assert_time_events_sorted_for_header@1", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "4628": { - "op": "frame_dig 4", - "defined_out": [ - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "tmp%3#0" - ] - }, - "4630": { - "op": "<", - "defined_out": [ - "continue_looping%0#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "continue_looping%0#0" - ] - }, - "4631": { - "op": "bz assert_time_events_sorted_after_for@6", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4634": { - "op": "pushint 65", - "defined_out": [ - "65", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "65" - ] - }, - "4636": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "65", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "65", - "1" - ] - }, - "4637": { - "callsub": "_puya_lib.util.ensure_budget", - "op": "callsub ensure_budget", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4640": { - "op": "frame_dig 5", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "4642": { - "op": "dup", - "defined_out": [ - "idx#0", - "idx#0 (copy)", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "idx#0 (copy)" - ] - }, - "4643": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "idx#0", - "idx#0 (copy)", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "idx#0 (copy)", - "8" - ] - }, - "4644": { - "op": "*", - "defined_out": [ - "aggregate%bytes_offset%1#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0" - ] - }, - "4645": { - "op": "frame_dig 3", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0" - ] - }, - "4647": { - "op": "dup", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%bytes_offset%1#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%array_trimmed%0#0 (copy)" - ] - }, - "4648": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0 (copy)" - ] - }, - "4650": { - "op": "swap", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%bytes_offset%1#0" - ] - }, - "4651": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ] - }, - "4652": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "time_i#0 (copy)" - ] - }, - "4653": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ] - }, - "4655": { - "op": "frame_bury 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0" - ] - }, - "4657": { - "op": "intc_1 // 1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "1" - ] - }, - "4658": { - "op": "+", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0" - ] - }, - "4659": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0", - "tmp%4#0" - ] - }, - "4660": { - "op": "frame_bury 2", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0" - ] - }, - "4662": { - "op": "intc_3 // 8", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0", - "8" - ] - }, - "4663": { - "op": "*", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%2#0", - "idx#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%2#0" - ] - }, - "4664": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0" - ] - }, - "4665": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0", - "time_f#0" - ] - }, - "4666": { - "op": "frame_bury 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0" - ] - }, - "4668": { - "op": "<", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0", - "tmp%5#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%5#0" - ] - }, - "4669": { - "error": "Time events must be sorted in strictly ascending order", - "op": "assert // Time events must be sorted in strictly ascending order", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4670": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0" - ] - }, - "4671": { - "op": "bytec 17 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0", - "\"day_count_convention\"" - ] - }, - "4673": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4674": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0" - ] - }, - "4675": { - "op": "intc 4 // 255", - "defined_out": [ - "255", - "aggregate%array_trimmed%0#0", - "idx#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0", - "255" - ] - }, - "4677": { - "op": "!=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0", - "tmp%6#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%6#0" - ] - }, - "4678": { - "op": "bz assert_time_events_sorted_after_if_else@4", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4681": { - "op": "frame_dig 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_f#0" - ] - }, - "4683": { - "op": "frame_dig 1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_f#0", - "time_i#0" - ] - }, - "4685": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0", - "tmp%7#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%7#0" - ] - }, - "4686": { - "op": "intc 6 // 86400", - "defined_out": [ - "86400", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0", - "tmp%7#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%7#0", - "86400" - ] - }, - "4688": { - "op": "%", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0", - "tmp%8#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%8#0" - ] - }, - "4689": { - "op": "!", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%3#0", - "tmp%4#0", - "tmp%9#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%9#0" - ] - }, - "4690": { - "error": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "op": "assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4691": { - "block": "assert_time_events_sorted_after_if_else@4", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 2", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "4693": { - "op": "frame_bury 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4695": { - "op": "b assert_time_events_sorted_for_header@1" - }, - "4698": { - "block": "assert_time_events_sorted_after_for@6", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_events#0 (copy)" - ] - }, - "4700": { - "op": "frame_bury 0" - }, - "4702": { - "retsub": true, - "op": "retsub" - }, - "4703": { - "subroutine": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "params": { - "holding_address#0": "bytes" - }, - "block": "assert_is_not_account_suspended", - "stack_in": [], - "op": "proto 1 0" - }, - "4706": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4707": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4709": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4710": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4711": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4712": { - "op": "pushint 448", - "defined_out": [ - "448", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "448" - ] - }, - "4715": { - "op": "getbit", - "defined_out": [ - "aggregate%get_bit%0#0" - ], - "stack_out": [ - "aggregate%get_bit%0#0" - ] - }, - "4716": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4717": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "4718": { - "retsub": true, - "op": "retsub" - }, - "4719": { - "subroutine": "modules.accounting.AccountingModule.account_units_value", - "params": { - "holding_address#0": "bytes", - "units#0": "uint64" - }, - "block": "account_units_value", - "stack_in": [], - "op": "proto 2 1" - }, - "4722": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4723": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4725": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4726": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4727": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4728": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "40" - ] - }, - "4730": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4731": { - "op": "frame_dig -1", - "defined_out": [ - "units#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "values%0#0", - "units#0 (copy)" - ] - }, - "4733": { - "op": "*", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4734": { - "retsub": true, - "op": "retsub" - }, - "4735": { - "subroutine": "modules.accounting.AccountingModule.account_total_units_value", - "params": { - "holding_address#0": "bytes" - }, - "block": "account_total_units_value", - "stack_in": [], - "op": "proto 1 1" - }, - "4738": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4739": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4741": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4742": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4743": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4744": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "32" - ] - }, - "4745": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4746": { - "op": "frame_dig -1", - "stack_out": [ - "values%0#0", - "holding_address#0 (copy)" - ] - }, - "4748": { - "op": "swap", - "stack_out": [ - "holding_address#0 (copy)", - "values%0#0" - ] - }, - "4749": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4752": { - "retsub": true, - "op": "retsub" - }, - "4753": { - "subroutine": "modules.accounting.AccountingModule.end_if_no_circulating_units", - "params": {}, - "block": "end_if_no_circulating_units", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4754": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0" - ], - "stack_out": [ - "0", - "\"circulating_units\"" - ] - }, - "4755": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4756": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4757": { - "op": "bnz end_if_no_circulating_units_after_if_else@2", - "stack_out": [] - }, - "4760": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "\"status\"" - ] - }, - "4761": { - "op": "intc 5 // 200", - "defined_out": [ - "\"status\"", - "200" - ], - "stack_out": [ - "\"status\"", - "200" - ] - }, - "4763": { - "op": "app_global_put", - "stack_out": [] - }, - "4764": { - "block": "end_if_no_circulating_units_after_if_else@2", - "stack_in": [], - "retsub": true, - "op": "retsub" - }, - "4765": { - "subroutine": "modules.rbac.RbacModule._role_is_active", - "params": { - "role_map#0": "bytes", - "role_address#0": "bytes" - }, - "block": "_role_is_active", - "stack_in": [], - "op": "proto 2 1" - }, - "4768": { - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "4770": { - "op": "frame_dig -2", - "defined_out": [ - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)" - ] - }, - "4772": { - "op": "frame_dig -1", - "defined_out": [ - "role_address#0 (copy)", - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)", - "role_address#0 (copy)" - ] - }, - "4774": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4775": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "4776": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "4777": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "4779": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4782": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "4784": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4785": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "4786": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "0" - ] - }, - "4787": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ] - }, - "4788": { - "op": "global LatestTimestamp" - }, - "4790": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "4791": { - "op": "frame_bury 0", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0" - ] - }, - "4793": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ] - }, - "4794": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4797": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "4799": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "4800": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0" - ] - }, - "4801": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%box_get%2#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "8" - ] - }, - "4802": { - "op": "extract_uint64", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ] - }, - "4803": { - "op": "frame_dig 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0", - "awst_tmp%0#0" - ] - }, - "4805": { - "op": ">=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ] - }, - "4806": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4809": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "4810": { - "block": "_role_is_active_bool_merge@5", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ], - "op": "frame_bury 0", - "defined_out": [ - "and_result%0#0" - ] - }, - "4812": { - "retsub": true, - "op": "retsub" - }, - "4813": { - "block": "_role_is_active_bool_false@4", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "4814": { - "op": "b _role_is_active_bool_merge@5" - }, - "4817": { - "subroutine": "modules.rbac.RbacModule.assert_caller_is_arranger", - "params": {}, - "block": "assert_caller_is_arranger", - "stack_in": [], - "op": "txn Sender", - "defined_out": [ - "role_address#0" - ], - "stack_out": [ - "role_address#0" - ] - }, - "4819": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0" - ] - }, - "4820": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0", - "0x52323023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0", - "0x52323023" - ] - }, - "4822": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4823": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "role_address#0", - "maybe_value%0#0" - ] - }, - "4824": { - "op": "==", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "4825": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [] - }, - "4826": { - "retsub": true, - "op": "retsub" - }, - "4827": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "params": {}, - "block": "assert_is_not_asset_defaulted", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4828": { - "op": "bytec 24 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_defaulted\"" - ] - }, - "4830": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4831": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4832": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4833": { - "error": "Defaulted", - "op": "assert // Defaulted", - "stack_out": [] - }, - "4834": { - "retsub": true, - "op": "retsub" - }, - "4835": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "params": {}, - "block": "assert_is_not_asset_suspended", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4836": { - "op": "bytec 23 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_suspended\"" - ] - }, - "4838": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4839": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4840": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4841": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "4842": { - "retsub": true, - "op": "retsub" - }, - "4843": { - "subroutine": "modules.rbac.RbacModule._assert_valid_role", - "params": { - "role_id#0": "uint64" - }, - "block": "_assert_valid_role", - "stack_in": [], - "op": "proto 1 0" - }, - "4846": { - "op": "frame_dig -1", - "defined_out": [ - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4848": { - "op": "pushint 20", - "defined_out": [ - "20", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "20" - ] - }, - "4850": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4851": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4854": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4856": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "40" - ] - }, - "4858": { - "op": "==", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4859": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4862": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4864": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "50" - ] - }, - "4866": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "4867": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4870": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4872": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "60" - ] - }, - "4874": { - "op": "==", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "4875": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4878": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4880": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "70" - ] - }, - "4882": { - "op": "==", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "4883": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4886": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4888": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "80" - ] - }, - "4890": { - "op": "==", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "4891": { - "op": "bz _assert_valid_role_bool_false@7", - "stack_out": [] - }, - "4894": { - "block": "_assert_valid_role_bool_true@6", - "stack_in": [], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4895": { - "error": "Invalid role identifier", - "block": "_assert_valid_role_bool_merge@8", - "stack_in": [ - "or_result%0#0" - ], - "op": "assert // Invalid role identifier", - "defined_out": [], - "stack_out": [] - }, - "4896": { - "retsub": true, - "op": "retsub" - }, - "4897": { - "block": "_assert_valid_role_bool_false@7", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4898": { - "op": "b _assert_valid_role_bool_merge@8" - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.teal b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.teal deleted file mode 100644 index b9ec56e3..00000000 --- a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.teal +++ /dev/null @@ -1,4980 +0,0 @@ -#pragma version 12 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.approval_program() -> uint64: -main: - intcblock 0 1 32 8 255 200 86400 - bytecblock 0x151f7c75 0x52333023 "status" "circulating_units" "issuance_date" "maturity_date" "unit_value" "total_coupons" 0x52323023 "settlement_asset_id" "primary_distribution_opening_date" "secondary_market_closure_date" 0x74696d654576656e7473 0x52373023 0x52343023 "total_units" "denomination_asset_id" "day_count_convention" "secondary_market_opening_date" 0x636f75706f6e5261746573 0x52363023 0x52353023 0x52323523 "asset_suspended" "asset_defaulted" "metadata" "principal_discount" "primary_distribution_closure_date" "paid_coupon_units" "due_coupons_watermark" 0x0000 0x00 0x52383023 "interest_rate" 0x068101 0x003b 0x8c29904e 0x0012 - txn ApplicationID - bnz main_after_if_else@2 - // modules/rbac.py:30-31 - // # RBAC Roles - // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec 8 // 0x52323023 - global ZeroAddress - app_global_put - // modules/rbac.py:32 - // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 22 // 0x52323523 - global ZeroAddress - app_global_put - // modules/rbac.py:47-48 - // # D-ASA Governance - // self.asset_suspended = False - bytec 23 // "asset_suspended" - intc_0 // 0 - app_global_put - // modules/rbac.py:49 - // self.asset_defaulted = False - bytec 24 // "asset_defaulted" - intc_0 // 0 - app_global_put - // modules/accounting.py:19 - // self.total_units = UInt64() - bytec 15 // "total_units" - intc_0 // 0 - app_global_put - // modules/accounting.py:20 - // self.circulating_units = UInt64() - bytec_3 // "circulating_units" - intc_0 // 0 - app_global_put - // modules/accounting.py:21 - // self.unit_value = UInt64() - bytec 6 // "unit_value" - intc_0 // 0 - app_global_put - // modules/accounting.py:22 - // self.status = UInt64(enm.STATUS_INACTIVE) - bytec_2 // "status" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:31-32 - // # Asset Configuration - // self.denomination_asset_id = Asset() - bytec 16 // "denomination_asset_id" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:33 - // self.settlement_asset_id = Asset() - bytec 9 // "settlement_asset_id" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:34 - // self.unit_value = UInt64() - bytec 6 // "unit_value" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:35 - // self.day_count_convention = UInt64() - bytec 17 // "day_count_convention" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:37-38 - // # Metadata - // self.metadata = Bytes() - bytec 25 // "metadata" - pushbytes 0x - app_global_put - // modules/core_financial/common.py:40-41 - // # Principal / Rates - // self.principal_discount = UInt64() - bytec 26 // "principal_discount" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:42 - // self.interest_rate = UInt64() - bytec 33 // "interest_rate" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:43 - // self.total_coupons = UInt64() - bytec 7 // "total_coupons" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:47 - // self.primary_distribution_opening_date = UInt64() - bytec 10 // "primary_distribution_opening_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:48 - // self.primary_distribution_closure_date = UInt64() - bytec 27 // "primary_distribution_closure_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:49 - // self.issuance_date = UInt64() - bytec 4 // "issuance_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:50 - // self.secondary_market_opening_date = UInt64() - bytec 18 // "secondary_market_opening_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:51 - // self.secondary_market_closure_date = UInt64() - bytec 11 // "secondary_market_closure_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:52 - // self.maturity_date = UInt64() - bytec 5 // "maturity_date" - intc_0 // 0 - app_global_put - // modules/core_financial/coupon.py:24 - // self.paid_coupon_units = UInt64() - bytec 28 // "paid_coupon_units" - intc_0 // 0 - app_global_put - // modules/core_financial/coupon.py:102 - // self.due_coupons_watermark = UInt64() - bytec 29 // "due_coupons_watermark" - intc_0 // 0 - app_global_put - // smart_contracts/fixed_coupon_bond/contract.py:33 - // assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES - txn GlobalNumByteSlice - pushint 3 - == - assert // Wrong Global Bytes allocation - // smart_contracts/fixed_coupon_bond/contract.py:34 - // assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS - txn GlobalNumUint - pushint 20 - == - assert // Wrong Global UInts allocation - // smart_contracts/fixed_coupon_bond/contract.py:35 - // assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES - txn LocalNumByteSlice - ! - assert // Wrong Local Bytes allocation - // smart_contracts/fixed_coupon_bond/contract.py:36 - // assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS - txn LocalNumUint - ! - assert // Wrong Local UInts allocation - -main_after_if_else@2: - // smart_contracts/fixed_coupon_bond/contract.py:17-30 - // class FixedCouponBond( - // PAMCoreMixin, - // FixedCouponCashflowMixin, - // CouponPaymentAgentMixin, - // PrincipalPaymentAgentMixin, - // CouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - pushbytes 0x25dba95b // method "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - txna ApplicationArgs 0 - match main_asset_update_route@4 - -main_switch_case_next@5: - // smart_contracts/fixed_coupon_bond/contract.py:17-30 - // class FixedCouponBond( - // PAMCoreMixin, - // FixedCouponCashflowMixin, - // CouponPaymentAgentMixin, - // PrincipalPaymentAgentMixin, - // CouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - txn OnCompletion - ! - assert - txn ApplicationID - bz main_create_NoOp@36 - pushbytess 0x89474134 0x44363d49 0x53bef045 0x67db4f20 0xf6a96c8d 0x8cf14b51 0x9c76b6a3 0x4fd6a3cc 0x1d6fc255 0x25e9997f 0x6c85e3ee 0x402dba47 0xfad2173e 0x08efea35 0xe4a5ab54 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", method "get_coupon_rates()uint16[]", method "get_payment_amount(address)(uint64,uint64)", method "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", method "pay_coupon(address,byte[])(uint64,uint64,byte[])", method "pay_principal(address,byte[])(uint64,uint64,byte[])", method "asset_transfer(address,address,uint64)uint64", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "set_default_status(bool)uint64", method "primary_distribution(address,uint64)uint64", method "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", method "account_gov_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_close(address)(uint64,uint64)", method "account_update_payment_address(address,address)uint64", method "account_get_info(address)(address,uint64,uint64,uint64,bool)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,byte[])uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_config(uint8,address)(uint64,uint64)" - txna ApplicationArgs 0 - match asset_config get_account_units_current_value get_coupon_rates get_payment_amount get_coupons_status pay_coupon pay_principal asset_transfer set_secondary_time_events set_default_status primary_distribution get_asset_info get_time_events get_secondary_market_schedule get_asset_metadata account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config - err - -main_create_NoOp@36: - // smart_contracts/fixed_coupon_bond/contract.py:17-30 - // class FixedCouponBond( - // PAMCoreMixin, - // FixedCouponCashflowMixin, - // CouponPaymentAgentMixin, - // PrincipalPaymentAgentMixin, - // CouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - pushbytes 0x3f0efc6c // method "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - txna ApplicationArgs 0 - match asset_create - err - -main_asset_update_route@4: - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txn OnCompletion - pushint 4 // UpdateApplication - == - txn ApplicationID - && - assert - b asset_update - - -// _puya_lib.util.ensure_budget(required_budget: uint64, fee_source: uint64) -> void: -ensure_budget: - proto 2 0 - frame_dig -2 - pushint 10 - + - -ensure_budget_while_top@1: - frame_dig 0 - global OpcodeBudget - > - bz ensure_budget_after_while@6 - itxn_begin - pushint 6 // appl - itxn_field TypeEnum - pushint 5 // DeleteApplication - itxn_field OnCompletion - bytec 34 // 0x068101 - itxn_field ApprovalProgram - bytec 34 // 0x068101 - itxn_field ClearStateProgram - frame_dig -1 - switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4 - -ensure_budget_switch_case_next@5: - itxn_submit - b ensure_budget_while_top@1 - -ensure_budget_switch_case_1@4: - global MinTxnFee - itxn_field Fee - b ensure_budget_switch_case_next@5 - -ensure_budget_switch_case_0@3: - intc_0 // 0 - itxn_field Fee - b ensure_budget_switch_case_next@5 - -ensure_budget_after_while@6: - retsub - - -// modules.actus.pam.PAMCoreMixin.asset_config[routing]() -> void: -asset_config: - pushbytes "" - // modules/actus/pam.py:26 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 3 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 4 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 5 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 6 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 7 - dup - cover 7 - len - pushint 2 - == - assert // invalid number of bytes for arc4.uint16 - txna ApplicationArgs 8 - dup - cover 7 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - pushint 2 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array - txna ApplicationArgs 9 - dup - cover 7 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - intc_3 // 8 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array - txna ApplicationArgs 10 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - pushint 16 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array> - // modules/core_financial/common.py:227 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/core_financial/common.py:228 - // assert self.status == enums.STATUS_INACTIVE, err.ALREADY_CONFIGURED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - ! - assert // D-ASA already configured - // modules/core_financial/common.py:55-56 - // # The reference implementation has on-chain denomination with ASA - // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) - dig 5 - asset_params_get AssetCreator - bury 1 - // modules/core_financial/common.py:57 - // assert exists, err.INVALID_DENOMINATION - assert // Denomination asset is not properly set - // modules/core_financial/common.py:60 - // self.denomination_asset_id = denomination_asset_id - bytec 16 // "denomination_asset_id" - dig 6 - app_global_put - // modules/core_financial/common.py:65 - // settlement_asset_id == self.denomination_asset_id - dig 4 - uncover 6 - == - // modules/core_financial/common.py:63-66 - // # The reference implementation settlement asset is the denomination asset - // assert ( - // settlement_asset_id == self.denomination_asset_id - // ), err.INVALID_SETTLEMENT_ASSET - assert // Different settlement asset not supported, must be equal to denomination asset - // modules/core_financial/common.py:69 - // self.settlement_asset_id = settlement_asset_id - bytec 9 // "settlement_asset_id" - dig 5 - app_global_put - // modules/core_financial/common.py:70-76 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // modules/core_financial/common.py:75 - // fee=Global.min_txn_fee, - global MinTxnFee - // modules/core_financial/common.py:73 - // asset_receiver=Global.current_application_address, - global CurrentApplicationAddress - // modules/core_financial/common.py:74 - // asset_amount=0, - intc_0 // 0 - itxn_field AssetAmount - itxn_field AssetReceiver - uncover 5 - itxn_field XferAsset - // modules/core_financial/common.py:70-71 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - pushint 4 // axfer - itxn_field TypeEnum - itxn_field Fee - // modules/core_financial/common.py:70-76 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - // modules/core_financial/common.py:238-239 - // # Set Principal and Minimum Denomination - // assert principal % minimum_denomination == 0, err.INVALID_MINIMUM_DENOMINATION - dig 3 - dig 2 - % - ! - assert // Minimum denomination is not a divisor of principal - // modules/core_financial/common.py:240 - // self.unit_value = minimum_denomination - bytec 6 // "unit_value" - dig 2 - app_global_put - // modules/core_financial/common.py:241 - // self.total_units = principal // minimum_denomination - uncover 3 - uncover 2 - / - bytec 15 // "total_units" - swap - app_global_put - // modules/core_financial/common.py:242 - // self.principal_discount = principal_discount - bytec 26 // "principal_discount" - uncover 2 - app_global_put - // modules/core_financial/common.py:244-245 - // # Set Day-Count Convention - // self.assert_day_count_convention(day_count_convention.as_uint64()) - btoi - dup - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - bz asset_config_bool_true@3 - dup - // modules/core_financial/common.py:82 - // UInt64(cst.DCC_CONT), - intc 4 // 255 - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - == - bz asset_config_bool_false@4 - -asset_config_bool_true@3: - intc_1 // 1 - -asset_config_bool_merge@5: - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - assert // Invalid day-count convention ID - // modules/core_financial/common.py:86 - // self.day_count_convention = day_count_convention - bytec 17 // "day_count_convention" - dig 1 - app_global_put - // modules/core_financial/common.py:248-249 - // # Set Interest Rate - // self.assert_interest_rate(interest_rate.as_uint64()) - dig 6 - btoi - bury 8 - // modules/core_financial/common.py:89-90 - // # This subroutine must be used after the principal discount has been set - // if not self.principal_discount: - intc_0 // 0 - bytec 26 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - bnz asset_config_after_if_else@7 - // modules/core_financial/common.py:91 - // assert interest_rate > UInt64(0), err.INVALID_INTEREST_RATE - dig 7 - assert // Interest rate is not properly defined - -asset_config_after_if_else@7: - // modules/core_financial/common.py:94 - // self.interest_rate = interest_rate - bytec 33 // "interest_rate" - dig 8 - app_global_put - // modules/core_financial/coupon.py:105 - // assert coupon_rates.length, err.INVALID_COUPON_RATES - dig 4 - dup - assert // Coupon rates are not properly defined - // modules/core_financial/coupon.py:108 - // self.total_coupons = coupon_rates.length - bytec 7 // "total_coupons" - dig 1 - app_global_put - // modules/core_financial/coupon.py:109 - // self.coupon_rates.value = coupon_rates.copy() - bytec 19 // 0x636f75706f6e5261746573 - box_del - pop - bytec 19 // 0x636f75706f6e5261746573 - dig 7 - box_put - // modules/core_financial/common.py:104 - // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS - pushint 4 - + - dig 3 - == - // modules/core_financial/common.py:103-105 - // assert ( - // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS - // ), err.INVALID_TIME_EVENTS_LENGTH - assert // Time events length is invalid - // modules/core_financial/common.py:258 - // self.assert_time_events_sorted(time_events) - dig 3 - callsub assert_time_events_sorted - // modules/core_financial/common.py:127 - // self.time_events.value = time_events.copy() - bytec 12 // 0x74696d654576656e7473 - box_del - pop - bytec 12 // 0x74696d654576656e7473 - dig 1 - box_put - // modules/core_financial/common.py:128-130 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ] - dup - extract 2 0 - dig 1 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:128 - // self.primary_distribution_opening_date = time_events[ - bytec 10 // "primary_distribution_opening_date" - // modules/core_financial/common.py:128-130 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:131-133 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ] - dig 1 - pushint 10 - extract_uint64 - // modules/core_financial/common.py:131 - // self.primary_distribution_closure_date = time_events[ - bytec 27 // "primary_distribution_closure_date" - // modules/core_financial/common.py:131-133 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:134 - // self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX] - dig 1 - pushint 18 - extract_uint64 - bytec 4 // "issuance_date" - swap - app_global_put - // modules/core_financial/common.py:135 - // self.maturity_date = time_events[cfg.MATURITY_DATE_IDX] - swap - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_3 // 8 - * - extract_uint64 - bytec 5 // "maturity_date" - swap - app_global_put - // modules/core_financial/common.py:138 - // assert not time_periods.length, err.INVALID_TIME_PERIODS - dig 1 - ! - assert // Time periods are not properly defined - // modules/core_financial/common.py:265 - // self.status = UInt64(enums.STATUS_ACTIVE) - bytec_2 // "status" - pushint 100 - app_global_put - // modules/actus/pam.py:26 - // @arc4.abimethod - intc_1 // 1 - return - -asset_config_bool_false@4: - intc_0 // 0 - b asset_config_bool_merge@5 - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.get_account_units_current_value[routing]() -> void: -get_account_units_current_value: - intc_0 // 0 - pushbytes "" - dupn 4 - // modules/core_financial/coupon.py:201 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/core_financial/coupon.py:222 - // self.primary_distribution_opening_date - intc_0 // 0 - bytec 10 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/coupon.py:222-223 - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - bz get_account_units_current_value_bool_false@4 - // modules/core_financial/coupon.py:223 - // and Global.latest_timestamp >= self.primary_distribution_opening_date - global LatestTimestamp - intc_0 // 0 - bytec 10 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - >= - // modules/core_financial/coupon.py:222-223 - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - bz get_account_units_current_value_bool_false@4 - intc_1 // 1 - -get_account_units_current_value_bool_merge@5: - // modules/core_financial/coupon.py:221-224 - // assert ( - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - // ), err.NO_PRIMARY_DISTRIBUTION - assert // Primary distribution not yet executed - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 2 - concat - dup - bury 9 - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/coupon.py:226 - // assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - dup - bz get_account_units_current_value_bool_false@8 - dig 7 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dig 1 - >= - bz get_account_units_current_value_bool_false@8 - intc_1 // 1 - -get_account_units_current_value_bool_merge@9: - // modules/core_financial/coupon.py:226 - // assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - assert // Invalid amount of units for the account - // modules/core_financial/coupon.py:228-229 - // # Value during primary distribution and at maturity - // account_units_nominal_value = self.account_units_value(holding_address, units) - dig 1 - dup - dig 2 - callsub account_units_value - bury 8 - // modules/core_financial/coupon.py:230-231 - // # Accruing interest during primary distribution and at maturity - // accrued_interest = UInt64() - intc_0 // 0 - bury 7 - // modules/core_financial/coupon.py:232 - // numerator = UInt64() - intc_0 // 0 - bury 4 - // modules/core_financial/coupon.py:233 - // denominator = UInt64() - intc_0 // 0 - bury 6 - // modules/core_financial/coupon.py:235-236 - // # Accruing interest - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - dup - bury 6 - // modules/core_financial/coupon.py:237 - // self.assert_no_pending_coupon_payment(holding_address, due_coupons) - swap - dig 1 - callsub assert_no_pending_coupon_payment - // modules/core_financial/coupon.py:238 - // if self.is_accruing_interest(due_coupons): - callsub is_accruing_interest - bz get_account_units_current_value_after_if_else@11 - // modules/core_financial/coupon.py:239 - // day_count_factor = self.day_count_factor(due_coupons) - dig 3 - dup - callsub day_count_factor - // modules/core_financial/coupon.py:240-242 - // accrued_interest = self.accrued_interest_amount( - // holding_address, units, due_coupons - // ) - dig 3 - dig 3 - uncover 3 - callsub accrued_interest_amount - bury 7 - // modules/core_financial/coupon.py:243 - // numerator = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - bury 4 - // modules/core_financial/coupon.py:244 - // denominator = day_count_factor.denominator - intc_3 // 8 - extract_uint64 - bury 5 - -get_account_units_current_value_after_if_else@11: - // modules/core_financial/coupon.py:249-252 - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - dig 2 - itob - dig 5 - itob - concat - // modules/core_financial/coupon.py:246-253 - // return typ.CurrentUnitsValue( - // units_value=account_units_nominal_value, - // accrued_interest=accrued_interest, - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - // ) - dig 7 - itob - dig 7 - itob - concat - swap - concat - // modules/core_financial/coupon.py:201 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -get_account_units_current_value_bool_false@8: - intc_0 // 0 - b get_account_units_current_value_bool_merge@9 - -get_account_units_current_value_bool_false@4: - intc_0 // 0 - b get_account_units_current_value_bool_merge@5 - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.get_coupon_rates[routing]() -> void: -get_coupon_rates: - // modules/core_financial/coupon.py:263 - // coupon_rates = typ.CouponRates() - bytec 30 // 0x0000 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/coupon.py:264 - // if self.status_is_active(): - bz get_coupon_rates_after_if_else@3 - // modules/core_financial/coupon.py:265 - // coupon_rates = self.coupon_rates.value.copy() - bytec 19 // 0x636f75706f6e5261746573 - box_get - swap - bury 2 - assert // check self.coupon_rates exists - -get_coupon_rates_after_if_else@3: - // modules/core_financial/coupon.py:255 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - dig 1 - concat - log - intc_1 // 1 - return - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.get_payment_amount[routing]() -> void: -get_payment_amount: - pushbytes "" - // modules/core_financial/coupon.py:268 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dupn 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/coupon.py:283 - // interest_amount = UInt64() - intc_0 // 0 - // modules/core_financial/coupon.py:284 - // principal_amount = UInt64() - dupn 2 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/coupon.py:285 - // if self.status_is_active(): - bz get_payment_amount_after_if_else@6 - // modules/core_financial/coupon.py:286 - // paid_coupons = self.account[holding_address].paid_coupons - dig 2 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - dup - bury 6 - // modules/core_financial/coupon.py:287 - // if paid_coupons < self.total_coupons: - intc_0 // 0 - bytec 7 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - < - bz get_payment_amount_else_body@4 - // modules/core_financial/coupon.py:290 - // self.account_total_units_value(holding_address), - dig 3 - callsub account_total_units_value - // modules/core_financial/coupon.py:291 - // paid_coupons + 1, - dig 5 - intc_1 // 1 - + - // modules/core_financial/coupon.py:288-292 - // # Coupon Payment - // interest_amount = self.coupon_interest_amount( - // self.account_total_units_value(holding_address), - // paid_coupons + 1, - // ) - callsub coupon_interest_amount - bury 2 - -get_payment_amount_after_if_else@6: - // modules/core_financial/coupon.py:296-299 - // return typ.PaymentAmounts( - // interest=interest_amount, - // principal=principal_amount, - // ) - dig 1 - itob - dig 1 - itob - concat - // modules/core_financial/coupon.py:268 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -get_payment_amount_else_body@4: - // modules/core_financial/coupon.py:294-295 - // # Principal Payment - // principal_amount = self.account_total_units_value(holding_address) - dig 3 - callsub account_total_units_value - bury 1 - b get_payment_amount_after_if_else@6 - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.get_coupons_status[routing]() -> void: -get_coupons_status: - // modules/core_financial/coupon.py:310 - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - dupn 2 - // modules/core_financial/coupon.py:311 - // next_coupon_due_date = self.next_coupon_due_date(due_coupons) - callsub next_coupon_due_date - swap - // modules/core_financial/coupon.py:312 - // all_due_coupons_paid = self.all_due_coupons_paid(due_coupons) - dup - callsub all_due_coupons_paid - swap - // modules/core_financial/coupon.py:313 - // numerator = UInt64() - intc_0 // 0 - swap - // modules/core_financial/coupon.py:314 - // denominator = UInt64() - intc_0 // 0 - swap - // modules/core_financial/coupon.py:315 - // if self.is_accruing_interest(due_coupons): - callsub is_accruing_interest - bz get_coupons_status_after_if_else@3 - // modules/core_financial/coupon.py:316 - // day_count_factor = self.day_count_factor(due_coupons) - dig 4 - callsub day_count_factor - // modules/core_financial/coupon.py:317 - // numerator = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - bury 3 - // modules/core_financial/coupon.py:318 - // denominator = day_count_factor.denominator - intc_3 // 8 - extract_uint64 - bury 1 - -get_coupons_status_after_if_else@3: - // modules/core_financial/coupon.py:320 - // total_coupons=self.total_coupons, - intc_0 // 0 - bytec 7 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - // modules/core_financial/coupon.py:323-326 - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - dig 2 - itob - dig 2 - itob - concat - // modules/core_financial/coupon.py:319-328 - // return typ.CouponsInfo( - // total_coupons=self.total_coupons, - // due_coupons=due_coupons, - // next_coupon_due_date=next_coupon_due_date, - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - // all_due_coupons_paid=all_due_coupons_paid, - // ) - swap - itob - dig 6 - itob - concat - dig 5 - itob - concat - swap - concat - bytec 31 // 0x00 - intc_0 // 0 - dig 5 - setbit - concat - // modules/core_financial/coupon.py:301 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.payment_agent.coupon.CouponPaymentAgentMixin.pay_coupon[routing]() -> void: -pay_coupon: - // modules/payment_agent/coupon.py:30 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/coupon.py:39 - // assert self.status_is_active(), err.UNAUTHORIZED - assert // Not authorized - // modules/core_financial/coupon.py:40 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/coupon.py:41 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - cover 2 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/coupon.py:44 - // units = self.account[holding_address].units - dup - box_get - pop - intc_2 // 32 - extract_uint64 - dup - cover 3 - // modules/core_financial/coupon.py:45 - // assert units > 0, err.NO_UNITS - assert // No D-ASA units - // modules/core_financial/coupon.py:47 - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - // modules/core_financial/coupon.py:48 - // account_paid_coupons = self.account[holding_address].paid_coupons - swap - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - // modules/core_financial/coupon.py:49 - // assert due_coupons > account_paid_coupons, err.NO_DUE_COUPON - swap - dig 1 - > - assert // No due coupon to pay - // modules/core_financial/coupon.py:50-53 - // # The following conditions verify if other accounts are still waiting for the payment of previous coupons - // assert self.all_due_coupons_paid( - // account_paid_coupons - // ), err.PENDING_COUPON_PAYMENT - dup - callsub all_due_coupons_paid - assert // Pending due coupon payment - // modules/core_financial/coupon.py:197 - // self.account_total_units_value(holding_address), - dig 1 - callsub account_total_units_value - // modules/core_financial/coupon.py:198 - // account_paid_coupons + 1, - swap - intc_1 // 1 - + - // modules/core_financial/coupon.py:196-199 - // return self.coupon_interest_amount( - // self.account_total_units_value(holding_address), - // account_paid_coupons + 1, - // ) - callsub coupon_interest_amount - swap - // modules/payment_agent/coupon.py:54 - // self.assert_payment_authorization(holding_address) - dup - callsub assert_payment_authorization - // modules/payment_agent/coupon.py:57 - // if self.is_payment_executable(holding_address): - callsub is_payment_executable - bz pay_coupon_else_body@3 - // modules/payment_agent/coupon.py:58-59 - // # The reference implementation has on-chain payment agent - // self.assert_enough_funds(payment_amount) - dupn 2 - callsub assert_enough_funds - // modules/payment_agent/coupon.py:60-61 - // # The reference implementation has the same asset for denomination and settlement, no conversion needed - // self.pay(self.account[holding_address].payment_address, payment_amount) - dig 3 - box_get - assert // check self.account entry exists - extract 0 32 - swap - callsub pay - -pay_coupon_after_if_else@4: - // modules/core_financial/coupon.py:63 - // self.account[holding_address].paid_coupons += 1 - dig 2 - dup - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - intc_1 // 1 - + - itob - pushint 48 - swap - box_replace - // modules/core_financial/coupon.py:64 - // self.paid_coupon_units += units - intc_0 // 0 - bytec 28 // "paid_coupon_units" - app_global_get_ex - assert // check self.paid_coupon_units exists - dig 2 - + - bytec 28 // "paid_coupon_units" - swap - app_global_put - // modules/payment_agent/coupon.py:17 - // contract_id=Global.current_application_id.id, - global CurrentApplicationID - // modules/payment_agent/coupon.py:20 - // time=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/coupon.py:22 - // currency_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 16 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/payment_agent/coupon.py:23 - // currency_unit=self.denomination_asset_id.unit_name, - dup - asset_params_get AssetUnitName - assert // asset exists - // modules/payment_agent/coupon.py:24 - // nominal_value=self.circulating_units * self.unit_value, - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - * - // modules/payment_agent/coupon.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - uncover 4 - itob - pushbytes 0x080037 - concat - uncover 4 - itob - concat - dig 4 - itob - swap - dig 1 - concat - uncover 4 - itob - concat - dig 3 - len - itob - extract 6 2 - uncover 4 - concat - swap - bytec 35 // 0x003b - concat - uncover 3 - itob - concat - // modules/payment_agent/coupon.py:25 - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - bytec 30 // 0x0000 - // modules/payment_agent/coupon.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - concat - // modules/payment_agent/coupon.py:26 - // nominal_accrued=UInt64(0), - intc_0 // 0 - // modules/payment_agent/coupon.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - itob - concat - pushbytes 0x00024950 - concat - swap - concat - // modules/payment_agent/coupon.py:15-28 - // arc4.emit( - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - // ) - bytec 36 // method "Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)" - swap - concat - log - // modules/payment_agent/coupon.py:70 - // timestamp=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/coupon.py:68-72 - // return typ.PaymentResult( - // amount=payment_amount, - // timestamp=Global.latest_timestamp, - // context=payment_info, # TODO: Add info on failed payment - // ) - itob - concat - dig 4 - dup - len - itob - extract 6 2 - swap - concat - swap - bytec 37 // 0x0012 - concat - swap - concat - // modules/payment_agent/coupon.py:30 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -pay_coupon_else_body@3: - // modules/payment_agent/coupon.py:63-64 - // # Accounts suspended or not opted in at the time of payments must not stall the D-ASA - // payment_amount = UInt64() - intc_0 // 0 - bury 1 - b pay_coupon_after_if_else@4 - - -// modules.payment_agent.principal.PrincipalPaymentAgentMixin.pay_principal[routing]() -> void: -pay_principal: - // modules/payment_agent/principal.py:30 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/actus/pam.py:16-17 - // # The reference implementation does not restrict caller authorization - // assert self.status_is_active(), err.UNAUTHORIZED - assert // Not authorized - // modules/actus/pam.py:18 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/actus/pam.py:19 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - cover 2 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/actus/pam.py:21 - // units = self.account[holding_address].units - box_get - pop - intc_2 // 32 - extract_uint64 - // modules/actus/pam.py:22 - // assert units > 0, err.NO_UNITS - assert // No D-ASA units - // modules/actus/pam.py:23 - // assert Global.latest_timestamp >= self.maturity_date, err.NOT_MATURE - global LatestTimestamp - intc_0 // 0 - bytec 5 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - >= - assert // Not mature - // modules/core_financial/coupon.py:78 - // self.count_due_coupons() - callsub count_due_coupons - // modules/core_financial/coupon.py:76-79 - // # Principal payment is forbidden in case of pending coupon payments - // assert self.all_due_coupons_paid( - // self.count_due_coupons() - // ), err.PENDING_COUPON_PAYMENT - callsub all_due_coupons_paid - assert // Pending due coupon payment - // modules/core_financial/coupon.py:80 - // return self.account_total_units_value(holding_address) - dup - callsub account_total_units_value - swap - // modules/payment_agent/principal.py:53 - // self.assert_payment_authorization(holding_address) - dup - callsub assert_payment_authorization - // modules/payment_agent/principal.py:56 - // if self.is_payment_executable(holding_address): - callsub is_payment_executable - bz pay_principal_else_body@3 - // modules/payment_agent/principal.py:57-58 - // # The reference implementation has on-chain payment agent - // self.assert_enough_funds(payment_amount) - dupn 2 - callsub assert_enough_funds - // modules/payment_agent/principal.py:59-60 - // # The reference implementation has the same asset for denomination and settlement, no conversion needed - // self.pay(self.account[holding_address].payment_address, payment_amount) - dig 2 - box_get - assert // check self.account entry exists - extract 0 32 - swap - callsub pay - -pay_principal_after_if_else@4: - // modules/core_financial/common.py:199 - // self.circulating_units -= self.account[holding_address].units - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 2 - dup - cover 2 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - - - bytec_3 // "circulating_units" - swap - app_global_put - // modules/core_financial/common.py:200 - // self.account[holding_address].units = UInt64() - intc_0 // 0 - itob - swap - intc_2 // 32 - dig 2 - box_replace - // modules/core_financial/common.py:201 - // self.end_if_no_circulating_units() - callsub end_if_no_circulating_units - // modules/payment_agent/principal.py:17 - // contract_id=Global.current_application_id.id, - global CurrentApplicationID - // modules/payment_agent/principal.py:20 - // time=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/principal.py:22 - // currency_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 16 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/payment_agent/principal.py:23 - // currency_unit=self.denomination_asset_id.unit_name, - dup - asset_params_get AssetUnitName - assert // asset exists - // modules/payment_agent/principal.py:24 - // nominal_value=self.circulating_units * self.unit_value, - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - * - // modules/payment_agent/principal.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_PR), - // type_name=String("PR"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), - // nominal_accrued=UInt64(0), - // ) - uncover 4 - itob - pushbytes 0x030037 - concat - uncover 4 - itob - concat - dig 5 - itob - swap - dig 1 - concat - uncover 4 - itob - concat - dig 3 - len - itob - extract 6 2 - uncover 4 - concat - swap - bytec 35 // 0x003b - concat - uncover 3 - itob - concat - // modules/payment_agent/principal.py:25 - // nominal_rate_bps=arc4.UInt16(0), - bytec 30 // 0x0000 - // modules/payment_agent/principal.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_PR), - // type_name=String("PR"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), - // nominal_accrued=UInt64(0), - // ) - concat - uncover 3 - concat - pushbytes 0x00025052 - concat - swap - concat - // modules/payment_agent/principal.py:15-28 - // arc4.emit( - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_PR), - // type_name=String("PR"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), - // nominal_accrued=UInt64(0), - // ) - // ) - bytec 36 // method "Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)" - swap - concat - log - // modules/payment_agent/principal.py:69 - // timestamp=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/principal.py:67-71 - // return typ.PaymentResult( - // amount=payment_amount, - // timestamp=Global.latest_timestamp, - // context=payment_info, # TODO: Add info on failed payment - // ) - itob - concat - dig 3 - dup - len - itob - extract 6 2 - swap - concat - swap - bytec 37 // 0x0012 - concat - swap - concat - // modules/payment_agent/principal.py:30 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -pay_principal_else_body@3: - // modules/payment_agent/principal.py:62-63 - // # Accounts suspended or not opted in at the time of payments must not stall the D-ASA - // payment_amount = UInt64() - intc_0 // 0 - bury 1 - b pay_principal_after_if_else@4 - - -// modules.transfer_agent.coupon.CouponTransferAgentMixin.asset_transfer[routing]() -> void: -asset_transfer: - intc_0 // 0 - dupn 2 - pushbytes "" - dup - // modules/transfer_agent/coupon.py:9 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:153-158 - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - bz asset_transfer_bool_false@6 - // modules/core_financial/common.py:154 - // and self.secondary_market_opening_date <= Global.latest_timestamp - intc_0 // 0 - bytec 18 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - global LatestTimestamp - <= - // modules/core_financial/common.py:153-158 - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - bz asset_transfer_bool_false@6 - // modules/core_financial/common.py:156 - // not self.secondary_market_closure_date - intc_0 // 0 - bytec 11 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:156-157 - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - bz asset_transfer_bool_true@5 - // modules/core_financial/common.py:157 - // or Global.latest_timestamp < self.secondary_market_closure_date - global LatestTimestamp - intc_0 // 0 - bytec 11 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - < - // modules/core_financial/common.py:156-157 - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - bz asset_transfer_bool_false@6 - -asset_transfer_bool_true@5: - intc_1 // 1 - -asset_transfer_bool_merge@7: - // modules/core_financial/common.py:152-159 - // assert ( - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - // ), err.SECONDARY_MARKET_CLOSED - assert // Secondary market is closed - // modules/core_financial/common.py:169-171 - // # The reference implementation grants transfer right to D-ASA owners. Other implementations may relay on other - // # roles, external Apps through C2C calls (e.g., an order book), or off-chain transfer agents. - // assert Txn.sender == sender_holding_address, err.UNAUTHORIZED - txn Sender - dig 3 - dup - cover 2 - == - assert // Not authorized - // modules/core_financial/common.py:172 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:173 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - bury 9 - dup - box_len - bury 1 - assert // Invalid account holding address - bytec_1 // 0x52333023 - dig 4 - dup - cover 2 - concat - dup - bury 10 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/common.py:176 - // self.assert_is_not_account_suspended(sender_holding_address) - dig 3 - callsub assert_is_not_account_suspended - // modules/core_financial/common.py:177 - // self.assert_is_not_account_suspended(receiver_holding_address) - dig 1 - callsub assert_is_not_account_suspended - // modules/core_financial/common.py:190 - // assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER - uncover 3 - uncover 2 - != - assert // Sender and receiver must be different - // modules/core_financial/common.py:191 - // assert units > 0, err.NULL_TRANSFER - dig 2 - dup - assert // Transfer units must be greater than zero - // modules/core_financial/common.py:192 - // assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER - uncover 2 - box_get - assert // check self.account entry exists - dup - intc_2 // 32 - extract_uint64 - uncover 2 - >= - assert // Insufficient sender units to transfer - // modules/accounting.py:63 - // sender_unit_value = self.account[sender].unit_value - extract 40 8 - bury 9 - // modules/accounting.py:64 - // if self.account[receiver].units > UInt64(0): - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - bz asset_transfer_else_body@9 - // modules/accounting.py:58 - // self.account[sender].unit_value == self.account[receiver].unit_value - dig 6 - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - dig 6 - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - == - // modules/accounting.py:58-59 - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - bz asset_transfer_bool_false@20 - // modules/accounting.py:59 - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - dig 6 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - dig 6 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - == - // modules/accounting.py:58-59 - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - bz asset_transfer_bool_false@20 - intc_1 // 1 - -asset_transfer_bool_merge@21: - // modules/accounting.py:57-60 - // assert ( - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - // ), err.NON_FUNGIBLE_UNITS - assert // Sender and receiver units are not fungible - -asset_transfer_after_if_else@10: - // modules/transfer_agent/coupon.py:46-47 - // # Transferred units value (must be computed before the transfer) - // sender_unit_value = self.account[sender_holding_address].unit_value - dig 6 - dup - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - bury 5 - // modules/core_financial/coupon.py:69-70 - // # Transfer is forbidden in case of pending coupon payments - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - // modules/core_financial/coupon.py:71 - // self.assert_no_pending_coupon_payment(sender_holding_address, due_coupons) - dig 4 - dup - cover 2 - dig 1 - callsub assert_no_pending_coupon_payment - // modules/core_financial/coupon.py:72 - // return self.accrued_interest_amount(sender_holding_address, units, due_coupons) - swap - dig 3 - dup - cover 3 - uncover 2 - callsub accrued_interest_amount - bury 7 - // modules/accounting.py:71 - // assert units <= self.account[holding_address].units, err.OVER_TRANSFER - dig 1 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dup2 - <= - assert // Insufficient sender units to transfer - // modules/accounting.py:72 - // self.account[holding_address].units -= units - swap - - - itob - dig 1 - intc_2 // 32 - uncover 2 - box_replace - // modules/accounting.py:52 - // if self.account[holding_address].units == UInt64(0): - box_get - pop - intc_2 // 32 - extract_uint64 - bnz asset_transfer_after_if_else@16 - // modules/accounting.py:53 - // self.account[holding_address].unit_value = UInt64(0) - intc_0 // 0 - itob - dig 7 - dup - cover 2 - pushint 40 - dig 2 - box_replace - // modules/accounting.py:54 - // self.account[holding_address].paid_coupons = UInt64(0) - pushint 48 - swap - box_replace - -asset_transfer_after_if_else@16: - // modules/accounting.py:76 - // self.account[holding_address].units += units - dig 5 - dup - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dig 2 - dup - cover 2 - + - itob - uncover 2 - intc_2 // 32 - uncover 2 - box_replace - // modules/transfer_agent/coupon.py:53 - // return units * sender_unit_value + accrued_interest - dig 4 - * - dig 5 - + - // modules/transfer_agent/coupon.py:9 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -asset_transfer_bool_false@20: - intc_0 // 0 - b asset_transfer_bool_merge@21 - -asset_transfer_else_body@9: - // modules/accounting.py:67 - // self.account[receiver].unit_value = sender_unit_value - dig 5 - dup - pushint 40 - dig 10 - box_replace - // modules/accounting.py:68 - // self.account[receiver].paid_coupons = self.account[sender].paid_coupons - dig 7 - box_get - assert // check self.account entry exists - extract 48 8 - pushint 48 - swap - box_replace - b asset_transfer_after_if_else@10 - -asset_transfer_bool_false@6: - intc_0 // 0 - b asset_transfer_bool_merge@7 - - -// modules.core_financial.common.CoreFinancialCommonMixin.asset_create[routing]() -> void: -asset_create: - // modules/core_financial/common.py:267 - // @arc4.abimethod(create="require") - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - dig 1 - pushint 38 - extract_uint16 // on error: invalid tuple encoding - dup - pushint 40 - == - assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[])) - dig 2 - swap - dig 2 - substring3 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 42 - + - == - assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata - // modules/core_financial/common.py:276 - // self.arranger.value = arranger - bytec 8 // 0x52323023 - uncover 2 - app_global_put - // modules/core_financial/common.py:277 - // self.metadata = metadata.bytes - bytec 25 // "metadata" - swap - app_global_put - // modules/core_financial/common.py:267 - // @arc4.abimethod(create="require") - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.asset_update[routing]() -> void: -asset_update: - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txna ApplicationArgs 1 - dup - len - dig 1 - pushint 38 - extract_uint16 // on error: invalid tuple encoding - dup - pushint 40 - == - assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[])) - dig 2 - swap - dig 2 - substring3 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 42 - + - == - assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata - // modules/core_financial/common.py:284-287 - // # The reference implementation grants the update permissions to the Arranger. - // # Other implementations may disable D-ASA application updatability or change its authorizations. - // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/core_financial/common.py:288 - // self.metadata = metadata.bytes - bytec 25 // "metadata" - swap - app_global_put - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.set_secondary_time_events[routing]() -> void: -set_secondary_time_events: - intc_0 // 0 - // modules/core_financial/common.py:290 - // @arc4.abimethod - txna ApplicationArgs 1 - dupn 2 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - intc_3 // 8 - * - pushint 2 - + - uncover 2 - len - == - assert // invalid number of bytes for arc4.dynamic_array - // modules/core_financial/common.py:311 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 5 // 200 - == - // modules/core_financial/common.py:312 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/core_financial/common.py:313 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:315 - // assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH - dup - assert // Time events length is invalid - // modules/core_financial/common.py:316 - // if secondary_market_time_events.length > 1: - intc_1 // 1 - > - bz set_secondary_time_events_after_if_else@3 - // modules/core_financial/common.py:317 - // self.assert_time_events_sorted(secondary_market_time_events) - dup - callsub assert_time_events_sorted - bury 1 - -set_secondary_time_events_after_if_else@3: - // modules/core_financial/common.py:320 - // self.issuance_date - intc_0 // 0 - bytec 4 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/common.py:321 - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - dig 1 - dup - extract 2 0 - bury 4 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:320-321 - // self.issuance_date - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - swap - dig 1 - <= - // modules/core_financial/common.py:319-322 - // assert ( - // self.issuance_date - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - // ), err.INVALID_SECONDARY_OPENING_DATE - assert // Invalid secondary market opening date - // modules/core_financial/common.py:323 - // self.secondary_market_opening_date = secondary_market_time_events[ - bytec 18 // "secondary_market_opening_date" - // modules/core_financial/common.py:323-325 - // self.secondary_market_opening_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_OPENING_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:326 - // if self.maturity_date: - intc_0 // 0 - bytec 5 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - bz set_secondary_time_events_after_if_else@5 - // modules/core_financial/common.py:328 - // self.maturity_date - intc_0 // 0 - bytec 5 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // modules/core_financial/common.py:329 - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - dig 1 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_3 // 8 - * - dig 3 - swap - extract_uint64 - // modules/core_financial/common.py:328-329 - // self.maturity_date - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - swap - dig 1 - >= - // modules/core_financial/common.py:327-330 - // assert ( - // self.maturity_date - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - // ), err.INVALID_SECONDARY_CLOSURE_DATE - assert // Invalid secondary market closure date - // modules/core_financial/common.py:331 - // self.secondary_market_closure_date = secondary_market_time_events[ - bytec 11 // "secondary_market_closure_date" - // modules/core_financial/common.py:331-333 - // self.secondary_market_closure_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - // ] - swap - app_global_put - -set_secondary_time_events_after_if_else@5: - // modules/core_financial/common.py:335 - // secondary_market_opening_date=self.secondary_market_opening_date, - intc_0 // 0 - bytec 18 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - // modules/core_financial/common.py:336 - // secondary_market_closure_date=self.secondary_market_closure_date, - intc_0 // 0 - bytec 11 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:334-337 - // return typ.SecondaryMarketSchedule( - // secondary_market_opening_date=self.secondary_market_opening_date, - // secondary_market_closure_date=self.secondary_market_closure_date, - // ) - swap - itob - swap - itob - concat - // modules/core_financial/common.py:290 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.set_default_status[routing]() -> void: -set_default_status: - // modules/core_financial/common.py:339 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:74 - // assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED - bytec 20 // 0x52363023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/core_financial/common.py:352 - // self.asset_defaulted = defaulted - bytec 24 // "asset_defaulted" - swap - app_global_put - // modules/core_financial/common.py:353 - // return Global.latest_timestamp - global LatestTimestamp - // modules/core_financial/common.py:339 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.primary_distribution[routing]() -> void: -primary_distribution: - pushbytes "" - // modules/core_financial/common.py:355 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:145-148 - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // modules/core_financial/common.py:146 - // and self.primary_distribution_opening_date - intc_0 // 0 - bytec 10 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/common.py:147 - // <= Global.latest_timestamp - global LatestTimestamp - dup - bury 5 - // modules/core_financial/common.py:146-147 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - <= - // modules/core_financial/common.py:146-148 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // modules/core_financial/common.py:148 - // < self.primary_distribution_closure_date - intc_0 // 0 - bytec 27 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // modules/core_financial/common.py:147-148 - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - dig 3 - > - // modules/core_financial/common.py:146-148 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - intc_1 // 1 - -primary_distribution_bool_merge@6: - // modules/core_financial/common.py:144-149 - // assert ( - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - // ), err.PRIMARY_DISTRIBUTION_CLOSED - assert // Primary distribution is closed - // modules/rbac.py:71 - // assert self._role_is_active(self.primary_dealer, Txn.sender), err.UNAUTHORIZED - bytec 21 // 0x52353023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/common.py:383 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:384 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/core_financial/common.py:385 - // assert units > 0, err.ZERO_UNITS - dig 1 - dup - assert // Can not distribute zero units - // modules/core_financial/common.py:386 - // assert self.circulating_units + units <= self.total_units, err.OVER_DISTRIBUTION - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 1 - + - intc_0 // 0 - bytec 15 // "total_units" - app_global_get_ex - assert // check self.total_units exists - dig 1 - >= - assert // Insufficient remaining D-ASA units - // modules/core_financial/common.py:388 - // self.circulating_units += units - bytec_3 // "circulating_units" - dig 1 - app_global_put - // modules/core_financial/common.py:389 - // self.account[holding_address].units += units - dig 2 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - uncover 2 - + - itob - dig 2 - intc_2 // 32 - uncover 2 - box_replace - // modules/core_financial/common.py:390 - // self.account[holding_address].unit_value = self.unit_value - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - itob - uncover 2 - pushint 40 - uncover 2 - box_replace - // modules/core_financial/common.py:391 - // return self.total_units - self.circulating_units - intc_0 // 0 - bytec 15 // "total_units" - app_global_get_ex - assert // check self.total_units exists - swap - - - // modules/core_financial/common.py:355 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -primary_distribution_bool_false@5: - intc_0 // 0 - b primary_distribution_bool_merge@6 - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_asset_info[routing]() -> void: -get_asset_info: - // modules/core_financial/common.py:403 - // performance = UInt64(cst.PRF_PERFORMANT) - intc_0 // 0 - // modules/core_financial/common.py:404 - // if Global.latest_timestamp > self.maturity_date > 0: - global LatestTimestamp - intc_0 // 0 - bytec 5 // "maturity_date" - app_global_get_ex - swap - dup - cover 2 - cover 3 - assert // check self.maturity_date exists - > - bz get_asset_info_after_if_else@4 - dup - bz get_asset_info_after_if_else@4 - // modules/core_financial/common.py:405 - // performance = UInt64(cst.PRF_MATURED) - pushint 4 - bury 2 - -get_asset_info_after_if_else@4: - // modules/core_financial/common.py:406-407 - // # The reference implementation has no grace or delinquency periods - // if self.asset_defaulted: - intc_0 // 0 - bytec 24 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - bz get_asset_info_after_if_else@6 - // modules/core_financial/common.py:408 - // performance = UInt64(cst.PRF_DEFAULTED) - pushint 3 - bury 2 - -get_asset_info_after_if_else@6: - // modules/core_financial/common.py:411 - // denomination_asset_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 16 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/core_financial/common.py:412 - // settlement_asset_id=self.settlement_asset_id.id, - intc_0 // 0 - bytec 9 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // modules/accounting.py:45 - // return self.circulating_units * self.unit_value - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - dup2 - * - // modules/core_financial/common.py:415 - // day_count_convention=arc4.UInt8(self.day_count_convention), - intc_0 // 0 - bytec 17 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - itob - dup - bitlen - intc_3 // 8 - <= - assert // overflow - extract 7 1 - // modules/core_financial/common.py:416 - // principal_discount=arc4.UInt16(self.principal_discount), - intc_0 // 0 - bytec 26 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - itob - dup - bitlen - pushint 16 - <= - assert // overflow - extract 6 2 - // modules/core_financial/common.py:417 - // interest_rate=arc4.UInt16(self.interest_rate), - intc_0 // 0 - bytec 33 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - itob - dup - bitlen - pushint 16 - <= - assert // overflow - extract 6 2 - // modules/core_financial/common.py:418 - // total_supply=self.total_units, - intc_0 // 0 - bytec 15 // "total_units" - app_global_get_ex - assert // check self.total_units exists - // modules/core_financial/common.py:420 - // primary_distribution_opening_date=self.primary_distribution_opening_date, - intc_0 // 0 - bytec 10 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/common.py:421 - // primary_distribution_closure_date=self.primary_distribution_closure_date, - intc_0 // 0 - bytec 27 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // modules/core_financial/common.py:422 - // issuance_date=self.issuance_date, - intc_0 // 0 - bytec 4 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/common.py:423 - // maturity_date=self.maturity_date, - intc_0 // 0 - bytec 5 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // modules/core_financial/common.py:424 - // suspended=self.asset_suspended, - intc_0 // 0 - bytec 23 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - // modules/core_financial/common.py:425 - // performance=arc4.UInt8(performance), - dig 15 - itob - dup - bitlen - intc_3 // 8 - <= - assert // overflow - extract 7 1 - // modules/core_financial/common.py:410-426 - // return typ.AssetInfo( - // denomination_asset_id=self.denomination_asset_id.id, - // settlement_asset_id=self.settlement_asset_id.id, - // outstanding_principal=self.outstanding_principal(), - // unit_value=self.unit_value, - // day_count_convention=arc4.UInt8(self.day_count_convention), - // principal_discount=arc4.UInt16(self.principal_discount), - // interest_rate=arc4.UInt16(self.interest_rate), - // total_supply=self.total_units, - // circulating_supply=self.circulating_units, - // primary_distribution_opening_date=self.primary_distribution_opening_date, - // primary_distribution_closure_date=self.primary_distribution_closure_date, - // issuance_date=self.issuance_date, - // maturity_date=self.maturity_date, - // suspended=self.asset_suspended, - // performance=arc4.UInt8(performance), - // ) - uncover 14 - itob - uncover 14 - itob - concat - uncover 11 - itob - concat - uncover 11 - itob - concat - uncover 10 - concat - uncover 9 - concat - uncover 8 - concat - uncover 7 - itob - concat - uncover 7 - itob - concat - uncover 6 - itob - concat - uncover 5 - itob - concat - uncover 4 - itob - concat - uncover 3 - itob - concat - bytec 31 // 0x00 - intc_0 // 0 - uncover 4 - setbit - concat - swap - concat - // modules/core_financial/common.py:393 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_time_events[routing]() -> void: -get_time_events: - // modules/core_financial/common.py:436 - // time_events = typ.TimeEvents() - bytec 30 // 0x0000 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:437 - // if self.status_is_active(): - bz get_time_events_after_if_else@3 - // modules/core_financial/common.py:438 - // time_events = self.time_events.value.copy() - bytec 12 // 0x74696d654576656e7473 - box_get - swap - bury 2 - assert // check self.time_events exists - -get_time_events_after_if_else@3: - // modules/core_financial/common.py:428 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - dig 1 - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_secondary_market_schedule[routing]() -> void: -get_secondary_market_schedule: - // modules/core_financial/common.py:450 - // (self.secondary_market_opening_date, self.secondary_market_closure_date) - intc_0 // 0 - bytec 18 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - intc_0 // 0 - bytec 11 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:449-451 - // return typ.TimeEvents( - // (self.secondary_market_opening_date, self.secondary_market_closure_date) - // ) - swap - itob - pushbytes 0x0002 - swap - concat - swap - itob - concat - // modules/core_financial/common.py:441 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_asset_metadata[routing]() -> void: -get_asset_metadata: - // modules/core_financial/common.py:462 - // return typ.AssetMetadata.from_bytes(self.metadata) - intc_0 // 0 - bytec 25 // "metadata" - app_global_get_ex - assert // check self.metadata exists - // modules/core_financial/common.py:453 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_gov_suspension[routing]() -> void: -account_gov_suspension: - // modules/accounting.py:94 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 13 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:114 - // self.account[holding_address].suspended = suspended - dup - pushint 56 - intc_1 // 1 - box_extract - intc_0 // 0 - uncover 3 - setbit - pushint 56 - swap - box_replace - // modules/accounting.py:115 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:94 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_open[routing]() -> void: -account_open: - // modules/accounting.py:117 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 14 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 5 // 200 - == - // modules/accounting.py:139 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/accounting.py:140 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:141 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:142 - // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - ! - assert // Invalid account holding address - // modules/accounting.py:146 - // units=UInt64(0), - intc_0 // 0 - // modules/accounting.py:144-150 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=UInt64(0), - // unit_value=UInt64(0), - // paid_coupons=UInt64(0), - // suspended=False, - // ) - itob - uncover 2 - dig 1 - concat - dig 1 - concat - swap - concat - bytec 31 // 0x00 - concat - box_put - // modules/accounting.py:151 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:117 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_close[routing]() -> void: -account_close: - // modules/accounting.py:153 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 14 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:171 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:174 - // closed_units = self.account[holding_address].units - dup - box_get - pop - intc_2 // 32 - extract_uint64 - // modules/accounting.py:175 - // del self.account[holding_address] - swap - box_del - pop - // modules/accounting.py:176 - // self.circulating_units -= closed_units - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 1 - - - bytec_3 // "circulating_units" - swap - app_global_put - // modules/accounting.py:177 - // self.end_if_no_circulating_units() - callsub end_if_no_circulating_units - // modules/accounting.py:178 - // return closed_units, Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:153 - // @arc4.abimethod - swap - itob - swap - itob - concat - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_update_payment_address[routing]() -> void: -account_update_payment_address: - // modules/accounting.py:180 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:200 - // assert Txn.sender == holding_address, err.UNAUTHORIZED - txn Sender - dig 2 - == - assert // Not authorized - // modules/accounting.py:201 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:202 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:204 - // self.account[holding_address].payment_address = payment_address - intc_0 // 0 - uncover 2 - box_replace - // modules/accounting.py:205 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:180 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_get_info[routing]() -> void: -account_get_info: - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:222 - // return self.account[holding_address] - box_get - pop - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: -rbac_rotate_arranger: - // modules/rbac.py:147 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:158 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:159 - // self.arranger.value = new_arranger - bytec 8 // 0x52323023 - swap - app_global_put - // modules/rbac.py:160 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:147 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: -rbac_set_op_daemon: - // modules/rbac.py:162 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:173 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:174 - // self.op_daemon.value = address - bytec 22 // 0x52323523 - swap - app_global_put - // modules/rbac.py:175 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:162 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: -rbac_assign_role: - // modules/rbac.py:177 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/rbac.py:199 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:200 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:201 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:101 - // if role_id == UInt64(cst.ROLE_ARRANGER): - pushint 20 - == - bz rbac_assign_role_after_if_else@3 - // modules/rbac.py:102 - // self.arranger.value = role_address - bytec 8 // 0x52323023 - dig 3 - app_global_put - -rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14: - // modules/rbac.py:203 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:177 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_assign_role_after_if_else@3: - // modules/rbac.py:105 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - dup - pushint 40 - == - bz rbac_assign_role_after_if_else@5 - // modules/rbac.py:106 - // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 14 // 0x52343023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:107 - // self.account_manager[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@5: - // modules/rbac.py:109 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_assign_role_after_if_else@7 - // modules/rbac.py:110 - // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 21 // 0x52353023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:111 - // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@7: - // modules/rbac.py:113 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_assign_role_after_if_else@9 - // modules/rbac.py:114 - // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 20 // 0x52363023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:115 - // self.trustee[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@9: - // modules/rbac.py:117 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_assign_role_after_if_else@11 - // modules/rbac.py:118 - // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec 13 // 0x52373023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:119 - // self.authority[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@11: - // modules/rbac.py:121 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - // modules/rbac.py:122 - // assert role_address not in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 32 // 0x52383023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:123 - // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - - -// modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: -rbac_revoke_role: - // modules/rbac.py:205 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:224 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:225 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:226 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:126 - // assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE - dup - pushint 20 - != - assert // Invalid role identifier - // modules/rbac.py:127 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushint 40 - == - bz rbac_revoke_role_after_if_else@3 - // modules/rbac.py:128 - // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 14 // 0x52343023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:129 - // del self.account_manager[role_address] - box_del - pop - -rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:228 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:205 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_revoke_role_after_if_else@3: - // modules/rbac.py:131 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_revoke_role_after_if_else@5 - // modules/rbac.py:132 - // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 21 // 0x52353023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:133 - // del self.primary_dealer[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@5: - // modules/rbac.py:135 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_revoke_role_after_if_else@7 - // modules/rbac.py:136 - // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 20 // 0x52363023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:137 - // del self.trustee[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@7: - // modules/rbac.py:139 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_revoke_role_after_if_else@9 - // modules/rbac.py:140 - // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec 13 // 0x52373023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:141 - // del self.authority[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@9: - // modules/rbac.py:143 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - // modules/rbac.py:144 - // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 32 // 0x52383023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:145 - // del self.interest_oracle[role_address] - box_del - pop - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - - -// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: -rbac_gov_asset_suspension: - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 13 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/rbac.py:246 - // self.asset_suspended = suspended - bytec 23 // "asset_suspended" - swap - app_global_put - // modules/rbac.py:247 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: -rbac_get_arranger: - // modules/rbac.py:257 - // return self.arranger.value - intc_0 // 0 - bytec 8 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - // modules/rbac.py:249 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: -rbac_get_address_roles: - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:273 - // self._role_is_active(self.account_manager, address), - bytec 14 // 0x52343023 - dig 1 - callsub _role_is_active - // modules/rbac.py:274 - // self._role_is_active(self.primary_dealer, address), - bytec 21 // 0x52353023 - dig 2 - callsub _role_is_active - // modules/rbac.py:275 - // self._role_is_active(self.trustee, address), - bytec 20 // 0x52363023 - dig 3 - callsub _role_is_active - // modules/rbac.py:276 - // self._role_is_active(self.authority, address), - bytec 13 // 0x52373023 - dig 4 - callsub _role_is_active - // modules/rbac.py:277 - // self._role_is_active(self.interest_oracle, address), - bytec 32 // 0x52383023 - uncover 5 - callsub _role_is_active - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - bytec 31 // 0x00 - intc_0 // 0 - uncover 6 - setbit - intc_1 // 1 - uncover 5 - setbit - pushint 2 - uncover 4 - setbit - pushint 3 - uncover 3 - setbit - pushint 4 - uncover 2 - setbit - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_role_config[routing]() -> void: -rbac_get_role_config: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:294 - // role = role_id.as_uint64() - btoi - // modules/rbac.py:295 - // self._assert_valid_role(role) - dup - callsub _assert_valid_role - // modules/rbac.py:297 - // case UInt64(cst.ROLE_ARRANGER): - pushints 20 40 50 60 70 80 - // modules/rbac.py:296-327 - // match role: - // case UInt64(cst.ROLE_ARRANGER): - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.account_manager[role_address] - // case UInt64(cst.ROLE_PRIMARY_DEALER): - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.primary_dealer[role_address] - // case UInt64(cst.ROLE_TRUSTEE): - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.trustee[role_address] - // case UInt64(cst.ROLE_AUTHORITY): - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.authority[role_address] - // case UInt64(cst.ROLE_INTEREST_ORACLE): - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.interest_oracle[role_address] - // case _: - // op.err(err.INVALID_ROLE) - uncover 6 - match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7 - // modules/rbac.py:327 - // op.err(err.INVALID_ROLE) - err // Invalid role identifier - -rbac_get_role_config_switch_case_5@7: - // modules/rbac.py:323 - // self.interest_oracle, role_address - bytec 32 // 0x52383023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:322-324 - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:325 - // return self.interest_oracle[role_address] - box_get - pop - -rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_get_role_config_switch_case_4@6: - // modules/rbac.py:318 - // self.authority, role_address - bytec 13 // 0x52373023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:317-319 - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:320 - // return self.authority[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_3@5: - // modules/rbac.py:313 - // self.trustee, role_address - bytec 20 // 0x52363023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:312-314 - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:315 - // return self.trustee[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_2@4: - // modules/rbac.py:308 - // self.primary_dealer, role_address - bytec 21 // 0x52353023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:307-309 - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:310 - // return self.primary_dealer[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_1@3: - // modules/rbac.py:303 - // self.account_manager, role_address - bytec 14 // 0x52343023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:302-304 - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:305 - // return self.account_manager[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_0@2: - // modules/rbac.py:298-300 - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.count_due_coupons() -> uint64: -count_due_coupons: - // modules/core_financial/coupon.py:111 - // def count_due_coupons(self) -> UInt64: - proto 0 1 - pushbytes "" - // modules/core_financial/coupon.py:112 - // current_ts = Global.latest_timestamp - global LatestTimestamp - dup - // modules/core_financial/coupon.py:113 - // due_coupons = self.due_coupons_watermark - intc_0 // 0 - bytec 29 // "due_coupons_watermark" - app_global_get_ex - swap - cover 2 - assert // check self.due_coupons_watermark exists - // modules/core_financial/coupon.py:114 - // if current_ts >= self.maturity_date: - intc_0 // 0 - bytec 5 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - >= - bz count_due_coupons_else_body@2 - // modules/core_financial/coupon.py:115 - // due_coupons = self.total_coupons - intc_0 // 0 - bytec 7 // "total_coupons" - app_global_get_ex - swap - frame_bury 2 - assert // check self.total_coupons exists - -count_due_coupons_after_if_else@8: - // modules/core_financial/coupon.py:129 - // self.due_coupons_watermark = due_coupons - bytec 29 // "due_coupons_watermark" - frame_dig 2 - dup - cover 2 - app_global_put - // modules/core_financial/coupon.py:130 - // return due_coupons - frame_bury 0 - retsub - -count_due_coupons_else_body@2: - // modules/core_financial/coupon.py:116 - // elif current_ts > self.issuance_date: - intc_0 // 0 - bytec 4 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - frame_dig 1 - < - bz count_due_coupons_after_if_else@8 - // modules/core_financial/coupon.py:118 - // UInt64(fixed_cfg.FIRST_COUPON_DATE_IDX) + self.due_coupons_watermark - intc_0 // 0 - bytec 29 // "due_coupons_watermark" - app_global_get_ex - assert // check self.due_coupons_watermark exists - pushint 3 - + - dup - frame_bury 0 - // modules/core_financial/coupon.py:120 - // coupon_due_date = self.time_events.value[coupon_idx] - intc_3 // 8 - * - pushint 2 - + - bytec 12 // 0x74696d654576656e7473 - swap - intc_3 // 8 - box_extract - btoi - -count_due_coupons_while_top@4: - // modules/core_financial/coupon.py:121 - // while current_ts >= coupon_due_date: - frame_dig 1 - <= - bz count_due_coupons_after_while@6 - // modules/core_financial/coupon.py:123 - // required_budget=UInt64(fixed_cfg.OP_UP_COUPON_DUE_COUNTING), - intc 4 // 255 - // modules/core_financial/coupon.py:124 - // fee_source=OpUpFeeSource.GroupCredit, - intc_0 // 0 - // modules/core_financial/coupon.py:122-125 - // ensure_budget( - // required_budget=UInt64(fixed_cfg.OP_UP_COUPON_DUE_COUNTING), - // fee_source=OpUpFeeSource.GroupCredit, - // ) - callsub ensure_budget - // modules/core_financial/coupon.py:126 - // coupon_idx += 1 - frame_dig 0 - intc_1 // 1 - + - dup - frame_bury 0 - // modules/core_financial/coupon.py:127 - // coupon_due_date = self.time_events.value[coupon_idx] - intc_3 // 8 - * - pushint 2 - + - bytec 12 // 0x74696d654576656e7473 - swap - intc_3 // 8 - box_extract - btoi - b count_due_coupons_while_top@4 - -count_due_coupons_after_while@6: - // modules/core_financial/coupon.py:128 - // due_coupons = coupon_idx - fixed_cfg.FIRST_COUPON_DATE_IDX - frame_dig 0 - pushint 3 - - - frame_bury 2 - b count_due_coupons_after_if_else@8 - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_due_date(coupon: uint64) -> uint64: -coupon_due_date: - // modules/core_financial/coupon.py:132 - // def coupon_due_date(self, coupon: UInt64) -> UInt64: - proto 1 1 - // modules/core_financial/coupon.py:133 - // return self.time_events.value[fixed_cfg.FIRST_COUPON_DATE_IDX + coupon - 1] - pushint 3 - frame_dig -1 - + - intc_1 // 1 - - - intc_3 // 8 - * - pushint 2 - + - bytec 12 // 0x74696d654576656e7473 - swap - intc_3 // 8 - box_extract - btoi - retsub - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.next_coupon_due_date(due_coupons: uint64) -> uint64: -next_coupon_due_date: - // modules/core_financial/coupon.py:141 - // def next_coupon_due_date(self, due_coupons: UInt64) -> UInt64: - proto 1 1 - // modules/core_financial/coupon.py:142 - // coupon_due_date = UInt64() - intc_0 // 0 - // modules/core_financial/coupon.py:143 - // if due_coupons < self.total_coupons: - dup - bytec 7 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - frame_dig -1 - > - bz next_coupon_due_date_after_if_else@2 - // modules/core_financial/coupon.py:144 - // coupon_due_date = self.coupon_due_date(due_coupons + 1) - frame_dig -1 - intc_1 // 1 - + - callsub coupon_due_date - frame_bury 0 - -next_coupon_due_date_after_if_else@2: - // modules/core_financial/coupon.py:145 - // return coupon_due_date - frame_dig 0 - swap - retsub - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.coupon_interest_amount(principal_amount: uint64, coupon: uint64) -> uint64: -coupon_interest_amount: - // modules/core_financial/coupon.py:147-149 - // def coupon_interest_amount( - // self, principal_amount: UInt64, coupon: UInt64 - // ) -> UInt64: - proto 2 1 - // modules/core_financial/coupon.py:150 - // coupon_rate_bps = self.coupon_rates.value[coupon - 1].as_uint64() - frame_dig -1 - intc_1 // 1 - - - pushint 2 - * - pushint 2 - + - bytec 19 // 0x636f75706f6e5261746573 - swap - pushint 2 - box_extract - btoi - // modules/core_financial/coupon.py:151 - // return principal_amount * coupon_rate_bps // cst.BPS - frame_dig -2 - * - pushint 10000 - / - retsub - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.day_count_factor(due_coupons: uint64) -> bytes: -day_count_factor: - // modules/core_financial/coupon.py:153 - // def day_count_factor(self, due_coupons: UInt64) -> typ.DayCountFactor: - proto 1 1 - pushbytes "" - dup - // modules/core_financial/coupon.py:154-155 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // if not due_coupons: - frame_dig -1 - bnz day_count_factor_else_body@2 - // modules/core_financial/coupon.py:156 - // accruing_start_time = self.issuance_date - intc_0 // 0 - bytec 4 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - -day_count_factor_after_if_else@3: - // modules/core_financial/coupon.py:159 - // coupon_accrued_period = Global.latest_timestamp - accruing_start_time - global LatestTimestamp - dig 1 - - - frame_bury 0 - // modules/core_financial/coupon.py:160 - // coupon_period = self.next_coupon_due_date(due_coupons) - accruing_start_time - frame_dig -1 - callsub next_coupon_due_date - swap - - - // modules/core_financial/coupon.py:161 - // if self.day_count_convention == UInt64(cst.DCC_A_A): - intc_0 // 0 - bytec 17 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - bnz day_count_factor_after_if_else@5 - // modules/core_financial/common.py:162 - // return time_period // UInt64(cst.DAY_2_SEC) - frame_dig 0 - intc 6 // 86400 - / - frame_bury 0 - intc 6 // 86400 - / - -day_count_factor_after_if_else@5: - // modules/core_financial/coupon.py:164-167 - // return typ.DayCountFactor( - // numerator=coupon_accrued_period, - // denominator=coupon_period, - // ) - frame_dig 0 - itob - swap - itob - concat - frame_bury 0 - retsub - -day_count_factor_else_body@2: - // modules/core_financial/coupon.py:136 - // coupon_due_date = UInt64() - intc_0 // 0 - frame_bury 1 - // modules/core_financial/coupon.py:137 - // if due_coupons >= UInt64(1): - frame_dig -1 - bz day_count_factor_after_if_else@8 - // modules/core_financial/coupon.py:138 - // coupon_due_date = self.coupon_due_date(due_coupons) - frame_dig -1 - callsub coupon_due_date - frame_bury 1 - -day_count_factor_after_if_else@8: - frame_dig 1 - b day_count_factor_after_if_else@3 - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.is_accruing_interest(due_coupons: uint64) -> uint64: -is_accruing_interest: - // modules/core_financial/coupon.py:169 - // def is_accruing_interest(self, due_coupons: UInt64) -> bool: - proto 1 1 - // modules/core_financial/coupon.py:171 - // self.issuance_date != 0 - intc_0 // 0 - bytec 4 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/coupon.py:171-173 - // self.issuance_date != 0 - // and Global.latest_timestamp >= self.issuance_date - // and due_coupons < self.total_coupons - bz is_accruing_interest_bool_false@4 - // modules/core_financial/coupon.py:172 - // and Global.latest_timestamp >= self.issuance_date - global LatestTimestamp - intc_0 // 0 - bytec 4 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - >= - // modules/core_financial/coupon.py:171-173 - // self.issuance_date != 0 - // and Global.latest_timestamp >= self.issuance_date - // and due_coupons < self.total_coupons - bz is_accruing_interest_bool_false@4 - // modules/core_financial/coupon.py:173 - // and due_coupons < self.total_coupons - intc_0 // 0 - bytec 7 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - frame_dig -1 - > - // modules/core_financial/coupon.py:171-173 - // self.issuance_date != 0 - // and Global.latest_timestamp >= self.issuance_date - // and due_coupons < self.total_coupons - bz is_accruing_interest_bool_false@4 - intc_1 // 1 - // modules/core_financial/coupon.py:170-174 - // return ( - // self.issuance_date != 0 - // and Global.latest_timestamp >= self.issuance_date - // and due_coupons < self.total_coupons - // ) - retsub - -is_accruing_interest_bool_false@4: - intc_0 // 0 - // modules/core_financial/coupon.py:170-174 - // return ( - // self.issuance_date != 0 - // and Global.latest_timestamp >= self.issuance_date - // and due_coupons < self.total_coupons - // ) - retsub - - -// modules.core_financial.coupon.FixedCouponCashflowMixin.accrued_interest_amount(holding_address: bytes, units: uint64, due_coupons: uint64) -> uint64: -accrued_interest_amount: - // modules/core_financial/coupon.py:176-178 - // def accrued_interest_amount( - // self, holding_address: Account, units: UInt64, due_coupons: UInt64 - // ) -> UInt64: - proto 3 1 - // modules/core_financial/coupon.py:179-180 - // # The following assert safeguards the subroutine from forbidden invocations - // self.assert_no_pending_coupon_payment(holding_address, due_coupons) - frame_dig -3 - frame_dig -1 - callsub assert_no_pending_coupon_payment - // modules/core_financial/coupon.py:181 - // day_count_factor = self.day_count_factor(due_coupons) - frame_dig -1 - callsub day_count_factor - // modules/core_financial/coupon.py:182 - // coupon_accrued_period = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - // modules/core_financial/coupon.py:183 - // coupon_period = day_count_factor.denominator - swap - intc_3 // 8 - extract_uint64 - // modules/core_financial/coupon.py:184 - // next_coupon_rate_bps = self.coupon_rates.value[due_coupons].as_uint64() - frame_dig -1 - pushint 2 - * - pushint 2 - + - bytec 19 // 0x636f75706f6e5261746573 - swap - pushint 2 - box_extract - btoi - // modules/core_financial/coupon.py:187 - // self.account_units_value(holding_address, units) - frame_dig -3 - frame_dig -2 - callsub account_units_value - // modules/core_financial/coupon.py:187-188 - // self.account_units_value(holding_address, units) - // * next_coupon_rate_bps - * - // modules/core_financial/coupon.py:187-189 - // self.account_units_value(holding_address, units) - // * next_coupon_rate_bps - // * coupon_accrued_period - uncover 2 - * - // modules/core_financial/coupon.py:190 - // // (cst.BPS * coupon_period) - pushint 10000 - uncover 2 - * - // modules/core_financial/coupon.py:187-190 - // self.account_units_value(holding_address, units) - // * next_coupon_rate_bps - // * coupon_accrued_period - // // (cst.BPS * coupon_period) - / - // modules/core_financial/coupon.py:185-191 - // # due_coupons is equal to the 0-base idx of next coupon - // return ( - // self.account_units_value(holding_address, units) - // * next_coupon_rate_bps - // * coupon_accrued_period - // // (cst.BPS * coupon_period) - // ) # div-by-zero: coupon_period != 0 due to assert_time_events_sorted checks - retsub - - -// modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid(due_coupons: uint64) -> uint64: -all_due_coupons_paid: - // modules/core_financial/coupon.py:26 - // def all_due_coupons_paid(self, due_coupons: UInt64) -> bool: - proto 1 1 - // modules/core_financial/coupon.py:27 - // return self.paid_coupon_units >= self.circulating_units * due_coupons - intc_0 // 0 - bytec 28 // "paid_coupon_units" - app_global_get_ex - assert // check self.paid_coupon_units exists - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - frame_dig -1 - * - >= - retsub - - -// modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment(holding_address: bytes, due_coupons: uint64) -> void: -assert_no_pending_coupon_payment: - // modules/core_financial/coupon.py:29-31 - // def assert_no_pending_coupon_payment( - // self, holding_address: Account, due_coupons: UInt64 - // ) -> None: - proto 2 0 - // modules/core_financial/coupon.py:33 - // self.account[holding_address].paid_coupons == due_coupons - bytec_1 // 0x52333023 - frame_dig -2 - concat - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - frame_dig -1 - == - // modules/core_financial/coupon.py:32-34 - // assert ( - // self.account[holding_address].paid_coupons == due_coupons - // ), err.PENDING_COUPON_PAYMENT - assert // Pending due coupon payment - retsub - - -// modules.payment_agent.common.PaymentAgentCommonMixin.assert_payment_authorization(holding_address: bytes) -> void: -assert_payment_authorization: - // modules/payment_agent/common.py:12 - // def assert_payment_authorization(self, holding_address: Account) -> None: - proto 1 0 - // modules/payment_agent/common.py:13 - // if self.op_daemon.value != Global.zero_address: - intc_0 // 0 - bytec 22 // 0x52323523 - app_global_get_ex - assert // check self.op_daemon exists - global ZeroAddress - != - bz assert_payment_authorization_after_if_else@7 - // modules/payment_agent/common.py:15 - // Txn.sender == self.op_daemon.value - txn Sender - intc_0 // 0 - bytec 22 // 0x52323523 - app_global_get_ex - assert // check self.op_daemon exists - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bnz assert_payment_authorization_bool_true@4 - // modules/payment_agent/common.py:16 - // or Txn.sender == holding_address - txn Sender - frame_dig -1 - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bnz assert_payment_authorization_bool_true@4 - // modules/payment_agent/common.py:17 - // or Txn.sender == self.account[holding_address].payment_address - txn Sender - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - extract 0 32 - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bz assert_payment_authorization_bool_false@5 - -assert_payment_authorization_bool_true@4: - intc_1 // 1 - -assert_payment_authorization_bool_merge@6: - // modules/payment_agent/common.py:14-18 - // assert ( - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - // ), err.UNAUTHORIZED - assert // Not authorized - -assert_payment_authorization_after_if_else@7: - retsub - -assert_payment_authorization_bool_false@5: - intc_0 // 0 - b assert_payment_authorization_bool_merge@6 - - -// modules.payment_agent.common.PaymentAgentCommonMixin.is_payment_executable(holding_address: bytes) -> uint64: -is_payment_executable: - // modules/payment_agent/common.py:20 - // def is_payment_executable(self, holding_address: Account) -> bool: - proto 1 1 - // modules/payment_agent/common.py:22 - // self.account[holding_address].payment_address.is_opted_in( - bytec_1 // 0x52333023 - frame_dig -1 - concat - dup - box_get - assert // check self.account entry exists - extract 0 32 - // modules/payment_agent/common.py:23 - // self.settlement_asset_id - intc_0 // 0 - bytec 9 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // modules/payment_agent/common.py:22-24 - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - asset_holding_get AssetBalance - bury 1 - // modules/payment_agent/common.py:22-25 - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - // and not self.account[holding_address].suspended - bz is_payment_executable_bool_false@3 - // modules/payment_agent/common.py:25 - // and not self.account[holding_address].suspended - frame_dig 0 - box_get - assert // check self.account entry exists - pushint 448 - getbit - bnz is_payment_executable_bool_false@3 - intc_1 // 1 - -is_payment_executable_bool_merge@4: - // modules/payment_agent/common.py:21-26 - // return ( - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - // and not self.account[holding_address].suspended - // ) - swap - retsub - -is_payment_executable_bool_false@3: - intc_0 // 0 - b is_payment_executable_bool_merge@4 - - -// modules.payment_agent.common.PaymentAgentCommonMixin.assert_enough_funds(payment_amount: uint64) -> void: -assert_enough_funds: - // modules/payment_agent/common.py:28 - // def assert_enough_funds(self, payment_amount: UInt64) -> None: - proto 1 0 - // modules/payment_agent/common.py:30 - // self.settlement_asset_id.balance(Global.current_application_address) - global CurrentApplicationAddress - intc_0 // 0 - bytec 9 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - asset_holding_get AssetBalance - assert // account opted into asset - // modules/payment_agent/common.py:30-31 - // self.settlement_asset_id.balance(Global.current_application_address) - // >= payment_amount - frame_dig -1 - >= - // modules/payment_agent/common.py:29-32 - // assert ( - // self.settlement_asset_id.balance(Global.current_application_address) - // >= payment_amount - // ), err.NOT_ENOUGH_FUNDS - assert // Not enough funds for the payment - retsub - - -// modules.payment_agent.common.PaymentAgentCommonMixin.pay(receiver: bytes, amount: uint64) -> void: -pay: - // modules/payment_agent/common.py:34 - // def pay(self, receiver: Account, amount: UInt64) -> None: - proto 2 0 - // modules/payment_agent/common.py:35-40 - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=receiver, - // asset_amount=amount, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // modules/payment_agent/common.py:39 - // fee=Global.min_txn_fee, - global MinTxnFee - // modules/payment_agent/common.py:36 - // xfer_asset=self.settlement_asset_id, - intc_0 // 0 - bytec 9 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - frame_dig -1 - itxn_field AssetAmount - frame_dig -2 - itxn_field AssetReceiver - itxn_field XferAsset - // modules/payment_agent/common.py:35 - // itxn.AssetTransfer( - pushint 4 // axfer - itxn_field TypeEnum - itxn_field Fee - // modules/payment_agent/common.py:35-40 - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=receiver, - // asset_amount=amount, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - retsub - - -// modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted(time_events: bytes) -> bytes: -assert_time_events_sorted: - // modules/core_financial/common.py:107 - // def assert_time_events_sorted(self, time_events: typ.TimeEvents) -> None: - proto 1 1 - pushbytes "" - dupn 2 - // modules/core_financial/common.py:109 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - frame_dig -1 - extract 2 0 - frame_dig -1 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:110 - // > Global.latest_timestamp - global LatestTimestamp - // modules/core_financial/common.py:109-110 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - // > Global.latest_timestamp - > - // modules/core_financial/common.py:108-111 - // assert ( - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - // > Global.latest_timestamp - // ), err.INVALID_TIME - assert // Time events must be set in the future - // modules/core_financial/common.py:112 - // for idx in urange(time_events.length - 1): - frame_dig -1 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_0 // 0 - -assert_time_events_sorted_for_header@1: - // modules/core_financial/common.py:112 - // for idx in urange(time_events.length - 1): - frame_dig 5 - frame_dig 4 - < - bz assert_time_events_sorted_after_for@6 - // modules/core_financial/common.py:114 - // required_budget=UInt64(cfg.OP_UP_TIME_EVENT_SORTING), - pushint 65 - // modules/core_financial/common.py:115 - // fee_source=OpUpFeeSource.AppAccount, - intc_1 // 1 - // modules/core_financial/common.py:113-116 - // ensure_budget( - // required_budget=UInt64(cfg.OP_UP_TIME_EVENT_SORTING), - // fee_source=OpUpFeeSource.AppAccount, - // ) - callsub ensure_budget - // modules/core_financial/common.py:117 - // time_i = time_events[idx] - frame_dig 5 - dup - intc_3 // 8 - * - frame_dig 3 - dup - cover 3 - swap - extract_uint64 - dup - cover 3 - frame_bury 1 - // modules/core_financial/common.py:118 - // time_f = time_events[idx + 1] - intc_1 // 1 - + - dup - frame_bury 2 - intc_3 // 8 - * - extract_uint64 - dup - frame_bury 0 - // modules/core_financial/common.py:119 - // assert time_f > time_i, err.INVALID_SORTING - < - assert // Time events must be sorted in strictly ascending order - // modules/core_financial/common.py:120 - // if self.day_count_convention != UInt64(cst.DCC_CONT): - intc_0 // 0 - bytec 17 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - intc 4 // 255 - != - bz assert_time_events_sorted_after_if_else@4 - // modules/core_financial/common.py:121-122 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - frame_dig 0 - frame_dig 1 - - - // modules/core_financial/common.py:121-124 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - // cst.DAY_2_SEC - // ) == 0, err.INVALID_TIME_PERIOD - intc 6 // 86400 - % - ! - assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds) - -assert_time_events_sorted_after_if_else@4: - frame_dig 2 - frame_bury 5 - b assert_time_events_sorted_for_header@1 - -assert_time_events_sorted_after_for@6: - frame_dig -1 - frame_bury 0 - retsub - - -// modules.accounting.AccountingModule.assert_is_not_account_suspended(holding_address: bytes) -> void: -assert_is_not_account_suspended: - // modules/accounting.py:33 - // def assert_is_not_account_suspended(self, holding_address: Account) -> None: - proto 1 0 - // modules/accounting.py:34 - // assert not self.account[holding_address].suspended, err.SUSPENDED - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - pushint 448 - getbit - ! - assert // Suspended operations - retsub - - -// modules.accounting.AccountingModule.account_units_value(holding_address: bytes, units: uint64) -> uint64: -account_units_value: - // modules/accounting.py:36 - // def account_units_value(self, holding_address: Account, units: UInt64) -> UInt64: - proto 2 1 - // modules/accounting.py:37 - // return units * self.account[holding_address].unit_value - bytec_1 // 0x52333023 - frame_dig -2 - concat - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - frame_dig -1 - * - retsub - - -// modules.accounting.AccountingModule.account_total_units_value(holding_address: bytes) -> uint64: -account_total_units_value: - // modules/accounting.py:39 - // def account_total_units_value(self, holding_address: Account) -> UInt64: - proto 1 1 - // modules/accounting.py:41 - // holding_address, self.account[holding_address].units - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - // modules/accounting.py:40-42 - // return self.account_units_value( - // holding_address, self.account[holding_address].units - // ) - frame_dig -1 - swap - callsub account_units_value - retsub - - -// modules.accounting.AccountingModule.end_if_no_circulating_units() -> void: -end_if_no_circulating_units: - // modules/accounting.py:48 - // if self.circulating_units == UInt64(0): - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - bnz end_if_no_circulating_units_after_if_else@2 - // modules/accounting.py:49 - // self.status = UInt64(enm.STATUS_ENDED) - bytec_2 // "status" - intc 5 // 200 - app_global_put - -end_if_no_circulating_units_after_if_else@2: - retsub - - -// modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: -_role_is_active: - // modules/rbac.py:57 - // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: - proto 2 1 - pushbytes "" - // modules/rbac.py:55 - // return role_address in role_map - frame_dig -2 - frame_dig -1 - concat - dup - box_len - bury 1 - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - bz _role_is_active_bool_false@4 - // modules/rbac.py:59 - // role_map[role_address].role_validity_start - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_0 // 0 - extract_uint64 - // modules/rbac.py:60 - // <= Global.latest_timestamp - global LatestTimestamp - dup - frame_bury 0 - // modules/rbac.py:59-60 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - <= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - // modules/rbac.py:61 - // <= role_map[role_address].role_validity_end - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_3 // 8 - extract_uint64 - // modules/rbac.py:60-61 - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - frame_dig 0 - >= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - intc_1 // 1 - -_role_is_active_bool_merge@5: - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - frame_bury 0 - retsub - -_role_is_active_bool_false@4: - intc_0 // 0 - b _role_is_active_bool_merge@5 - - -// modules.rbac.RbacModule.assert_caller_is_arranger() -> void: -assert_caller_is_arranger: - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - txn Sender - // modules/rbac.py:52 - // return role_address == self.arranger.value - intc_0 // 0 - bytec 8 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - == - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - assert // Not authorized - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_defaulted() -> void: -assert_is_not_asset_defaulted: - // modules/rbac.py:83 - // assert not self.asset_defaulted, err.DEFAULTED - intc_0 // 0 - bytec 24 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - ! - assert // Defaulted - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_suspended() -> void: -assert_is_not_asset_suspended: - // modules/rbac.py:86 - // assert not self.asset_suspended, err.SUSPENDED - intc_0 // 0 - bytec 23 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - ! - assert // Suspended operations - retsub - - -// modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: -_assert_valid_role: - // modules/rbac.py:88 - // def _assert_valid_role(self, role_id: UInt64) -> None: - proto 1 0 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - frame_dig -1 - // modules/rbac.py:90 - // UInt64(cst.ROLE_ARRANGER), - pushint 20 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:91 - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - pushint 40 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:92 - // UInt64(cst.ROLE_PRIMARY_DEALER), - pushint 50 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:93 - // UInt64(cst.ROLE_TRUSTEE), - pushint 60 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:94 - // UInt64(cst.ROLE_AUTHORITY), - pushint 70 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:95 - // UInt64(cst.ROLE_INTEREST_ORACLE), - pushint 80 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bz _assert_valid_role_bool_false@7 - -_assert_valid_role_bool_true@6: - intc_1 // 1 - -_assert_valid_role_bool_merge@8: - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - assert // Invalid role identifier - retsub - -_assert_valid_role_bool_false@7: - intc_0 // 0 - b _assert_valid_role_bool_merge@8 diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json deleted file mode 100644 index 49e9338c..00000000 --- a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json +++ /dev/null @@ -1,2048 +0,0 @@ -{ - "name": "FixedCouponBond", - "structs": { - "AccountInfo": [ - { - "name": "payment_address", - "type": "address" - }, - { - "name": "units", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "paid_coupons", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - } - ], - "AssetInfo": [ - { - "name": "denomination_asset_id", - "type": "uint64" - }, - { - "name": "settlement_asset_id", - "type": "uint64" - }, - { - "name": "outstanding_principal", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "day_count_convention", - "type": "uint8" - }, - { - "name": "principal_discount", - "type": "uint16" - }, - { - "name": "interest_rate", - "type": "uint16" - }, - { - "name": "total_supply", - "type": "uint64" - }, - { - "name": "circulating_supply", - "type": "uint64" - }, - { - "name": "primary_distribution_opening_date", - "type": "uint64" - }, - { - "name": "primary_distribution_closure_date", - "type": "uint64" - }, - { - "name": "issuance_date", - "type": "uint64" - }, - { - "name": "maturity_date", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - }, - { - "name": "performance", - "type": "uint8" - } - ], - "AssetMetadata": [ - { - "name": "contract_type", - "type": "uint8" - }, - { - "name": "calendar", - "type": "uint8" - }, - { - "name": "business_day_convention", - "type": "uint8" - }, - { - "name": "end_of_month_convention", - "type": "uint8" - }, - { - "name": "prepayment_effect", - "type": "uint8" - }, - { - "name": "penalty_type", - "type": "uint8" - }, - { - "name": "prospectus_hash", - "type": "byte[32]" - }, - { - "name": "prospectus_url", - "type": "string" - } - ], - "CouponsInfo": [ - { - "name": "total_coupons", - "type": "uint64" - }, - { - "name": "due_coupons", - "type": "uint64" - }, - { - "name": "next_coupon_due_date", - "type": "uint64" - }, - { - "name": "day_count_factor", - "type": "DayCountFactor" - }, - { - "name": "all_due_coupons_paid", - "type": "bool" - } - ], - "CurrentUnitsValue": [ - { - "name": "units_value", - "type": "uint64" - }, - { - "name": "accrued_interest", - "type": "uint64" - }, - { - "name": "day_count_factor", - "type": "DayCountFactor" - } - ], - "DayCountFactor": [ - { - "name": "numerator", - "type": "uint64" - }, - { - "name": "denominator", - "type": "uint64" - } - ], - "PaymentAmounts": [ - { - "name": "interest", - "type": "uint64" - }, - { - "name": "principal", - "type": "uint64" - } - ], - "PaymentResult": [ - { - "name": "amount", - "type": "uint64" - }, - { - "name": "timestamp", - "type": "uint64" - }, - { - "name": "context", - "type": "byte[]" - } - ], - "RoleConfig": [ - { - "name": "role_validity_start", - "type": "uint64" - }, - { - "name": "role_validity_end", - "type": "uint64" - } - ], - "SecondaryMarketSchedule": [ - { - "name": "secondary_market_opening_date", - "type": "uint64" - }, - { - "name": "secondary_market_closure_date", - "type": "uint64" - } - ] - }, - "methods": [ - { - "name": "asset_config", - "args": [ - { - "type": "uint64", - "name": "denomination_asset_id", - "desc": "Denomination asset identifier" - }, - { - "type": "uint64", - "name": "settlement_asset_id", - "desc": "Settlement asset identifier" - }, - { - "type": "uint64", - "name": "principal", - "desc": "Principal, expressed in denomination asset" - }, - { - "type": "uint64", - "name": "principal_discount", - "desc": "Principal discount in bps" - }, - { - "type": "uint64", - "name": "minimum_denomination", - "desc": "Minimum denomination, expressed in denomination asset" - }, - { - "type": "uint8", - "name": "day_count_convention", - "desc": "Day-count convention for interests calculation" - }, - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rate in bps" - }, - { - "type": "uint16[]", - "name": "coupon_rates", - "desc": "Coupon interest rates in bps" - }, - { - "type": "uint64[]", - "name": "time_events", - "desc": "Time events (strictly ascending order)" - }, - { - "type": "(uint64,uint64)[]", - "name": "time_periods", - "desc": "Time periods of recurring time events" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Configure the Debt Algorand Standard Application", - "events": [], - "recommendations": {} - }, - { - "name": "get_account_units_current_value", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Account's units for the current value calculation" - } - ], - "returns": { - "type": "(uint64,uint64,(uint64,uint64))", - "struct": "CurrentUnitsValue", - "desc": "Units current value in denomination asset, Accrued interest in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account's units current value and accrued interest", - "events": [], - "recommendations": {} - }, - { - "name": "get_coupon_rates", - "args": [], - "returns": { - "type": "uint16[]", - "desc": "Coupon rates" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA coupon rates", - "events": [], - "recommendations": {} - }, - { - "name": "get_payment_amount", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "PaymentAmounts", - "desc": "Interest amount in denomination asset, Principal amount in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get the next payment amount", - "events": [], - "recommendations": {} - }, - { - "name": "get_coupons_status", - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,(uint64,uint64),bool)", - "struct": "CouponsInfo", - "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA coupons status", - "events": [], - "recommendations": {} - }, - { - "name": "pay_coupon", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "returns": { - "type": "(uint64,uint64,byte[])", - "struct": "PaymentResult", - "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Pay due coupon to an account", - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "recommendations": {} - }, - { - "name": "pay_principal", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "returns": { - "type": "(uint64,uint64,byte[])", - "struct": "PaymentResult", - "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Pay the outstanding principal to an account", - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "recommendations": {} - }, - { - "name": "asset_transfer", - "args": [ - { - "type": "address", - "name": "sender_holding_address", - "desc": "Sender Account Holding Address" - }, - { - "type": "address", - "name": "receiver_holding_address", - "desc": "Receiver Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to transfer" - } - ], - "returns": { - "type": "uint64", - "desc": "Transferred actualized value in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Transfer D-ASA units between accounts", - "events": [], - "recommendations": {} - }, - { - "name": "asset_create", - "args": [ - { - "type": "address", - "name": "arranger", - "desc": "D-ASA Arranger Address" - }, - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "name": "metadata", - "desc": "D-ASA metadata" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [ - "NoOp" - ], - "call": [] - }, - "readonly": false, - "desc": "Create a new D-ASA", - "events": [], - "recommendations": {} - }, - { - "name": "asset_update", - "args": [ - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "name": "metadata" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "UpdateApplication" - ] - }, - "readonly": false, - "desc": "Update D-ASA application.", - "events": [], - "recommendations": {} - }, - { - "name": "set_secondary_time_events", - "args": [ - { - "type": "uint64[]", - "name": "secondary_market_time_events", - "desc": "Secondary market time events (strictly ascending order)" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "SecondaryMarketSchedule", - "desc": "Secondary Market Opening Date, Secondary Market Closure Date" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set secondary market time schedule", - "events": [], - "recommendations": {} - }, - { - "name": "set_default_status", - "args": [ - { - "type": "bool", - "name": "defaulted", - "desc": "Default status" - } - ], - "returns": { - "type": "uint64" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set D-ASA default status", - "events": [], - "recommendations": {} - }, - { - "name": "primary_distribution", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to distribute" - } - ], - "returns": { - "type": "uint64", - "desc": "Remaining D-ASA units to be distributed" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Distribute D-ASA units to accounts according the primary market", - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_info", - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "struct": "AssetInfo", - "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA info", - "events": [], - "recommendations": {} - }, - { - "name": "get_time_events", - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Time events" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA time events", - "events": [], - "recommendations": {} - }, - { - "name": "get_secondary_market_schedule", - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Secondary market schedule" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get secondary market schedule", - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_metadata", - "args": [], - "returns": { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA metadata", - "events": [], - "recommendations": {} - }, - { - "name": "account_gov_suspension", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set account suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set account suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "account_open", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account opening" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Open D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_close", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "desc": "Closed units, Timestamp of the account closing" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Close D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_update_payment_address", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account update" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Update the Payment Address of an account", - "events": [], - "recommendations": {} - }, - { - "name": "account_get_info", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(address,uint64,uint64,uint64,bool)", - "struct": "AccountInfo", - "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account info", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_rotate_arranger", - "args": [ - { - "type": "address", - "name": "new_arranger", - "desc": "New Arranger address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Rotate the Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_set_op_daemon", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Operation Daemon address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Non-Normative: Set the Operation Daemon address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_assign_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Assign a role to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_revoke_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role revocation" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Revoke a role from an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_gov_asset_suspension", - "args": [ - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set asset suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set asset suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_arranger", - "args": [], - "returns": { - "type": "address", - "desc": "Arranger address" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_address_roles", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Address to get roles for" - } - ], - "returns": { - "type": "(bool,bool,bool,bool,bool)", - "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Non-normative - Get roles assigned to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_role_config", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "RoleConfig", - "desc": "Role configuration" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get role configuration", - "events": [], - "recommendations": {} - } - ], - "arcs": [ - 22, - 28 - ], - "networks": {}, - "state": { - "schema": { - "global": { - "ints": 20, - "bytes": 3 - }, - "local": { - "ints": 0, - "bytes": 0 - } - }, - "keys": { - "global": { - "arranger": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjIwIw==" - }, - "op_daemon": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjI1Iw==" - }, - "asset_suspended": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfc3VzcGVuZGVk" - }, - "asset_defaulted": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfZGVmYXVsdGVk" - }, - "total_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfdW5pdHM=" - }, - "circulating_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "Y2lyY3VsYXRpbmdfdW5pdHM=" - }, - "unit_value": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dW5pdF92YWx1ZQ==" - }, - "status": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c3RhdHVz" - }, - "denomination_asset_id": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk" - }, - "settlement_asset_id": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2V0dGxlbWVudF9hc3NldF9pZA==" - }, - "day_count_convention": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=" - }, - "metadata": { - "keyType": "AVMString", - "valueType": "AVMBytes", - "key": "bWV0YWRhdGE=" - }, - "principal_discount": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbmNpcGFsX2Rpc2NvdW50" - }, - "interest_rate": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "aW50ZXJlc3RfcmF0ZQ==" - }, - "total_coupons": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfY291cG9ucw==" - }, - "primary_distribution_opening_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl" - }, - "primary_distribution_closure_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl" - }, - "issuance_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "aXNzdWFuY2VfZGF0ZQ==" - }, - "secondary_market_opening_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=" - }, - "secondary_market_closure_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=" - }, - "maturity_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "bWF0dXJpdHlfZGF0ZQ==" - }, - "paid_coupon_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cGFpZF9jb3Vwb25fdW5pdHM=" - }, - "due_coupons_watermark": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZHVlX2NvdXBvbnNfd2F0ZXJtYXJr" - } - }, - "local": {}, - "box": { - "time_events": { - "keyType": "AVMBytes", - "valueType": "uint64[]", - "key": "dGltZUV2ZW50cw==" - }, - "coupon_rates": { - "keyType": "AVMBytes", - "valueType": "uint16[]", - "key": "Y291cG9uUmF0ZXM=" - } - } - }, - "maps": { - "global": {}, - "local": {}, - "box": { - "account_manager": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjQwIw==" - }, - "primary_dealer": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjUwIw==" - }, - "trustee": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjYwIw==" - }, - "authority": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjcwIw==" - }, - "interest_oracle": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjgwIw==" - }, - "account": { - "keyType": "address", - "valueType": "AccountInfo", - "prefix": "UjMwIw==" - } - } - } - }, - "bareActions": { - "create": [], - "call": [] - }, - "sourceInfo": { - "approval": { - "sourceInfo": [ - { - "pc": [ - 2798 - ], - "errorMessage": "Can not distribute zero units" - }, - { - "pc": [ - 1182 - ], - "errorMessage": "Coupon rates are not properly defined" - }, - { - "pc": [ - 1068 - ], - "errorMessage": "D-ASA already configured" - }, - { - "pc": [ - 4833 - ], - "errorMessage": "Defaulted" - }, - { - "pc": [ - 1075 - ], - "errorMessage": "Denomination asset is not properly set" - }, - { - "pc": [ - 1086 - ], - "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" - }, - { - "pc": [ - 2814 - ], - "errorMessage": "Insufficient remaining D-ASA units" - }, - { - "pc": [ - 2283, - 2378 - ], - "errorMessage": "Insufficient sender units to transfer" - }, - { - "pc": [ - 1173 - ], - "errorMessage": "Interest rate is not properly defined" - }, - { - "pc": [ - 1328, - 1484, - 1679, - 1941, - 2237, - 2252, - 2788, - 3171, - 3242, - 3294, - 3365, - 3394 - ], - "errorMessage": "Invalid account holding address" - }, - { - "pc": [ - 3536, - 3560, - 3584, - 3608, - 3632, - 3689, - 3717, - 3739, - 3761, - 3783, - 3962, - 3980, - 3995, - 4010, - 4025 - ], - "errorMessage": "Invalid account role address" - }, - { - "pc": [ - 1346 - ], - "errorMessage": "Invalid amount of units for the account" - }, - { - "pc": [ - 1152 - ], - "errorMessage": "Invalid day-count convention ID" - }, - { - "pc": [ - 3673, - 3952, - 4895 - ], - "errorMessage": "Invalid role identifier" - }, - { - "pc": [ - 2659 - ], - "errorMessage": "Invalid secondary market closure date" - }, - { - "pc": [ - 2625 - ], - "errorMessage": "Invalid secondary market opening date" - }, - { - "pc": [ - 1119 - ], - "errorMessage": "Minimum denomination is not a divisor of principal" - }, - { - "pc": [ - 1688, - 1946 - ], - "errorMessage": "No D-ASA units" - }, - { - "pc": [ - 1702 - ], - "errorMessage": "No due coupon to pay" - }, - { - "pc": [ - 1661, - 1923, - 2219, - 2588, - 2702, - 2779, - 3162, - 3217, - 3226, - 3283, - 3350, - 3806, - 4502, - 4825 - ], - "errorMessage": "Not authorized" - }, - { - "pc": [ - 4567 - ], - "errorMessage": "Not enough funds for the payment" - }, - { - "pc": [ - 1955 - ], - "errorMessage": "Not mature" - }, - { - "pc": [ - 1707, - 1962, - 4451 - ], - "errorMessage": "Pending due coupon payment" - }, - { - "pc": [ - 2771 - ], - "errorMessage": "Primary distribution is closed" - }, - { - "pc": [ - 1317 - ], - "errorMessage": "Primary distribution not yet executed" - }, - { - "pc": [ - 2210 - ], - "errorMessage": "Secondary market is closed" - }, - { - "pc": [ - 2268 - ], - "errorMessage": "Sender and receiver must be different" - }, - { - "pc": [ - 2333 - ], - "errorMessage": "Sender and receiver units are not fungible" - }, - { - "pc": [ - 4717, - 4841 - ], - "errorMessage": "Suspended operations" - }, - { - "pc": [ - 1203, - 2593 - ], - "errorMessage": "Time events length is invalid" - }, - { - "pc": [ - 4618 - ], - "errorMessage": "Time events must be set in the future" - }, - { - "pc": [ - 4669 - ], - "errorMessage": "Time events must be sorted in strictly ascending order" - }, - { - "pc": [ - 1264 - ], - "errorMessage": "Time periods are not properly defined" - }, - { - "pc": [ - 4690 - ], - "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" - }, - { - "pc": [ - 2272 - ], - "errorMessage": "Transfer units must be greater than zero" - }, - { - "pc": [ - 606 - ], - "errorMessage": "Wrong Global Bytes allocation" - }, - { - "pc": [ - 612 - ], - "errorMessage": "Wrong Global UInts allocation" - }, - { - "pc": [ - 616 - ], - "errorMessage": "Wrong Local Bytes allocation" - }, - { - "pc": [ - 620 - ], - "errorMessage": "Wrong Local UInts allocation" - }, - { - "pc": [ - 4563 - ], - "errorMessage": "account opted into asset" - }, - { - "pc": [ - 1785, - 2033 - ], - "errorMessage": "asset exists" - }, - { - "pc": [ - 4785, - 4800 - ], - "errorMessage": "check BoxMap entry exists" - }, - { - "pc": [ - 1336, - 1500, - 1694, - 1738, - 1750, - 1986, - 2004, - 2276, - 2290, - 2299, - 2306, - 2317, - 2324, - 2338, - 2373, - 2415, - 2459, - 2822, - 4444, - 4493, - 4517, - 4536, - 4711, - 4727, - 4743 - ], - "errorMessage": "check self.account entry exists" - }, - { - "pc": [ - 3824, - 4823 - ], - "errorMessage": "check self.arranger exists" - }, - { - "pc": [ - 2896, - 4831 - ], - "errorMessage": "check self.asset_defaulted exists" - }, - { - "pc": [ - 2998, - 4839 - ], - "errorMessage": "check self.asset_suspended exists" - }, - { - "pc": [ - 1789, - 1997, - 2037, - 2802, - 2917, - 3306, - 4430, - 4756 - ], - "errorMessage": "check self.circulating_units exists" - }, - { - "pc": [ - 1458 - ], - "errorMessage": "check self.coupon_rates exists" - }, - { - "pc": [ - 2929, - 4284, - 4674 - ], - "errorMessage": "check self.day_count_convention exists" - }, - { - "pc": [ - 1781, - 2029, - 2908 - ], - "errorMessage": "check self.denomination_asset_id exists" - }, - { - "pc": [ - 4067, - 4111 - ], - "errorMessage": "check self.due_coupons_watermark exists" - }, - { - "pc": [ - 2958 - ], - "errorMessage": "check self.interest_rate exists" - }, - { - "pc": [ - 2609, - 2988, - 4100, - 4265, - 4334, - 4344 - ], - "errorMessage": "check self.issuance_date exists" - }, - { - "pc": [ - 1953, - 2634, - 2642, - 2879, - 2993, - 4072 - ], - "errorMessage": "check self.maturity_date exists" - }, - { - "pc": [ - 3130 - ], - "errorMessage": "check self.metadata exists" - }, - { - "pc": [ - 4460, - 4473 - ], - "errorMessage": "check self.op_daemon exists" - }, - { - "pc": [ - 1765, - 4426 - ], - "errorMessage": "check self.paid_coupon_units exists" - }, - { - "pc": [ - 2763, - 2983 - ], - "errorMessage": "check self.primary_distribution_closure_date exists" - }, - { - "pc": [ - 1301, - 1311, - 2749, - 2978 - ], - "errorMessage": "check self.primary_distribution_opening_date exists" - }, - { - "pc": [ - 1167, - 2943 - ], - "errorMessage": "check self.principal_discount exists" - }, - { - "pc": [ - 2194, - 2204, - 2673, - 3108 - ], - "errorMessage": "check self.secondary_market_closure_date exists" - }, - { - "pc": [ - 2183, - 2668, - 3103 - ], - "errorMessage": "check self.secondary_market_opening_date exists" - }, - { - "pc": [ - 2913, - 4525, - 4560, - 4579 - ], - "errorMessage": "check self.settlement_asset_id exists" - }, - { - "pc": [ - 1066, - 1445, - 1490, - 1657, - 1919, - 2172, - 2583, - 2738, - 3078, - 3221 - ], - "errorMessage": "check self.status exists" - }, - { - "pc": [ - 3091 - ], - "errorMessage": "check self.time_events exists" - }, - { - "pc": [ - 1511, - 1595, - 4084, - 4202, - 4353 - ], - "errorMessage": "check self.total_coupons exists" - }, - { - "pc": [ - 2810, - 2852, - 2973 - ], - "errorMessage": "check self.total_units exists" - }, - { - "pc": [ - 1794, - 2042, - 2839, - 2922 - ], - "errorMessage": "check self.unit_value exists" - }, - { - "pc": [ - 1006, - 1028, - 1046, - 1251, - 1641, - 1903, - 2504, - 2543, - 2565, - 2646, - 3474, - 4622 - ], - "errorMessage": "invalid array length header" - }, - { - "pc": [ - 2692, - 3152, - 3796 - ], - "errorMessage": "invalid number of bytes for arc4.bool" - }, - { - "pc": [ - 1019 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1649, - 1911, - 3482 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1059 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array>" - }, - { - "pc": [ - 1040, - 2576 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1287, - 1476, - 1635, - 1897, - 2151, - 2159, - 2481, - 2725, - 3144, - 3201, - 3209, - 3275, - 3336, - 3344, - 3386, - 3410, - 3434, - 3468, - 3656, - 3838, - 3922 - ], - "errorMessage": "invalid number of bytes for arc4.static_array" - }, - { - "pc": [ - 997 - ], - "errorMessage": "invalid number of bytes for arc4.uint16" - }, - { - "pc": [ - 941, - 950, - 959, - 968, - 977, - 1295, - 2167, - 2733 - ], - "errorMessage": "invalid number of bytes for arc4.uint64" - }, - { - "pc": [ - 986, - 3458, - 3646, - 3912 - ], - "errorMessage": "invalid number of bytes for arc4.uint8" - }, - { - "pc": [ - 2509, - 2548 - ], - "errorMessage": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata" - }, - { - "pc": [ - 2496, - 2535 - ], - "errorMessage": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))" - }, - { - "pc": [ - 2491, - 2530 - ], - "errorMessage": "invalid tuple encoding" - }, - { - "pc": [ - 2935, - 2950, - 2965, - 3006 - ], - "errorMessage": "overflow" - } - ], - "pcOffsetMethod": "none" - }, - "clear": { - "sourceInfo": [], - "pcOffsetMethod": "none" - } - }, - "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgOCAyNTUgMjAwIDg2NDAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHg1MjMzMzAyMyAic3RhdHVzIiAiY2lyY3VsYXRpbmdfdW5pdHMiICJpc3N1YW5jZV9kYXRlIiAibWF0dXJpdHlfZGF0ZSIgInVuaXRfdmFsdWUiICJ0b3RhbF9jb3Vwb25zIiAweDUyMzIzMDIzICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMgMHg1MjM3MzAyMyAweDUyMzQzMDIzICJ0b3RhbF91bml0cyIgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgImRheV9jb3VudF9jb252ZW50aW9uIiAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDUyMzYzMDIzIDB4NTIzNTMwMjMgMHg1MjMyMzUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiYXNzZXRfZGVmYXVsdGVkIiAibWV0YWRhdGEiICJwcmluY2lwYWxfZGlzY291bnQiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiICJwYWlkX2NvdXBvbl91bml0cyIgImR1ZV9jb3Vwb25zX3dhdGVybWFyayIgMHgwMDAwIDB4MDAgMHg1MjM4MzAyMyAiaW50ZXJlc3RfcmF0ZSIgMHgwNjgxMDEgMHgwMDNiIDB4OGMyOTkwNGUgMHgwMDEyCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAtMzEKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMgogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDIyIC8vIDB4NTIzMjM1MjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDI0IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxOQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIyCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMS0zMgogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE2IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyA5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzctMzgKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MC00MQogICAgLy8gIyBQcmluY2lwYWwgLyBSYXRlcwogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjYgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAzMyAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDMKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDI3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ5CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NTAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjUyCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMjggLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMDIKICAgIC8vIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrID0gVUludDY0KCkKICAgIGJ5dGVjIDI5IC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMwogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkdMT0JBTF9CWVRFUywgZXJyLldST05HX0dMT0JBTF9CWVRFUwogICAgdHhuIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDIwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE3LTMwCiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIEZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4MjVkYmE5NWIgLy8gbWV0aG9kICJhc3NldF91cGRhdGUoKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE3LTMwCiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIEZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzNgogICAgcHVzaGJ5dGVzcyAweDg5NDc0MTM0IDB4NDQzNjNkNDkgMHg1M2JlZjA0NSAweDY3ZGI0ZjIwIDB4ZjZhOTZjOGQgMHg4Y2YxNGI1MSAweDljNzZiNmEzIDB4NGZkNmEzY2MgMHgxZDZmYzI1NSAweDI1ZTk5OTdmIDB4NmM4NWUzZWUgMHg0MDJkYmE0NyAweGZhZDIxNzNlIDB4MDhlZmVhMzUgMHhlNGE1YWI1NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg0YzExM2VkNSAweDc0YTcyOTdmIDB4MTA1YzE4NGUgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4MDNiODMzMjkgMHgzZGJlODBiZCAweGRmNTRlODJjIDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweGMzZTRiMjk3IC8vIG1ldGhvZCAiYXNzZXRfY29uZmlnKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNltdLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpKSIsIG1ldGhvZCAiZ2V0X2NvdXBvbl9yYXRlcygpdWludDE2W10iLCBtZXRob2QgImdldF9wYXltZW50X2Ftb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0X2NvdXBvbnNfc3RhdHVzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpLGJvb2wpIiwgbWV0aG9kICJwYXlfY291cG9uKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LGJ5dGVbXSkiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jb25maWcgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSBnZXRfY291cG9uX3JhdGVzIGdldF9wYXltZW50X2Ftb3VudCBnZXRfY291cG9uc19zdGF0dXMgcGF5X2NvdXBvbiBwYXlfcHJpbmNpcGFsIGFzc2V0X3RyYW5zZmVyIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMgc2V0X2RlZmF1bHRfc3RhdHVzIHByaW1hcnlfZGlzdHJpYnV0aW9uIGdldF9hc3NldF9pbmZvIGdldF90aW1lX2V2ZW50cyBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSBnZXRfYXNzZXRfbWV0YWRhdGEgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF9jbG9zZSBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfaW5mbyByYmFjX3JvdGF0ZV9hcnJhbmdlciByYmFjX3NldF9vcF9kYWVtb24gcmJhY19hc3NpZ25fcm9sZSByYmFjX3Jldm9rZV9yb2xlIHJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX2NvbmZpZwogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDM2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE3LTMwCiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIEZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4M2YwZWZjNmMgLy8gbWV0aG9kICJhc3NldF9jcmVhdGUoYWRkcmVzcywodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYXNzZXRfY3JlYXRlCiAgICBlcnIKCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGFzc2V0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzLnBhbS5QQU1Db3JlTWl4aW4uYXNzZXRfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgY292ZXIgNwogICAgbGVuCiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDE2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDE2PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBjb3ZlciA3CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDgKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDgKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dHVwbGU8dWludDY0LHVpbnQ2ND4+CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyMjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGVudW1zLlNUQVRVU19JTkFDVElWRSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1NS01NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBkZW5vbWluYXRpb24gd2l0aCBBU0EKICAgIC8vIF9jcmVhdG9yLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jcmVhdG9yKGRlbm9taW5hdGlvbl9hc3NldF9pZCkKICAgIGRpZyA1CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1NwogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjYwCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IGRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgYnl0ZWMgMTYgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGRpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjUKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGRpZyA0CiAgICB1bmNvdmVyIDYKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo2My02NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHNldHRsZW1lbnQgYXNzZXQgaXMgdGhlIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRVRUTEVNRU5UX0FTU0VUCiAgICBhc3NlcnQgLy8gRGlmZmVyZW50IHNldHRsZW1lbnQgYXNzZXQgbm90IHN1cHBvcnRlZCwgbXVzdCBiZSBlcXVhbCB0byBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjY5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIzOC0yMzkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCBwcmluY2lwYWwgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbiA9PSAwLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgZGlnIDMKICAgIGRpZyAyCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24KICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbCAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIGJ5dGVjIDE1IC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNDIKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gcHJpbmNpcGFsX2Rpc2NvdW50CiAgICBieXRlYyAyNiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ0LTI0NQogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjgyCiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIGludGMgNCAvLyAyNTUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojc5LTgzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojg2CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDE3IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ4LTI0OQogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLmFzX3VpbnQ2NCgpKQogICAgZGlnIDYKICAgIGJ0b2kKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6ODktOTAKICAgIC8vICMgVGhpcyBzdWJyb3V0aW5lIG11c3QgYmUgdXNlZCBhZnRlciB0aGUgcHJpbmNpcGFsIGRpc2NvdW50IGhhcyBiZWVuIHNldAogICAgLy8gaWYgbm90IHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgYm56IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjkxCiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZGlnIDcKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6OTQKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDMzIC8vICJpbnRlcmVzdF9yYXRlIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMDUKICAgIC8vIGFzc2VydCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMDgKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEwOQogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAxOSAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTkgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBkaWcgNwogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA0CiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBwdXNoaW50IDQKICAgICsKICAgIGRpZyAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTAzLTEwNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjU4CiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBkaWcgMwogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMjcKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyOC0xMzAKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTI4LTEzMAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzMS0xMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIGRpZyAxCiAgICBwdXNoaW50IDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTMxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMjcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzMS0xMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzQKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0KICAgIGRpZyAxCiAgICBwdXNoaW50IDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzUKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0KICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzOAogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGRpZyAxCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjY1CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjIyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjIyLTIyMwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIyMwogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjIyLTIyMwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIyMS0yMjQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjI2CiAgICAvLyBhc3NlcnQgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuSU5WQUxJRF9VTklUUwogICAgZHVwCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAOAogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMjYKICAgIC8vIGFzc2VydCAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMjgtMjI5CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZGlnIDEKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMzAtMjMxCiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0IGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjMyCiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjMzCiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMzUtMjM2CiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIzNwogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgc3dhcAogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIzOAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIzOQogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQwLTI0MgogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCB1bml0cywgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGRpZyAzCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI0MwogICAgLy8gbnVtZXJhdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI0NAogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQ5LTI1MgogICAgLy8gZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPW51bWVyYXRvciwKICAgIC8vICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICksCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQ2LTI1MwogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUsCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgZGlnIDcKICAgIGl0b2IKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDkKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5GaXhlZENvdXBvbkNhc2hmbG93TWl4aW4uZ2V0X2NvdXBvbl9yYXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9jb3Vwb25fcmF0ZXM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNjMKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHR5cC5Db3Vwb25SYXRlcygpCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjY0CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNjUKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHNlbGYuY291cG9uX3JhdGVzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTkgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9yYXRlcyBleGlzdHMKCmdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLmdldF9wYXltZW50X2Ftb3VudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyODMKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6Mjg0CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gVUludDY0KCkKICAgIGR1cG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI4NQogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyODYKICAgIC8vIHBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucwogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI4NwogICAgLy8gaWYgcGFpZF9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIDwKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9lbHNlX2JvZHlANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjkwCiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI5MQogICAgLy8gcGFpZF9jb3Vwb25zICsgMSwKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6Mjg4LTI5MgogICAgLy8gIyBDb3Vwb24gUGF5bWVudAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5jb3Vwb25faW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpLAogICAgLy8gICAgIHBhaWRfY291cG9ucyArIDEsCiAgICAvLyApCiAgICBjYWxsc3ViIGNvdXBvbl9pbnRlcmVzdF9hbW91bnQKICAgIGJ1cnkgMgoKZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI5Ni0yOTkKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGRpZyAxCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfcGF5bWVudF9hbW91bnRfZWxzZV9ib2R5QDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyOTQtMjk1CiAgICAvLyAjIFByaW5jaXBhbCBQYXltZW50CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIGJ1cnkgMQogICAgYiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA2CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLmdldF9jb3Vwb25zX3N0YXR1c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9jb3Vwb25zX3N0YXR1czoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxMAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cG4gMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzExCiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZSA9IHNlbGYubmV4dF9jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpCiAgICBjYWxsc3ViIG5leHRfY291cG9uX2R1ZV9kYXRlCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTIKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkID0gc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucykKICAgIGR1cAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzEzCiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxNAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxNQogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTYKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBkaWcgNAogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTcKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTgKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDEKCmdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMjAKICAgIC8vIHRvdGFsX2NvdXBvbnM9c2VsZi50b3RhbF9jb3Vwb25zLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMyMy0zMjYKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1udW1lcmF0b3IsCiAgICAvLyAgICAgZGVub21pbmF0b3I9ZGVub21pbmF0b3IsCiAgICAvLyApLAogICAgZGlnIDIKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxOS0zMjgKICAgIC8vIHJldHVybiB0eXAuQ291cG9uc0luZm8oCiAgICAvLyAgICAgdG90YWxfY291cG9ucz1zZWxmLnRvdGFsX2NvdXBvbnMsCiAgICAvLyAgICAgZHVlX2NvdXBvbnM9ZHVlX2NvdXBvbnMsCiAgICAvLyAgICAgbmV4dF9jb3Vwb25fZHVlX2RhdGU9bmV4dF9jb3Vwb25fZHVlX2RhdGUsCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1udW1lcmF0b3IsCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWRlbm9taW5hdG9yLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YWxsX2R1ZV9jb3Vwb25zX3BhaWQsCiAgICAvLyApCiAgICBzd2FwCiAgICBpdG9iCiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDMxIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICBkaWcgNQogICAgc2V0Yml0CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LmNvdXBvbi5Db3Vwb25QYXltZW50QWdlbnRNaXhpbi5wYXlfY291cG9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcGF5X2NvdXBvbjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzkKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0CiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5PX1VOSVRTCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ3CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDgKICAgIC8vIGFjY291bnRfcGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ5CiAgICAvLyBhc3NlcnQgZHVlX2NvdXBvbnMgPiBhY2NvdW50X3BhaWRfY291cG9ucywgZXJyLk5PX0RVRV9DT1VQT04KICAgIHN3YXAKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNvdXBvbiB0byBwYXkKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUwLTUzCiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyB2ZXJpZnkgaWYgb3RoZXIgYWNjb3VudHMgYXJlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBwYXltZW50IG9mIHByZXZpb3VzIGNvdXBvbnMKICAgIC8vIGFzc2VydCBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKAogICAgLy8gICAgIGFjY291bnRfcGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgZHVwCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE5NwogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICBkaWcgMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxOTgKICAgIC8vIGFjY291bnRfcGFpZF9jb3Vwb25zICsgMSwKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxOTYtMTk5CiAgICAvLyByZXR1cm4gc2VsZi5jb3Vwb25faW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpLAogICAgLy8gICAgIGFjY291bnRfcGFpZF9jb3Vwb25zICsgMSwKICAgIC8vICkKICAgIGNhbGxzdWIgY291cG9uX2ludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo1NAogICAgLy8gc2VsZi5hc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjU3CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgY2FsbHN1YiBpc19wYXltZW50X2V4ZWN1dGFibGUKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NTgtNTkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgZHVwbiAyCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NjAtNjEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyArPSAxCiAgICBkaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjQKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBkaWcgMgogICAgKwogICAgYnl0ZWMgMjggLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MTcKICAgIC8vIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjIwCiAgICAvLyB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToyMgogICAgLy8gY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjIzCiAgICAvLyBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjI0CiAgICAvLyBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNi0yNwogICAgLy8gRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX0lQKSwKICAgIC8vICAgICB0eXBlX25hbWU9U3RyaW5nKCJJUCIpLAogICAgLy8gICAgIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIC8vICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgbm9taW5hbF9yYXRlX2Jwcz1hcmM0LlVJbnQxNigwKSwgICMgVE9ETzogQWRkIGludGVyZXN0IHJhdGUKICAgIC8vICAgICBub21pbmFsX2FjY3J1ZWQ9VUludDY0KDApLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwODAwMzcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyAzNSAvLyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9JUCksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToyNgogICAgLy8gbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfSVApLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIklQIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLCAgIyBUT0RPOiBBZGQgaW50ZXJlc3QgcmF0ZQogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI0OTUwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX0lQKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnl0ZWMgMzYgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo3MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo2OC03MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgMzcgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwYXlfY291cG9uX2Vsc2VfYm9keUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo2My02NAogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQogICAgYiBwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VANAoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5wcmluY2lwYWwuUHJpbmNpcGFsUGF5bWVudEFnZW50TWl4aW4ucGF5X3ByaW5jaXBhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBheV9wcmluY2lwYWw6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjE2LTE3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIxCiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIyCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjMKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3OAogICAgLy8gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3Ni03OQogICAgLy8gIyBQcmluY2lwYWwgcGF5bWVudCBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo4MAogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBkdXAKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgc3dhcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo1MwogICAgLy8gc2VsZi5hc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjU2CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgY2FsbHN1YiBpc19wYXltZW50X2V4ZWN1dGFibGUKICAgIGJ6IHBheV9wcmluY2lwYWxfZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NTctNTgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgZHVwbiAyCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NTktNjAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTk5CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjAwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgaW50Y18yIC8vIDMyCiAgICBkaWcgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIwMQogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MTcKICAgIC8vIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjIwCiAgICAvLyB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToyMgogICAgLy8gY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjIzCiAgICAvLyBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjI0CiAgICAvLyBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNi0yNwogICAgLy8gRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX1BSKSwKICAgIC8vICAgICB0eXBlX25hbWU9U3RyaW5nKCJQUiIpLAogICAgLy8gICAgIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIC8vICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgbm9taW5hbF9yYXRlX2Jwcz1hcmM0LlVJbnQxNigwKSwKICAgIC8vICAgICBub21pbmFsX2FjY3J1ZWQ9VUludDY0KDApLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMzAwMzcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyAzNSAvLyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9QUiksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI1MDUyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX1BSKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnl0ZWMgMzYgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2OQogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2Ny03MQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgMzcgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2Mi02MwogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQogICAgYiBwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VANAoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuY291cG9uLkNvdXBvblRyYW5zZmVyQWdlbnRNaXhpbi5hc3NldF90cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3RyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTUzLTE1OAogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyBhbmQgKAogICAgLy8gICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1NAogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTUzLTE1OAogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyBhbmQgKAogICAgLy8gICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1NgogICAgLy8gbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX3RydWVANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU3CiAgICAvLyBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1Mi0xNTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIGFuZCAoCiAgICAvLyAgICAgICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICkKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNjktMTcxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAyCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICB1bmNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZQogICAgZXh0cmFjdCA0MCA4CiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NAogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0cyA+IFVJbnQ2NCgwKToKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU3LTYwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjQ2LTQ3CiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjktNzAKICAgIC8vICMgVHJhbnNmZXIgaXMgZm9yYmlkZGVuIGluIGNhc2Ugb2YgcGVuZGluZyBjb3Vwb24gcGF5bWVudHMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMsIGR1ZV9jb3Vwb25zKQogICAgc3dhcAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MQogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAyCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgLT0gdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1MgogICAgLy8gaWYgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPT0gVUludDY0KDApOgogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MAogICAgZGlnIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IFVJbnQ2NCgwKQogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjUzCiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZW5kZXJfdW5pdF92YWx1ZSArIGFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyA0CiAgICAqCiAgICBkaWcgNQogICAgKwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9jb3Vwb24ucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAyMQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDk6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBkaWcgNQogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICBkaWcgMTAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zCiAgICBkaWcgNwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA3CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA3IG9mICh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0MgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Bc3NldE1ldGFkYXRhCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzcKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBwdXNoaW50IDM4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDcgb2YgKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4WzMyXSwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDQyCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkFzc2V0TWV0YWRhdGEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4NC0yODcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4OAogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzExCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNSAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE1CiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE2CiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBkdXAKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICBkaWcgMQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgYnVyeSA0CiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjAtMzIxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWF0KICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE5LTMyMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfT1BFTklOR19EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IG9wZW5pbmcgZGF0ZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIzCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMy0zMjUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjkKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWF0KICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOC0zMjkKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYXQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjctMzMwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWF0KICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzEKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTEgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMxLTMzMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM1CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1zZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNgogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPXNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uc2V0X2RlZmF1bHRfc3RhdHVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzQKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMCAvLyAweDUyMzYzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTIKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gZGVmYXVsdGVkCiAgICBieXRlYyAyNCAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1MwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NS0xNDgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDcKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2LTE0NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ni0xNDgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ4CiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDctMTQ4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZGlnIDMKICAgID4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ni0xNDgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NC0xNDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3MQogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMzUzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4NQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg2CiAgICAvLyBhc3NlcnQgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMsIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODgKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZGlnIDIKICAgIGludGNfMiAvLyAzMgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzkwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDQwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozOTEKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5jaXJjdWxhdGluZ191bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uZ2V0X2Fzc2V0X2luZm9bcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwMwogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9QRVJGT1JNQU5UKQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwNAogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLm1hdHVyaXR5X2RhdGUgPiAwOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0CiAgICBkdXAKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA1CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQKICAgIGJ1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA2LTQwNwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBubyBncmFjZSBvciBkZWxpbnF1ZW5jeSBwZXJpb2RzCiAgICAvLyBpZiBzZWxmLmFzc2V0X2RlZmF1bHRlZDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA4CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX0RFRkFVTFRFRCkKICAgIHB1c2hpbnQgMwogICAgYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTEKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMgogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ1CiAgICAvLyByZXR1cm4gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGR1cDIKICAgICoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxNQogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTYKICAgIC8vIHByaW5jaXBhbF9kaXNjb3VudD1hcmM0LlVJbnQxNihzZWxmLnByaW5jaXBhbF9kaXNjb3VudCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmluY2lwYWxfZGlzY291bnQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxNwogICAgLy8gaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMzIC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxOAogICAgLy8gdG90YWxfc3VwcGx5PXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjEKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyMgogICAgLy8gaXNzdWFuY2VfZGF0ZT1zZWxmLmlzc3VhbmNlX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIzCiAgICAvLyBtYXR1cml0eV9kYXRlPXNlbGYubWF0dXJpdHlfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjQKICAgIC8vIHN1c3BlbmRlZD1zZWxmLmFzc2V0X3N1c3BlbmRlZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyNQogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBkaWcgMTUKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMC00MjYKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5pZCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPXNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgLy8gICAgIHByaW5jaXBhbF9kaXNjb3VudD1hcmM0LlVJbnQxNihzZWxmLnByaW5jaXBhbF9kaXNjb3VudCksCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgLy8gICAgIHRvdGFsX3N1cHBseT1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUsCiAgICAvLyAgICAgaXNzdWFuY2VfZGF0ZT1zZWxmLmlzc3VhbmNlX2RhdGUsCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1zZWxmLm1hdHVyaXR5X2RhdGUsCiAgICAvLyAgICAgc3VzcGVuZGVkPXNlbGYuYXNzZXRfc3VzcGVuZGVkLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDMxIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF90aW1lX2V2ZW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzNgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDM3CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzOAogICAgLy8gdGltZV9ldmVudHMgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKCmdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ1MAogICAgLy8gKHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ0OS00NTEKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICAoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSkKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfYXNzZXRfbWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NjIKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dvdl9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nb3Zfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDEzIC8vIDB4NTIzNzMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxNCAvLyAweDUyMzQzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNSAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDIKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDYKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0LTE1MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1VSW50NjQoMCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMzEgLy8gMHgwMAogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfY2xvc2Vbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2Nsb3NlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTQgLy8gMHg1MjM0MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzQKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NQogICAgLy8gZGVsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NwogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzgKICAgIC8vIHJldHVybiBjbG9zZWRfdW5pdHMsIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwMgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMjIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzQKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjMyMzUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnQgMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE0IC8vIDB4NTIzNDMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxMyAvLyAweDUyMzczMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMyIC8vIDB4NTIzODMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE0IC8vIDB4NTIzNDMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjM1MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMCAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEzIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMyIC8vIDB4NTIzODMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gZGVsIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTMgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDIzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMTQgLy8gMHg1MjM0MzAyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMTMgLy8gMHg1MjM3MzAyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDMxIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX2NvbmZpZzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTQKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NwogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYtMzI3CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI3CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDEzIC8vIDB4NTIzNzMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMAogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMwogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNjMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTUKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE0IC8vIDB4NTIzNDMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDItMzA0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OC0zMDAKICAgIC8vIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5jb3VudF9kdWVfY291cG9ucygpIC0+IHVpbnQ2NDoKY291bnRfZHVlX2NvdXBvbnM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTEKICAgIC8vIGRlZiBjb3VudF9kdWVfY291cG9ucyhzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTEyCiAgICAvLyBjdXJyZW50X3RzID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTEzCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTQKICAgIC8vIGlmIGN1cnJlbnRfdHMgPj0gc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBieiBjb3VudF9kdWVfY291cG9uc19lbHNlX2JvZHlAMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTE1CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYudG90YWxfY291cG9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTI5CiAgICAvLyBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyayA9IGR1ZV9jb3Vwb25zCiAgICBieXRlYyAyOSAvLyAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzMAogICAgLy8gcmV0dXJuIGR1ZV9jb3Vwb25zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY291bnRfZHVlX2NvdXBvbnNfZWxzZV9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTYKICAgIC8vIGVsaWYgY3VycmVudF90cyA+IHNlbGYuaXNzdWFuY2VfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTgKICAgIC8vIFVJbnQ2NChmaXhlZF9jZmcuRklSU1RfQ09VUE9OX0RBVEVfSURYKSArIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgZXhpc3RzCiAgICBwdXNoaW50IDMKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjAKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQoKY291bnRfZHVlX2NvdXBvbnNfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjEKICAgIC8vIHdoaWxlIGN1cnJlbnRfdHMgPj0gY291cG9uX2R1ZV9kYXRlOgogICAgZnJhbWVfZGlnIDEKICAgIDw9CiAgICBieiBjb3VudF9kdWVfY291cG9uc19hZnRlcl93aGlsZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjMKICAgIC8vIHJlcXVpcmVkX2J1ZGdldD1VSW50NjQoZml4ZWRfY2ZnLk9QX1VQX0NPVVBPTl9EVUVfQ09VTlRJTkcpLAogICAgaW50YyA0IC8vIDI1NQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTI0CiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTIyLTEyNQogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9VUludDY0KGZpeGVkX2NmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEyNgogICAgLy8gY291cG9uX2lkeCArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjcKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYiBjb3VudF9kdWVfY291cG9uc193aGlsZV90b3BANAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEyOAogICAgLy8gZHVlX2NvdXBvbnMgPSBjb3Vwb25faWR4IC0gZml4ZWRfY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMwogICAgLQogICAgZnJhbWVfYnVyeSAyCiAgICBiIGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAOAoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5jb3Vwb25fZHVlX2RhdGUoY291cG9uOiB1aW50NjQpIC0+IHVpbnQ2NDoKY291cG9uX2R1ZV9kYXRlOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTMyCiAgICAvLyBkZWYgY291cG9uX2R1ZV9kYXRlKHNlbGYsIGNvdXBvbjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzMwogICAgLy8gcmV0dXJuIHNlbGYudGltZV9ldmVudHMudmFsdWVbZml4ZWRfY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWCArIGNvdXBvbiAtIDFdCiAgICBwdXNoaW50IDMKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKbmV4dF9jb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDEKICAgIC8vIGRlZiBuZXh0X2NvdXBvbl9kdWVfZGF0ZShzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE0MgogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDMKICAgIC8vIGlmIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgZHVwCiAgICBieXRlYyA3IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGJ6IG5leHRfY291cG9uX2R1ZV9kYXRlX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTQ0CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLmNvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucyArIDEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAwCgpuZXh0X2NvdXBvbl9kdWVfZGF0ZV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDUKICAgIC8vIHJldHVybiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5GaXhlZENvdXBvbkNhc2hmbG93TWl4aW4uY291cG9uX2ludGVyZXN0X2Ftb3VudChwcmluY2lwYWxfYW1vdW50OiB1aW50NjQsIGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDctMTQ5CiAgICAvLyBkZWYgY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBwcmluY2lwYWxfYW1vdW50OiBVSW50NjQsIGNvdXBvbjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTUwCiAgICAvLyBjb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVtjb3Vwb24gLSAxXS5hc191aW50NjQoKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDE5IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgc3dhcAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTUxCiAgICAvLyByZXR1cm4gcHJpbmNpcGFsX2Ftb3VudCAqIGNvdXBvbl9yYXRlX2JwcyAvLyBjc3QuQlBTCiAgICBmcmFtZV9kaWcgLTIKICAgICoKICAgIHB1c2hpbnQgMTAwMDAKICAgIC8KICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTUzCiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNTQtMTU1CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE1NgogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTU5CiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCAtIGFjY3J1aW5nX3N0YXJ0X3RpbWUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAxCiAgICAtCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE2MAogICAgLy8gY291cG9uX3BlcmlvZCA9IHNlbGYubmV4dF9jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG5leHRfY291cG9uX2R1ZV9kYXRlCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNjEKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE2MgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjIDYgLy8gODY0MDAKICAgIC8KCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTY0LTE2NwogICAgLy8gcmV0dXJuIHR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9Y291cG9uX2FjY3J1ZWRfcGVyaW9kLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWNvdXBvbl9wZXJpb2QsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGF5X2NvdW50X2ZhY3Rvcl9lbHNlX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzNgogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzNwogICAgLy8gaWYgZHVlX2NvdXBvbnMgPj0gVUludDY0KDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBieiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTM4CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLmNvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMQoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDg6CiAgICBmcmFtZV9kaWcgMQogICAgYiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmlzX2FjY3J1aW5nX2ludGVyZXN0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTY5CiAgICAvLyBkZWYgaXNfYWNjcnVpbmdfaW50ZXJlc3Qoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTcxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MS0xNzMKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTcyCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MS0xNzMKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTczCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MS0xNzMKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MC0xNzQKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICAvLyApCiAgICByZXRzdWIKCmlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNzAtMTc0CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNzYtMTc4CiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50LCB1bml0czogVUludDY0LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTc5LTE4MAogICAgLy8gIyBUaGUgZm9sbG93aW5nIGFzc2VydCBzYWZlZ3VhcmRzIHRoZSBzdWJyb3V0aW5lIGZyb20gZm9yYmlkZGVuIGludm9jYXRpb25zCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTgxCiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE4MgogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxODMKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE4NAogICAgLy8gbmV4dF9jb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVtkdWVfY291cG9uc10uYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDE5IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgc3dhcAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE4Ny0xODgKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBuZXh0X2NvdXBvbl9yYXRlX2JwcwogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg3LTE4OQogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxOTAKICAgIC8vIC8vIChjc3QuQlBTICogY291cG9uX3BlcmlvZCkKICAgIHB1c2hpbnQgMTAwMDAKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg3LTE5MAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kKQogICAgLwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg1LTE5MQogICAgLy8gIyBkdWVfY291cG9ucyBpcyBlcXVhbCB0byB0aGUgMC1iYXNlIGlkeCBvZiBuZXh0IGNvdXBvbgogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAgICAgKiBjb3Vwb25fYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QpCiAgICAvLyApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5Db3Vwb25DYXNoZmxvd01peGluLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWxsX2R1ZV9jb3Vwb25zX3BhaWQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNgogICAgLy8gZGVmIGFsbF9kdWVfY291cG9uc19wYWlkKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI3CiAgICAvLyByZXR1cm4gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA+PSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogZHVlX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgID49CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5Db3Vwb25DYXNoZmxvd01peGluLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHZvaWQ6CmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjktMzEKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMi0zNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5jb21tb24uUGF5bWVudEFnZW50Q29tbW9uTWl4aW4uYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgphc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxMgogICAgLy8gZGVmIGFzc2VydF9wYXltZW50X2F1dGhvcml6YXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjEzCiAgICAvLyBpZiBzZWxmLm9wX2RhZW1vbi52YWx1ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9ib29sX3RydWVANAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNgogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTUtMTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGFzc2VydF9wYXltZW50X2F1dGhvcml6YXRpb25fYm9vbF90cnVlQDQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uX2Jvb2xfZmFsc2VANQoKYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9ib29sX3RydWVANDoKICAgIGludGNfMSAvLyAxCgphc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTQtMTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAoKYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCmFzc2VydF9wYXltZW50X2F1dGhvcml6YXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9ib29sX21lcmdlQDYKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuY29tbW9uLlBheW1lbnRBZ2VudENvbW1vbk1peGluLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmlzX3BheW1lbnRfZXhlY3V0YWJsZToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjAKICAgIC8vIGRlZiBpc19wYXltZW50X2V4ZWN1dGFibGUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjItMjQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyLTI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyNQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0NDgKICAgIGdldGJpdAogICAgYm56IGlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgppc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9tZXJnZUA0OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyMS0yNgogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gICAgICkKICAgIC8vICAgICBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgLy8gKQogICAgc3dhcAogICAgcmV0c3ViCgppc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfbWVyZ2VANAoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5jb21tb24uUGF5bWVudEFnZW50Q29tbW9uTWl4aW4uYXNzZXJ0X2Vub3VnaF9mdW5kcyhwYXltZW50X2Ftb3VudDogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfZW5vdWdoX2Z1bmRzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyOAogICAgLy8gZGVmIGFzc2VydF9lbm91Z2hfZnVuZHMoc2VsZiwgcGF5bWVudF9hbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozMAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjMwLTMxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGZyYW1lX2RpZyAtMQogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjktMzIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LmNvbW1vbi5QYXltZW50QWdlbnRDb21tb25NaXhpbi5wYXkocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKcGF5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNAogICAgLy8gZGVmIHBheShzZWxmLCByZWNlaXZlcjogQWNjb3VudCwgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjM5CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNgogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwNwogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA5CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0KICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTEwCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDktMTEwCiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0KICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwOC0xMTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTEyCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE0CiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9USU1FX0VWRU5UX1NPUlRJTkcpLAogICAgcHVzaGludCA2NQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE1CiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTMtMTE2CiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD1VSW50NjQoY2ZnLk9QX1VQX1RJTUVfRVZFTlRfU09SVElORyksCiAgICAvLyAgICAgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkFwcEFjY291bnQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExNwogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbaWR4XQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE4CiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tpZHggKyAxXQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTkKICAgIC8vIGFzc2VydCB0aW1lX2YgPiB0aW1lX2ksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMAogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiAhPSBVSW50NjQoY3N0LkRDQ19DT05UKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpbnRjIDQgLy8gMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMzCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM2CiAgICAvLyBkZWYgYWNjb3VudF91bml0c192YWx1ZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIHVuaXRzOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM3CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzkKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDEKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDAtNDIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpIC0+IHZvaWQ6CmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0czoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0OAogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ5CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA1IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1MgogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X3N1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDgK", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" - }, - "byteCode": { - "approval": "DCAHAAEgCP8ByAGAowUmJgQVH3x1BFIzMCMGc3RhdHVzEWNpcmN1bGF0aW5nX3VuaXRzDWlzc3VhbmNlX2RhdGUNbWF0dXJpdHlfZGF0ZQp1bml0X3ZhbHVlDXRvdGFsX2NvdXBvbnMEUjIwIxNzZXR0bGVtZW50X2Fzc2V0X2lkIXByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZR1zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQp0aW1lRXZlbnRzBFI3MCMEUjQwIwt0b3RhbF91bml0cxVkZW5vbWluYXRpb25fYXNzZXRfaWQUZGF5X2NvdW50X2NvbnZlbnRpb24dc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGULY291cG9uUmF0ZXMEUjYwIwRSNTAjBFIyNSMPYXNzZXRfc3VzcGVuZGVkD2Fzc2V0X2RlZmF1bHRlZAhtZXRhZGF0YRJwcmluY2lwYWxfZGlzY291bnQhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlEXBhaWRfY291cG9uX3VuaXRzFWR1ZV9jb3Vwb25zX3dhdGVybWFyawIAAAEABFI4MCMNaW50ZXJlc3RfcmF0ZQMGgQECADsEjCmQTgIAEjEYQAB1JwgyA2cnFjIDZycXImcnGCJnJw8iZysiZycGImcqImcnECJnJwkiZycGImcnESJnJxmAAGcnGiJnJyEiZycHImcnCiJnJxsiZycEImcnEiJnJwsiZycFImcnHCJnJx0iZzE1gQMSRDE0gRQSRDE3FEQxNhREgAQl26lbNhoAjgEA4zEZFEQxGEEAzIIcBIlHQTQERDY9SQRTvvBFBGfbTyAE9qlsjQSM8UtRBJx2tqMET9ajzAQdb8JVBCXpmX8EbIXj7gRALbpHBPrSFz4ECO/qNQTkpatUBNwGOzUEFPwQ7wRMET7VBHSnKX8EEFwYTgSC9xstBO8E9dMEA7gzKQQ9voC9BN9U6CwEAQyCmQR0BqzSBMPkspc2GgCOHABWAa0CUgJsAsMDDgQUBQwGsAcvB04H5AizCM0I6AjzCSwJdgmzCeUJ/QoVCi0K6Qt/C54LqQvzAIAEPw78bDYaAI4BBk4AMRmBBBIxGBBEQgZwigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScish4nIrIfi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74mAADYaAUkVJRJEFzYaAkkVJRJEFzYaA0kVJRJEFzYaBEkVJRJEFzYaBUkVJRJEFzYaBkkVIxJENhoHSU4HFYECEkQ2GghJTgdJIllJTgiBAguBAghMFRJENhoJSU4HSSJZSU4IJQuBAghMFRJENhoKSSJZSU4IgRALgQIITBUSRIgOqiIqZUQUREsFcQtFAUQnEEsGZ0sETwYSRCcJSwVnsTIAMgoishKyFE8FshGBBLIQsgGzSwNLAhgURCcGSwJnTwNPAgonD0xnJxpPAmcXSUEAB0khBBJBAHgjRCcRSwFnSwYXRQgiJxplREAAA0sHRCchSwhnSwRJRCcHSwFnJxO8SCcTSwe/gQQISwMSREsDiA09Jwy8SCcMSwG/SVcCAEsBgQJbJwpMZ0sBgQpbJxtMZ0sBgRJbJwRMZ0wiWSMJJQtbJwVMZ0sBFEQqgWRnI0MiQv+FIoAARwQ2GgFJFSQSRDYaAkkVJRJEFyInCmVEQQCDMgciJwplRA9BAHgjRClLAlBJRQm9RQFESUEAY0sHvkQkW0sBD0EAVyNESwFJSwKIDSRFCCJFByJFBCJFBogKe0lFBkxLAYgL8ogLgkEAGksDSYgLLEsDSwNPA4gLlUUHSSJbRQQlW0UFSwIWSwUWUEsHFksHFlBMUChMULAjQyJC/6YiQv+FJx4iKmVEgWQSQQAHJxO+TEUCRChLAVCwI0OAADYaAUcCFSQSRClMUEm9RQFEIkcCKmVEgWQSQQAhSwK+RIEwW0lFBiInB2VEDEEAG0sDiAyOSwUjCIgKhkUCSwEWSwEWUChMULAjQ0sDiAxzRQFC/+mICcBHAogKSUxJiAslTCJMIkyICsFBAA5LBIgKbEkiW0UDJVtFASInB2VESwIWSwIWUEwWSwYWUEsFFlBMUCcfIksFVFAoTFCwI0M2GgFJFSQSRDYaAkkiWYECCEsBFRJEVwIATCIqZUSBZBJEiAxaiAxfKUsBUElOAkm9RQFESb5IJFtJTgNEiAk4TL5EgTBbTEsBDURJiAqYREsBiAvOTCMIiAnHTEmICqmICt1BAJpHAogLAEsDvkRXACBMiAsHSwJJvkSBMFsjCBaBMEy7IiccZURLAggnHExnMggyByInEGVESXEDRCIrZUQiJwZlRAtPBBaAAwgAN1BPBBZQSwQWTEsBUE8EFlBLAxUWVwYCTwRQTCcjUE8DFlAnHlAiFlCABAACSVBQTFAnJExQsDIHFlBLBEkVFlcGAkxQTCclUExQKExQsCNDIkUBQv9wNhoBSRUkEkQ2GgJJIlmBAghLARUSRFcCAEwiKmVEgWQSRIgLVIgLWSlLAVBJTgJJvUUBRL5IJFtEMgciJwVlRA9EiAgtiAmZREmICtBMSYgJsYgJ5UEAmkcCiAoISwK+RFcAIEyICg8iK2VESwJJTgK+RCRbCStMZyIWTCRLAruICqwyCDIHIicQZURJcQNEIitlRCInBmVEC08EFoADAwA3UE8EFlBLBRZMSwFQTwQWUEsDFRZXBgJPBFBMJyNQTwMWUCceUE8DUIAEAAJQUlBMUCckTFCwMgcWUEsDSRUWVwYCTFBMJyVQTFAoTFCwI0MiRQFC/3AiRwKAAEk2GgFJFSQSRDYaAkkVJBJENhoDSRUlEkQXIiplRIFkEkEBIyInEmVEMgcOQQEYIicLZURBAAsyByInC2VEDEEBBSNEMQBLA0lOAhJEiAosiAoxKUsBUElFCUm9RQFEKUsESU4CUElFCkm9RQFESwOICY1LAYgJiE8DTwITREsCSURPAr5ESSRbTwIPRFcoCEUJvkQkW0EAmEsGvkSBKFtLBr5EgShbEkEAgksGvkSBMFtLBr5EgTBbEkEAcCNESwZJvkSBKFtFBYgGqUsESU4CSwGICB9MSwNJTgNPAogHzEUHSwG+RCRbSg5ETAkWSwEkTwK7vkgkW0AAECIWSwdJTgKBKEsCu4EwTLtLBUm+RCRbSwJJTgIIFk8CJE8Cu0sEC0sFCBYoTFCwI0MiQv+NSwVJgShLCrtLB75EVzAIgTBMu0L/eCJC/vg2GgFJFSQSRDYaAkkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkQnCE8CZycZTGcjQzYaAUkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkSICNknGUxnI0MiNhoBRwIiWUklC4ECCE8CFRJEiAi9IiplRCEFEhREiAi7SUQjDUEABkmIB8tFASInBGVESwFJVwIARQSBAltMSwEORCcSTGciJwVlREEAGiInBWVESwEiWSMJJQtLA0xbTEsBD0QnC0xnIicSZUQiJwtlREwWTBZQKExQsCNDNhoBSRUjEkQiUycUMQCICA9EJxhMZzIHFihMULAjQ4AANhoBSRUkEkQ2GgJJFSUSRBciKmVEgWQSQQB1IicKZUQyB0lFBQ5BAGciJxtlREsDDUEAXCNEJxUxAIgHwkQpSwJQSb1FAUSIB/OIB/hLAUlEIitlREsBCCInD2VESwEPRCtLAWdLAr5EJFtPAggWSwIkTwK7IicGZUQWTwKBKE8CuyInD2VETAkWKExQsCNDIkL/oSIyByInBWVMSU4CTgNEDUEACElBAASBBEUCIicYZURBAASBA0UCIicQZUQiJwllRCIrZUQiJwZlREoLIicRZUQWSZMlDkRXBwEiJxplRBZJk4EQDkRXBgIiJyFlRBZJk4EQDkRXBgIiJw9lRCInCmVEIicbZUQiJwRlRCInBWVEIicXZURLDxZJkyUORFcHAU8OFk8OFlBPCxZQTwsWUE8KUE8JUE8IUE8HFlBPBxZQTwYWUE8FFlBPBBZQTwMWUCcfIk8EVFBMUChMULAjQyceIiplRIFkEkEABycMvkxFAkQoSwFQsCNDIicSZUQiJwtlREwWgAIAAkxQTBZQKExQsCNDIicZZUQoTFCwI0M2GgFJFSQSRDYaAkkVIxJEIlMnDTEAiAZDRClPAlBJvUUBREmBOCO6Ik8DVIE4TLsyBxYoTFCwI0M2GgFJFSQSRDYaAkkVJBJEJw4xAIgGDEQiKmVEIQUSFESIBj2IBkIpTwJQSb1FARREIhZPAksBUEsBUExQJx9QvzIHFihMULAjQzYaAUkVJBJEJw4xAIgFykSIBgQpTFBJvUUBREm+SCRbTLxIIitlREsBCStMZ4gFnTIHTBZMFlAoTFCwI0M2GgFJFSQSRDYaAkkVJBJEMQBLAhJEiAXBiAXGKU8CUEm9RQFEIk8CuzIHFihMULAjQzYaAUkVJBJEKUxQSb1FAUS+SChMULAjQzYaAUkVJBJEiAV7JwhMZzIHFihMULAjQzYaAUkVJBJEiAVjJxZMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSQSRDYaA0kiWYECCEsBFRJEVwIATIgFL4gFNhdHAogFQIEUEkEADicISwNnMgcWKExQsCNDSYEoEkEAEScOSwNQSb1FARRESwK/Qv/fSYEyEkEAEScVSwNQSb1FARRESwK/Qv/HSYE8EkEAEScUSwNQSb1FARRESwK/Qv+vSYFGEkEAEScNSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcgSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJBJEiASFiASMF0cCiASWSYEUE0SBKBJBABUnDksCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxVLAlBJvUUBRLxIQv/hSYE8EkEADycUSwJQSb1FAUS8SEL/y0mBRhJBAA8nDUsCUEm9RQFEvEhC/7VJgVASQf+uJyBLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycNMQCIA79EJxdMZzIHFihMULAjQyInCGVEKExQsCNDNhoBSRUkEkQnDksBiAOXJxVLAogDkCcUSwOIA4knDUsEiAOCJyBPBYgDeycfIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUkEkQXSYgDk4MGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnIEsBUEm9RQFEvkgoTFCwI0MnDUsBUEm9RQFEvkhC/+snFEsBUEm9RQFEvkhC/9wnFUsBUEm9RQFEvkhC/80nDksBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAAGAADIHSSInHWVMTgJEIicFZUQPQQATIicHZUyMAkQnHYsCSU4CZ4wAiSInBGVEiwEMQf/qIicdZUSBAwhJjAAlC4ECCCcMTCW6F4sBDkEAGyEEIojzPIsAIwhJjAAlC4ECCCcMTCW6F0L/34sAgQMJjAJC/6mKAQGBA4v/CCMJJQuBAggnDEwluheJigEBIkknB2VEi/8NQQAJi/8jCIj/1IwAiwBMiYoCAYv/IwmBAguBAggnE0yBAroXi/4LgZBOComKAQGAAEmL/0AALiInBGVEMgdLAQmMAIv/iP+sTAkiJxFlREAACosAIQYKjAAhBgqLABZMFlCMAIkijAGL/0EAB4v/iP9sjAGLAUL/w4oBASInBGVEQQAYMgciJwRlRA9BAA0iJwdlRIv/DUEAAiOJIomKAwGL/Yv/iAA+i/+I/39JIltMJVuL/4ECC4ECCCcTTIECuheL/Yv+iAE4C08CC4GQTk8CCwqJigEBIiccZUQiK2VEi/8LD4mKAgApi/5QvkSBMFuL/xJEiYoBACInFmVEMgMTQQAkMQAiJxZlRBJAABcxAIv/EkAADzEAKYv/UL5EVwAgEkEAAyNEiSJC//qKAQEpi/9QSb5EVwAgIicJZURwAEUBQQAOiwC+RIHAA1NAAAMjTIkiQv/6igEAMgoiJwllRHAARIv/D0SJigIAsTIAIicJZUSL/7ISi/6yFLIRgQSyELIBs4mKAQGAAEcCi/9XAgCL/4ECWzIHDUSL/yJZIwkiiwWLBAxBAECBQSOI8UmLBUklC4sDSU4DTFtJTgOMASMISYwCJQtbSYwADEQiJxFlRCEEE0EACosAiwEJIQYYFESLAowFQv+4i/+MAImKAQApi/9QvkSBwANTFESJigIBKYv+UL5EgShbi/8LiYoBASmL/1C+RCRbi/9MiP/fiSIrZURAAAQqIQVniYoCAYAAi/6L/1BJvUUBQQAfiwG+RCJbMgdJjAAOQQAQiwG+RCVbiwAPQQAEI4wAiSJC//kxACInCGVEEkSJIicYZUQURIkiJxdlRBREiYoBAIv/gRQSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", - "clear": "DIEBQw==" - }, - "compilerInfo": { - "compiler": "puya", - "compilerVersion": { - "major": 5, - "minor": 7, - "patch": 1 - } - }, - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "templateVariables": {} -} \ No newline at end of file diff --git a/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py b/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py deleted file mode 100644 index 2fe8cab0..00000000 --- a/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py +++ /dev/null @@ -1,3966 +0,0 @@ -# flake8: noqa -# fmt: off -# mypy: ignore-errors -# This file was automatically generated by algokit-client-generator. -# DO NOT MODIFY IT BY HAND. -# requires: algokit-utils@^3.0.0 - -# common -import dataclasses -import typing -# core algosdk -import algosdk -from algosdk.transaction import OnComplete -from algosdk.atomic_transaction_composer import TransactionSigner -from algosdk.source_map import SourceMap -from algosdk.transaction import Transaction -from algosdk.v2client.models import SimulateTraceConfig -# utils -import algokit_utils -from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient - -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Account's units for the current value calculation", "name": "units"}], "name": "get_account_units_current_value", "returns": {"type": "(uint64,uint64,(uint64,uint64))", "desc": "Units current value in denomination asset, Accrued interest in denomination asset", "struct": "CurrentUnitsValue"}, "desc": "Get account's units current value and accrued interest", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_coupon_rates", "returns": {"type": "uint16[]", "desc": "Coupon rates"}, "desc": "Get D-ASA coupon rates", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_payment_amount", "returns": {"type": "(uint64,uint64)", "desc": "Interest amount in denomination asset, Principal amount in denomination asset", "struct": "PaymentAmounts"}, "desc": "Get the next payment amount", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_coupons_status", "returns": {"type": "(uint64,uint64,uint64,(uint64,uint64),bool)", "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid", "struct": "CouponsInfo"}, "desc": "Get D-ASA coupons status", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_coupon", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay due coupon to an account", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_principal", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay the outstanding principal to an account", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Sender Account Holding Address", "name": "sender_holding_address"}, {"type": "address", "desc": "Receiver Account Holding Address", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to transfer", "name": "units"}], "name": "asset_transfer", "returns": {"type": "uint64", "desc": "Transferred actualized value in denomination asset"}, "desc": "Transfer D-ASA units between accounts", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_close", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_config", "returns": {"type": "(uint64,uint64)", "desc": "Role configuration", "struct": "RoleConfig"}, "desc": "Get role configuration", "events": [], "readonly": true, "recommendations": {}}], "name": "FixedCouponBond", "state": {"keys": {"box": {"time_events": {"key": "dGltZUV2ZW50cw==", "keyType": "AVMBytes", "valueType": "uint64[]"}, "coupon_rates": {"key": "Y291cG9uUmF0ZXM=", "keyType": "AVMBytes", "valueType": "uint16[]"}}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjI1Iw==", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "paid_coupon_units": {"key": "cGFpZF9jb3Vwb25fdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "due_coupons_watermark": {"key": "ZHVlX2NvdXBvbnNfd2F0ZXJtYXJr", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}, "account": {"keyType": "address", "valueType": "AccountInfo", "prefix": "UjMwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 3, "ints": 20}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "CouponsInfo": [{"name": "total_coupons", "type": "uint64"}, {"name": "due_coupons", "type": "uint64"}, {"name": "next_coupon_due_date", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}, {"name": "all_due_coupons_paid", "type": "bool"}], "CurrentUnitsValue": [{"name": "units_value", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}], "DayCountFactor": [{"name": "numerator", "type": "uint64"}, {"name": "denominator", "type": "uint64"}], "PaymentAmounts": [{"name": "interest", "type": "uint64"}, {"name": "principal", "type": "uint64"}], "PaymentResult": [{"name": "amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}]}, "byteCode": {"approval": "DCAHAAEgCP8ByAGAowUmJgQVH3x1BFIzMCMGc3RhdHVzEWNpcmN1bGF0aW5nX3VuaXRzDWlzc3VhbmNlX2RhdGUNbWF0dXJpdHlfZGF0ZQp1bml0X3ZhbHVlDXRvdGFsX2NvdXBvbnMEUjIwIxNzZXR0bGVtZW50X2Fzc2V0X2lkIXByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZR1zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQp0aW1lRXZlbnRzBFI3MCMEUjQwIwt0b3RhbF91bml0cxVkZW5vbWluYXRpb25fYXNzZXRfaWQUZGF5X2NvdW50X2NvbnZlbnRpb24dc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGULY291cG9uUmF0ZXMEUjYwIwRSNTAjBFIyNSMPYXNzZXRfc3VzcGVuZGVkD2Fzc2V0X2RlZmF1bHRlZAhtZXRhZGF0YRJwcmluY2lwYWxfZGlzY291bnQhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlEXBhaWRfY291cG9uX3VuaXRzFWR1ZV9jb3Vwb25zX3dhdGVybWFyawIAAAEABFI4MCMNaW50ZXJlc3RfcmF0ZQMGgQECADsEjCmQTgIAEjEYQAB1JwgyA2cnFjIDZycXImcnGCJnJw8iZysiZycGImcqImcnECJnJwkiZycGImcnESJnJxmAAGcnGiJnJyEiZycHImcnCiJnJxsiZycEImcnEiJnJwsiZycFImcnHCJnJx0iZzE1gQMSRDE0gRQSRDE3FEQxNhREgAQl26lbNhoAjgEA4zEZFEQxGEEAzIIcBIlHQTQERDY9SQRTvvBFBGfbTyAE9qlsjQSM8UtRBJx2tqMET9ajzAQdb8JVBCXpmX8EbIXj7gRALbpHBPrSFz4ECO/qNQTkpatUBNwGOzUEFPwQ7wRMET7VBHSnKX8EEFwYTgSC9xstBO8E9dMEA7gzKQQ9voC9BN9U6CwEAQyCmQR0BqzSBMPkspc2GgCOHABWAa0CUgJsAsMDDgQUBQwGsAcvB04H5AizCM0I6AjzCSwJdgmzCeUJ/QoVCi0K6Qt/C54LqQvzAIAEPw78bDYaAI4BBk4AMRmBBBIxGBBEQgZwigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScish4nIrIfi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74mAADYaAUkVJRJEFzYaAkkVJRJEFzYaA0kVJRJEFzYaBEkVJRJEFzYaBUkVJRJEFzYaBkkVIxJENhoHSU4HFYECEkQ2GghJTgdJIllJTgiBAguBAghMFRJENhoJSU4HSSJZSU4IJQuBAghMFRJENhoKSSJZSU4IgRALgQIITBUSRIgOqiIqZUQUREsFcQtFAUQnEEsGZ0sETwYSRCcJSwVnsTIAMgoishKyFE8FshGBBLIQsgGzSwNLAhgURCcGSwJnTwNPAgonD0xnJxpPAmcXSUEAB0khBBJBAHgjRCcRSwFnSwYXRQgiJxplREAAA0sHRCchSwhnSwRJRCcHSwFnJxO8SCcTSwe/gQQISwMSREsDiA09Jwy8SCcMSwG/SVcCAEsBgQJbJwpMZ0sBgQpbJxtMZ0sBgRJbJwRMZ0wiWSMJJQtbJwVMZ0sBFEQqgWRnI0MiQv+FIoAARwQ2GgFJFSQSRDYaAkkVJRJEFyInCmVEQQCDMgciJwplRA9BAHgjRClLAlBJRQm9RQFESUEAY0sHvkQkW0sBD0EAVyNESwFJSwKIDSRFCCJFByJFBCJFBogKe0lFBkxLAYgL8ogLgkEAGksDSYgLLEsDSwNPA4gLlUUHSSJbRQQlW0UFSwIWSwUWUEsHFksHFlBMUChMULAjQyJC/6YiQv+FJx4iKmVEgWQSQQAHJxO+TEUCRChLAVCwI0OAADYaAUcCFSQSRClMUEm9RQFEIkcCKmVEgWQSQQAhSwK+RIEwW0lFBiInB2VEDEEAG0sDiAyOSwUjCIgKhkUCSwEWSwEWUChMULAjQ0sDiAxzRQFC/+mICcBHAogKSUxJiAslTCJMIkyICsFBAA5LBIgKbEkiW0UDJVtFASInB2VESwIWSwIWUEwWSwYWUEsFFlBMUCcfIksFVFAoTFCwI0M2GgFJFSQSRDYaAkkiWYECCEsBFRJEVwIATCIqZUSBZBJEiAxaiAxfKUsBUElOAkm9RQFESb5IJFtJTgNEiAk4TL5EgTBbTEsBDURJiAqYREsBiAvOTCMIiAnHTEmICqmICt1BAJpHAogLAEsDvkRXACBMiAsHSwJJvkSBMFsjCBaBMEy7IiccZURLAggnHExnMggyByInEGVESXEDRCIrZUQiJwZlRAtPBBaAAwgAN1BPBBZQSwQWTEsBUE8EFlBLAxUWVwYCTwRQTCcjUE8DFlAnHlAiFlCABAACSVBQTFAnJExQsDIHFlBLBEkVFlcGAkxQTCclUExQKExQsCNDIkUBQv9wNhoBSRUkEkQ2GgJJIlmBAghLARUSRFcCAEwiKmVEgWQSRIgLVIgLWSlLAVBJTgJJvUUBRL5IJFtEMgciJwVlRA9EiAgtiAmZREmICtBMSYgJsYgJ5UEAmkcCiAoISwK+RFcAIEyICg8iK2VESwJJTgK+RCRbCStMZyIWTCRLAruICqwyCDIHIicQZURJcQNEIitlRCInBmVEC08EFoADAwA3UE8EFlBLBRZMSwFQTwQWUEsDFRZXBgJPBFBMJyNQTwMWUCceUE8DUIAEAAJQUlBMUCckTFCwMgcWUEsDSRUWVwYCTFBMJyVQTFAoTFCwI0MiRQFC/3AiRwKAAEk2GgFJFSQSRDYaAkkVJBJENhoDSRUlEkQXIiplRIFkEkEBIyInEmVEMgcOQQEYIicLZURBAAsyByInC2VEDEEBBSNEMQBLA0lOAhJEiAosiAoxKUsBUElFCUm9RQFEKUsESU4CUElFCkm9RQFESwOICY1LAYgJiE8DTwITREsCSURPAr5ESSRbTwIPRFcoCEUJvkQkW0EAmEsGvkSBKFtLBr5EgShbEkEAgksGvkSBMFtLBr5EgTBbEkEAcCNESwZJvkSBKFtFBYgGqUsESU4CSwGICB9MSwNJTgNPAogHzEUHSwG+RCRbSg5ETAkWSwEkTwK7vkgkW0AAECIWSwdJTgKBKEsCu4EwTLtLBUm+RCRbSwJJTgIIFk8CJE8Cu0sEC0sFCBYoTFCwI0MiQv+NSwVJgShLCrtLB75EVzAIgTBMu0L/eCJC/vg2GgFJFSQSRDYaAkkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkQnCE8CZycZTGcjQzYaAUkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkSICNknGUxnI0MiNhoBRwIiWUklC4ECCE8CFRJEiAi9IiplRCEFEhREiAi7SUQjDUEABkmIB8tFASInBGVESwFJVwIARQSBAltMSwEORCcSTGciJwVlREEAGiInBWVESwEiWSMJJQtLA0xbTEsBD0QnC0xnIicSZUQiJwtlREwWTBZQKExQsCNDNhoBSRUjEkQiUycUMQCICA9EJxhMZzIHFihMULAjQ4AANhoBSRUkEkQ2GgJJFSUSRBciKmVEgWQSQQB1IicKZUQyB0lFBQ5BAGciJxtlREsDDUEAXCNEJxUxAIgHwkQpSwJQSb1FAUSIB/OIB/hLAUlEIitlREsBCCInD2VESwEPRCtLAWdLAr5EJFtPAggWSwIkTwK7IicGZUQWTwKBKE8CuyInD2VETAkWKExQsCNDIkL/oSIyByInBWVMSU4CTgNEDUEACElBAASBBEUCIicYZURBAASBA0UCIicQZUQiJwllRCIrZUQiJwZlREoLIicRZUQWSZMlDkRXBwEiJxplRBZJk4EQDkRXBgIiJyFlRBZJk4EQDkRXBgIiJw9lRCInCmVEIicbZUQiJwRlRCInBWVEIicXZURLDxZJkyUORFcHAU8OFk8OFlBPCxZQTwsWUE8KUE8JUE8IUE8HFlBPBxZQTwYWUE8FFlBPBBZQTwMWUCcfIk8EVFBMUChMULAjQyceIiplRIFkEkEABycMvkxFAkQoSwFQsCNDIicSZUQiJwtlREwWgAIAAkxQTBZQKExQsCNDIicZZUQoTFCwI0M2GgFJFSQSRDYaAkkVIxJEIlMnDTEAiAZDRClPAlBJvUUBREmBOCO6Ik8DVIE4TLsyBxYoTFCwI0M2GgFJFSQSRDYaAkkVJBJEJw4xAIgGDEQiKmVEIQUSFESIBj2IBkIpTwJQSb1FARREIhZPAksBUEsBUExQJx9QvzIHFihMULAjQzYaAUkVJBJEJw4xAIgFykSIBgQpTFBJvUUBREm+SCRbTLxIIitlREsBCStMZ4gFnTIHTBZMFlAoTFCwI0M2GgFJFSQSRDYaAkkVJBJEMQBLAhJEiAXBiAXGKU8CUEm9RQFEIk8CuzIHFihMULAjQzYaAUkVJBJEKUxQSb1FAUS+SChMULAjQzYaAUkVJBJEiAV7JwhMZzIHFihMULAjQzYaAUkVJBJEiAVjJxZMZzIHFihMULAjQzYaAUkVIxJENhoCSU4CFSQSRDYaA0kiWYECCEsBFRJEVwIATIgFL4gFNhdHAogFQIEUEkEADicISwNnMgcWKExQsCNDSYEoEkEAEScOSwNQSb1FARRESwK/Qv/fSYEyEkEAEScVSwNQSb1FARRESwK/Qv/HSYE8EkEAEScUSwNQSb1FARRESwK/Qv+vSYFGEkEAEScNSwNQSb1FARRESwK/Qv+XSYFQEkH/kCcgSwNQSb1FARRESwK/Qv9/NhoBSRUjEkQ2GgJJTgIVJBJEiASFiASMF0cCiASWSYEUE0SBKBJBABUnDksCUEm9RQFEvEgyBxYoTFCwI0NJgTISQQAPJxVLAlBJvUUBRLxIQv/hSYE8EkEADycUSwJQSb1FAUS8SEL/y0mBRhJBAA8nDUsCUEm9RQFEvEhC/7VJgVASQf+uJyBLAlBJvUUBRLxIQv+fNhoBSRUjEkQiUycNMQCIA79EJxdMZzIHFihMULAjQyInCGVEKExQsCNDNhoBSRUkEkQnDksBiAOXJxVLAogDkCcUSwOIA4knDUsEiAOCJyBPBYgDeycfIk8GVCNPBVSBAk8EVIEDTwNUgQRPAlQoTFCwI0M2GgFJFSMSRDYaAklOAhUkEkQXSYgDk4MGFCgyPEZQTwaOBgBPAEAAMQAiABMAAQAnIEsBUEm9RQFEvkgoTFCwI0MnDUsBUEm9RQFEvkhC/+snFEsBUEm9RQFEvkhC/9wnFUsBUEm9RQFEvkhC/80nDksBUEm9RQFEvkhC/76AEAAAAAAAAAAAAAAAAAAAAABC/6mKAAGAADIHSSInHWVMTgJEIicFZUQPQQATIicHZUyMAkQnHYsCSU4CZ4wAiSInBGVEiwEMQf/qIicdZUSBAwhJjAAlC4ECCCcMTCW6F4sBDkEAGyEEIojzPIsAIwhJjAAlC4ECCCcMTCW6F0L/34sAgQMJjAJC/6mKAQGBA4v/CCMJJQuBAggnDEwluheJigEBIkknB2VEi/8NQQAJi/8jCIj/1IwAiwBMiYoCAYv/IwmBAguBAggnE0yBAroXi/4LgZBOComKAQGAAEmL/0AALiInBGVEMgdLAQmMAIv/iP+sTAkiJxFlREAACosAIQYKjAAhBgqLABZMFlCMAIkijAGL/0EAB4v/iP9sjAGLAUL/w4oBASInBGVEQQAYMgciJwRlRA9BAA0iJwdlRIv/DUEAAiOJIomKAwGL/Yv/iAA+i/+I/39JIltMJVuL/4ECC4ECCCcTTIECuheL/Yv+iAE4C08CC4GQTk8CCwqJigEBIiccZUQiK2VEi/8LD4mKAgApi/5QvkSBMFuL/xJEiYoBACInFmVEMgMTQQAkMQAiJxZlRBJAABcxAIv/EkAADzEAKYv/UL5EVwAgEkEAAyNEiSJC//qKAQEpi/9QSb5EVwAgIicJZURwAEUBQQAOiwC+RIHAA1NAAAMjTIkiQv/6igEAMgoiJwllRHAARIv/D0SJigIAsTIAIicJZUSL/7ISi/6yFLIRgQSyELIBs4mKAQGAAEcCi/9XAgCL/4ECWzIHDUSL/yJZIwkiiwWLBAxBAECBQSOI8UmLBUklC4sDSU4DTFtJTgOMASMISYwCJQtbSYwADEQiJxFlRCEEE0EACosAiwEJIQYYFESLAowFQv+4i/+MAImKAQApi/9QvkSBwANTFESJigIBKYv+UL5EgShbi/8LiYoBASmL/1C+RCRbi/9MiP/fiSIrZURAAAQqIQVniYoCAYAAi/6L/1BJvUUBQQAfiwG+RCJbMgdJjAAOQQAQiwG+RCVbiwAPQQAEI4wAiSJC//kxACInCGVEEkSJIicYZUQURIkiJxdlRBREiYoBAIv/gRQSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgOCAyNTUgMjAwIDg2NDAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHg1MjMzMzAyMyAic3RhdHVzIiAiY2lyY3VsYXRpbmdfdW5pdHMiICJpc3N1YW5jZV9kYXRlIiAibWF0dXJpdHlfZGF0ZSIgInVuaXRfdmFsdWUiICJ0b3RhbF9jb3Vwb25zIiAweDUyMzIzMDIzICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMgMHg1MjM3MzAyMyAweDUyMzQzMDIzICJ0b3RhbF91bml0cyIgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgImRheV9jb3VudF9jb252ZW50aW9uIiAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDUyMzYzMDIzIDB4NTIzNTMwMjMgMHg1MjMyMzUyMyAiYXNzZXRfc3VzcGVuZGVkIiAiYXNzZXRfZGVmYXVsdGVkIiAibWV0YWRhdGEiICJwcmluY2lwYWxfZGlzY291bnQiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiICJwYWlkX2NvdXBvbl91bml0cyIgImR1ZV9jb3Vwb25zX3dhdGVybWFyayIgMHgwMDAwIDB4MDAgMHg1MjM4MzAyMyAiaW50ZXJlc3RfcmF0ZSIgMHgwNjgxMDEgMHgwMDNiIDB4OGMyOTkwNGUgMHgwMDEyCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAtMzEKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMgogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDIyIC8vIDB4NTIzMjM1MjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0Ny00OAogICAgLy8gIyBELUFTQSBHb3Zlcm5hbmNlCiAgICAvLyBzZWxmLmFzc2V0X3N1c3BlbmRlZCA9IEZhbHNlCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDI0IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxOQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIyCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMS0zMgogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE2IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyA5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzctMzgKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MC00MQogICAgLy8gIyBQcmluY2lwYWwgLyBSYXRlcwogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjYgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAzMyAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDMKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDI3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ5CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NTAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjUyCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMjggLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMDIKICAgIC8vIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrID0gVUludDY0KCkKICAgIGJ5dGVjIDI5IC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMwogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkdMT0JBTF9CWVRFUywgZXJyLldST05HX0dMT0JBTF9CWVRFUwogICAgdHhuIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDIwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE3LTMwCiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIEZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4MjVkYmE5NWIgLy8gbWV0aG9kICJhc3NldF91cGRhdGUoKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE3LTMwCiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIEZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAzNgogICAgcHVzaGJ5dGVzcyAweDg5NDc0MTM0IDB4NDQzNjNkNDkgMHg1M2JlZjA0NSAweDY3ZGI0ZjIwIDB4ZjZhOTZjOGQgMHg4Y2YxNGI1MSAweDljNzZiNmEzIDB4NGZkNmEzY2MgMHgxZDZmYzI1NSAweDI1ZTk5OTdmIDB4NmM4NWUzZWUgMHg0MDJkYmE0NyAweGZhZDIxNzNlIDB4MDhlZmVhMzUgMHhlNGE1YWI1NCAweGRjMDYzYjM1IDB4MTRmYzEwZWYgMHg0YzExM2VkNSAweDc0YTcyOTdmIDB4MTA1YzE4NGUgMHg4MmY3MWIyZCAweGVmMDRmNWQzIDB4MDNiODMzMjkgMHgzZGJlODBiZCAweGRmNTRlODJjIDB4MDEwYzgyOTkgMHg3NDA2YWNkMiAweGMzZTRiMjk3IC8vIG1ldGhvZCAiYXNzZXRfY29uZmlnKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNltdLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpKSIsIG1ldGhvZCAiZ2V0X2NvdXBvbl9yYXRlcygpdWludDE2W10iLCBtZXRob2QgImdldF9wYXltZW50X2Ftb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0X2NvdXBvbnNfc3RhdHVzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpLGJvb2wpIiwgbWV0aG9kICJwYXlfY291cG9uKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LGJ5dGVbXSkiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jb25maWcgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSBnZXRfY291cG9uX3JhdGVzIGdldF9wYXltZW50X2Ftb3VudCBnZXRfY291cG9uc19zdGF0dXMgcGF5X2NvdXBvbiBwYXlfcHJpbmNpcGFsIGFzc2V0X3RyYW5zZmVyIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMgc2V0X2RlZmF1bHRfc3RhdHVzIHByaW1hcnlfZGlzdHJpYnV0aW9uIGdldF9hc3NldF9pbmZvIGdldF90aW1lX2V2ZW50cyBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSBnZXRfYXNzZXRfbWV0YWRhdGEgYWNjb3VudF9nb3Zfc3VzcGVuc2lvbiBhY2NvdW50X29wZW4gYWNjb3VudF9jbG9zZSBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfaW5mbyByYmFjX3JvdGF0ZV9hcnJhbmdlciByYmFjX3NldF9vcF9kYWVtb24gcmJhY19hc3NpZ25fcm9sZSByYmFjX3Jldm9rZV9yb2xlIHJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX2NvbmZpZwogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDM2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE3LTMwCiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIEZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4M2YwZWZjNmMgLy8gbWV0aG9kICJhc3NldF9jcmVhdGUoYWRkcmVzcywodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYXNzZXRfY3JlYXRlCiAgICBlcnIKCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGFzc2V0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzLnBhbS5QQU1Db3JlTWl4aW4uYXNzZXRfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgY292ZXIgNwogICAgbGVuCiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDE2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDE2PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBjb3ZlciA3CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDgKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDgKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dHVwbGU8dWludDY0LHVpbnQ2ND4+CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyMjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGVudW1zLlNUQVRVU19JTkFDVElWRSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1NS01NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBkZW5vbWluYXRpb24gd2l0aCBBU0EKICAgIC8vIF9jcmVhdG9yLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jcmVhdG9yKGRlbm9taW5hdGlvbl9hc3NldF9pZCkKICAgIGRpZyA1CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1NwogICAgLy8gYXNzZXJ0IGV4aXN0cywgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjYwCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IGRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgYnl0ZWMgMTYgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGRpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjUKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGRpZyA0CiAgICB1bmNvdmVyIDYKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo2My02NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHNldHRsZW1lbnQgYXNzZXQgaXMgdGhlIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRVRUTEVNRU5UX0FTU0VUCiAgICBhc3NlcnQgLy8gRGlmZmVyZW50IHNldHRsZW1lbnQgYXNzZXQgbm90IHN1cHBvcnRlZCwgbXVzdCBiZSBlcXVhbCB0byBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjY5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIzOC0yMzkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCBwcmluY2lwYWwgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbiA9PSAwLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgZGlnIDMKICAgIGRpZyAyCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24KICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbCAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIGJ5dGVjIDE1IC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNDIKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gcHJpbmNpcGFsX2Rpc2NvdW50CiAgICBieXRlYyAyNiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ0LTI0NQogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjgyCiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIGludGMgNCAvLyAyNTUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojc5LTgzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojg2CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDE3IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ4LTI0OQogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLmFzX3VpbnQ2NCgpKQogICAgZGlnIDYKICAgIGJ0b2kKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6ODktOTAKICAgIC8vICMgVGhpcyBzdWJyb3V0aW5lIG11c3QgYmUgdXNlZCBhZnRlciB0aGUgcHJpbmNpcGFsIGRpc2NvdW50IGhhcyBiZWVuIHNldAogICAgLy8gaWYgbm90IHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgYm56IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjkxCiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZGlnIDcKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6OTQKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDMzIC8vICJpbnRlcmVzdF9yYXRlIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMDUKICAgIC8vIGFzc2VydCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMDgKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEwOQogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAxOSAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTkgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBkaWcgNwogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA0CiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBwdXNoaW50IDQKICAgICsKICAgIGRpZyAzCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTAzLTEwNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjU4CiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBkaWcgMwogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMjcKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyOC0xMzAKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTI4LTEzMAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzMS0xMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIGRpZyAxCiAgICBwdXNoaW50IDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTMxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMjcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzMS0xMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzQKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0KICAgIGRpZyAxCiAgICBwdXNoaW50IDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzUKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0KICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzOAogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGRpZyAxCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjY1CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgcHVzaGludCAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjIyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjIyLTIyMwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIyMwogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjIyLTIyMwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIyMS0yMjQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjI2CiAgICAvLyBhc3NlcnQgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuSU5WQUxJRF9VTklUUwogICAgZHVwCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAOAogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMjYKICAgIC8vIGFzc2VydCAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMjgtMjI5CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZGlnIDEKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMzAtMjMxCiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0IGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjMyCiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjMzCiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyMzUtMjM2CiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIzNwogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgc3dhcAogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIzOAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjIzOQogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGRpZyAzCiAgICBkdXAKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQwLTI0MgogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCB1bml0cywgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGRpZyAzCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI0MwogICAgLy8gbnVtZXJhdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI0NAogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQ5LTI1MgogICAgLy8gZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPW51bWVyYXRvciwKICAgIC8vICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICksCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjQ2LTI1MwogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUsCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgZGlnIDcKICAgIGl0b2IKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDkKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5GaXhlZENvdXBvbkNhc2hmbG93TWl4aW4uZ2V0X2NvdXBvbl9yYXRlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9jb3Vwb25fcmF0ZXM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNjMKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHR5cC5Db3Vwb25SYXRlcygpCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjY0CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNjUKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHNlbGYuY291cG9uX3JhdGVzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTkgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9yYXRlcyBleGlzdHMKCmdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLmdldF9wYXltZW50X2Ftb3VudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyODMKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6Mjg0CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gVUludDY0KCkKICAgIGR1cG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI4NQogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyODYKICAgIC8vIHBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucwogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI4NwogICAgLy8gaWYgcGFpZF9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIDwKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9lbHNlX2JvZHlANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjkwCiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI5MQogICAgLy8gcGFpZF9jb3Vwb25zICsgMSwKICAgIGRpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6Mjg4LTI5MgogICAgLy8gIyBDb3Vwb24gUGF5bWVudAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5jb3Vwb25faW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpLAogICAgLy8gICAgIHBhaWRfY291cG9ucyArIDEsCiAgICAvLyApCiAgICBjYWxsc3ViIGNvdXBvbl9pbnRlcmVzdF9hbW91bnQKICAgIGJ1cnkgMgoKZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI5Ni0yOTkKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbD1wcmluY2lwYWxfYW1vdW50LAogICAgLy8gKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGRpZyAxCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfcGF5bWVudF9hbW91bnRfZWxzZV9ib2R5QDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyOTQtMjk1CiAgICAvLyAjIFByaW5jaXBhbCBQYXltZW50CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIGJ1cnkgMQogICAgYiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA2CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLmdldF9jb3Vwb25zX3N0YXR1c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9jb3Vwb25zX3N0YXR1czoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxMAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cG4gMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzExCiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZSA9IHNlbGYubmV4dF9jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpCiAgICBjYWxsc3ViIG5leHRfY291cG9uX2R1ZV9kYXRlCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTIKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkID0gc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucykKICAgIGR1cAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzEzCiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxNAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxNQogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTYKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBkaWcgNAogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTcKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMTgKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDEKCmdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMjAKICAgIC8vIHRvdGFsX2NvdXBvbnM9c2VsZi50b3RhbF9jb3Vwb25zLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMyMy0zMjYKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1udW1lcmF0b3IsCiAgICAvLyAgICAgZGVub21pbmF0b3I9ZGVub21pbmF0b3IsCiAgICAvLyApLAogICAgZGlnIDIKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMxOS0zMjgKICAgIC8vIHJldHVybiB0eXAuQ291cG9uc0luZm8oCiAgICAvLyAgICAgdG90YWxfY291cG9ucz1zZWxmLnRvdGFsX2NvdXBvbnMsCiAgICAvLyAgICAgZHVlX2NvdXBvbnM9ZHVlX2NvdXBvbnMsCiAgICAvLyAgICAgbmV4dF9jb3Vwb25fZHVlX2RhdGU9bmV4dF9jb3Vwb25fZHVlX2RhdGUsCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1udW1lcmF0b3IsCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWRlbm9taW5hdG9yLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YWxsX2R1ZV9jb3Vwb25zX3BhaWQsCiAgICAvLyApCiAgICBzd2FwCiAgICBpdG9iCiAgICBkaWcgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDMxIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICBkaWcgNQogICAgc2V0Yml0CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LmNvdXBvbi5Db3Vwb25QYXltZW50QWdlbnRNaXhpbi5wYXlfY291cG9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcGF5X2NvdXBvbjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzkKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0CiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5PX1VOSVRTCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ3CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDgKICAgIC8vIGFjY291bnRfcGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ5CiAgICAvLyBhc3NlcnQgZHVlX2NvdXBvbnMgPiBhY2NvdW50X3BhaWRfY291cG9ucywgZXJyLk5PX0RVRV9DT1VQT04KICAgIHN3YXAKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNvdXBvbiB0byBwYXkKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUwLTUzCiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyB2ZXJpZnkgaWYgb3RoZXIgYWNjb3VudHMgYXJlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBwYXltZW50IG9mIHByZXZpb3VzIGNvdXBvbnMKICAgIC8vIGFzc2VydCBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKAogICAgLy8gICAgIGFjY291bnRfcGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgZHVwCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE5NwogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICBkaWcgMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxOTgKICAgIC8vIGFjY291bnRfcGFpZF9jb3Vwb25zICsgMSwKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxOTYtMTk5CiAgICAvLyByZXR1cm4gc2VsZi5jb3Vwb25faW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpLAogICAgLy8gICAgIGFjY291bnRfcGFpZF9jb3Vwb25zICsgMSwKICAgIC8vICkKICAgIGNhbGxzdWIgY291cG9uX2ludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo1NAogICAgLy8gc2VsZi5hc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjU3CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgY2FsbHN1YiBpc19wYXltZW50X2V4ZWN1dGFibGUKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NTgtNTkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgZHVwbiAyCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NjAtNjEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyArPSAxCiAgICBkaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjQKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBkaWcgMgogICAgKwogICAgYnl0ZWMgMjggLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MTcKICAgIC8vIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjIwCiAgICAvLyB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToyMgogICAgLy8gY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjIzCiAgICAvLyBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjI0CiAgICAvLyBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNi0yNwogICAgLy8gRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX0lQKSwKICAgIC8vICAgICB0eXBlX25hbWU9U3RyaW5nKCJJUCIpLAogICAgLy8gICAgIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIC8vICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgbm9taW5hbF9yYXRlX2Jwcz1hcmM0LlVJbnQxNigwKSwgICMgVE9ETzogQWRkIGludGVyZXN0IHJhdGUKICAgIC8vICAgICBub21pbmFsX2FjY3J1ZWQ9VUludDY0KDApLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwODAwMzcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyAzNSAvLyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9JUCksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToyNgogICAgLy8gbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfSVApLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIklQIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLCAgIyBUT0RPOiBBZGQgaW50ZXJlc3QgcmF0ZQogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI0OTUwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX0lQKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnl0ZWMgMzYgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo3MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo2OC03MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgMzcgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwYXlfY291cG9uX2Vsc2VfYm9keUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo2My02NAogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQogICAgYiBwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VANAoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5wcmluY2lwYWwuUHJpbmNpcGFsUGF5bWVudEFnZW50TWl4aW4ucGF5X3ByaW5jaXBhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBheV9wcmluY2lwYWw6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjE2LTE3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIxCiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIyCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjMKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3OAogICAgLy8gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3Ni03OQogICAgLy8gIyBQcmluY2lwYWwgcGF5bWVudCBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo4MAogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBkdXAKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgc3dhcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo1MwogICAgLy8gc2VsZi5hc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uKGhvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjU2CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgY2FsbHN1YiBpc19wYXltZW50X2V4ZWN1dGFibGUKICAgIGJ6IHBheV9wcmluY2lwYWxfZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NTctNTgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgZHVwbiAyCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NTktNjAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTk5CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjAwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgaW50Y18yIC8vIDMyCiAgICBkaWcgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIwMQogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MTcKICAgIC8vIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjIwCiAgICAvLyB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToyMgogICAgLy8gY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjIzCiAgICAvLyBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjI0CiAgICAvLyBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNi0yNwogICAgLy8gRXZlbnQoCiAgICAvLyAgICAgY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICAvLyAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX1BSKSwKICAgIC8vICAgICB0eXBlX25hbWU9U3RyaW5nKCJQUiIpLAogICAgLy8gICAgIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBjdXJyZW5jeV91bml0PXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLnVuaXRfbmFtZSwKICAgIC8vICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgbm9taW5hbF9yYXRlX2Jwcz1hcmM0LlVJbnQxNigwKSwKICAgIC8vICAgICBub21pbmFsX2FjY3J1ZWQ9VUludDY0KDApLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMzAwMzcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBieXRlYyAzNSAvLyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9QUiksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI1MDUyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX1BSKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnl0ZWMgMzYgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2OQogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2Ny03MQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgMzcgLy8gMHgwMDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2Mi02MwogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQogICAgYiBwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VANAoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuY291cG9uLkNvdXBvblRyYW5zZmVyQWdlbnRNaXhpbi5hc3NldF90cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3RyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTUzLTE1OAogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyBhbmQgKAogICAgLy8gICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1NAogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTUzLTE1OAogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyBhbmQgKAogICAgLy8gICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1NgogICAgLy8gbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX3RydWVANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU3CiAgICAvLyBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1Mi0xNTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIGFuZCAoCiAgICAvLyAgICAgICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICkKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNjktMTcxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAyCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICB1bmNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZQogICAgZXh0cmFjdCA0MCA4CiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NAogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0cyA+IFVJbnQ2NCgwKToKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU3LTYwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjQ2LTQ3CiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjktNzAKICAgIC8vICMgVHJhbnNmZXIgaXMgZm9yYmlkZGVuIGluIGNhc2Ugb2YgcGVuZGluZyBjb3Vwb24gcGF5bWVudHMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMsIGR1ZV9jb3Vwb25zKQogICAgc3dhcAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MQogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAyCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgLT0gdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1MgogICAgLy8gaWYgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPT0gVUludDY0KDApOgogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MAogICAgZGlnIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IFVJbnQ2NCgwKQogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjUzCiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZW5kZXJfdW5pdF92YWx1ZSArIGFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyA0CiAgICAqCiAgICBkaWcgNQogICAgKwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9jb3Vwb24ucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAyMQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDk6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBkaWcgNQogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICBkaWcgMTAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zCiAgICBkaWcgNwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA3CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA3IG9mICh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0MgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Bc3NldE1ldGFkYXRhCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzcKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBwdXNoaW50IDM4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDcgb2YgKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4WzMyXSwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDQyCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkFzc2V0TWV0YWRhdGEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4NC0yODcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4OAogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzExCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNSAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE1CiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE2CiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBkdXAKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICBkaWcgMQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgYnVyeSA0CiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjAtMzIxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWF0KICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE5LTMyMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfT1BFTklOR19EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IG9wZW5pbmcgZGF0ZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIzCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMy0zMjUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjkKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWF0KICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOC0zMjkKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYXQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjctMzMwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWF0KICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzEKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTEgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMxLTMzMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM1CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1zZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNgogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPXNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uc2V0X2RlZmF1bHRfc3RhdHVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzQKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMCAvLyAweDUyMzYzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTIKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gZGVmYXVsdGVkCiAgICBieXRlYyAyNCAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1MwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NS0xNDgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDcKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2LTE0NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ni0xNDgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ4CiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDctMTQ4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZGlnIDMKICAgID4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ni0xNDgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NC0xNDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3MQogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYucHJpbWFyeV9kZWFsZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyMzUzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4NQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGRpZyAxCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg2CiAgICAvLyBhc3NlcnQgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMsIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODgKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgZGlnIDIKICAgIGludGNfMiAvLyAzMgogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzkwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDQwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozOTEKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5jaXJjdWxhdGluZ191bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uZ2V0X2Fzc2V0X2luZm9bcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwMwogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9QRVJGT1JNQU5UKQogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwNAogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLm1hdHVyaXR5X2RhdGUgPiAwOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0CiAgICBkdXAKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA1CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQKICAgIGJ1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA2LTQwNwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBubyBncmFjZSBvciBkZWxpbnF1ZW5jeSBwZXJpb2RzCiAgICAvLyBpZiBzZWxmLmFzc2V0X2RlZmF1bHRlZDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA4CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX0RFRkFVTFRFRCkKICAgIHB1c2hpbnQgMwogICAgYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTEKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMgogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ1CiAgICAvLyByZXR1cm4gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGR1cDIKICAgICoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxNQogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTYKICAgIC8vIHByaW5jaXBhbF9kaXNjb3VudD1hcmM0LlVJbnQxNihzZWxmLnByaW5jaXBhbF9kaXNjb3VudCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmluY2lwYWxfZGlzY291bnQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxNwogICAgLy8gaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMzIC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxOAogICAgLy8gdG90YWxfc3VwcGx5PXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjEKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyMgogICAgLy8gaXNzdWFuY2VfZGF0ZT1zZWxmLmlzc3VhbmNlX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIzCiAgICAvLyBtYXR1cml0eV9kYXRlPXNlbGYubWF0dXJpdHlfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjQKICAgIC8vIHN1c3BlbmRlZD1zZWxmLmFzc2V0X3N1c3BlbmRlZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyNQogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBkaWcgMTUKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMC00MjYKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5pZCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPXNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgLy8gICAgIHByaW5jaXBhbF9kaXNjb3VudD1hcmM0LlVJbnQxNihzZWxmLnByaW5jaXBhbF9kaXNjb3VudCksCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgLy8gICAgIHRvdGFsX3N1cHBseT1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUsCiAgICAvLyAgICAgaXNzdWFuY2VfZGF0ZT1zZWxmLmlzc3VhbmNlX2RhdGUsCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1zZWxmLm1hdHVyaXR5X2RhdGUsCiAgICAvLyAgICAgc3VzcGVuZGVkPXNlbGYuYXNzZXRfc3VzcGVuZGVkLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDMxIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF90aW1lX2V2ZW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzNgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDM3CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzOAogICAgLy8gdGltZV9ldmVudHMgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKCmdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ1MAogICAgLy8gKHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ0OS00NTEKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICAoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSkKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfYXNzZXRfbWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NjIKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dvdl9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nb3Zfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDEzIC8vIDB4NTIzNzMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxNCAvLyAweDUyMzQzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNSAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDIKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDYKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0LTE1MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1VSW50NjQoMCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMzEgLy8gMHgwMAogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfY2xvc2Vbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2Nsb3NlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTQgLy8gMHg1MjM0MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzQKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NQogICAgLy8gZGVsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NwogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzgKICAgIC8vIHJldHVybiBjbG9zZWRfdW5pdHMsIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwMgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMjIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzQKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjMyMzUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnQgMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE0IC8vIDB4NTIzNDMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxMyAvLyAweDUyMzczMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMyIC8vIDB4NTIzODMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE0IC8vIDB4NTIzNDMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjM1MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMCAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEzIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMyIC8vIDB4NTIzODMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gZGVsIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTMgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDIzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMTQgLy8gMHg1MjM0MzAyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIxIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMTMgLy8gMHg1MjM3MzAyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgYWRkcmVzcyksCiAgICBieXRlYyAzMiAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDMxIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX2NvbmZpZzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTQKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NwogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYtMzI3CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI3CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMzIgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDEzIC8vIDB4NTIzNzMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMAogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMwogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNjMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTUKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE0IC8vIDB4NTIzNDMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDItMzA0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OC0zMDAKICAgIC8vIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5jb3VudF9kdWVfY291cG9ucygpIC0+IHVpbnQ2NDoKY291bnRfZHVlX2NvdXBvbnM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTEKICAgIC8vIGRlZiBjb3VudF9kdWVfY291cG9ucyhzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTEyCiAgICAvLyBjdXJyZW50X3RzID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTEzCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTQKICAgIC8vIGlmIGN1cnJlbnRfdHMgPj0gc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBieiBjb3VudF9kdWVfY291cG9uc19lbHNlX2JvZHlAMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTE1CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYudG90YWxfY291cG9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTI5CiAgICAvLyBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyayA9IGR1ZV9jb3Vwb25zCiAgICBieXRlYyAyOSAvLyAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzMAogICAgLy8gcmV0dXJuIGR1ZV9jb3Vwb25zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY291bnRfZHVlX2NvdXBvbnNfZWxzZV9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTYKICAgIC8vIGVsaWYgY3VycmVudF90cyA+IHNlbGYuaXNzdWFuY2VfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMTgKICAgIC8vIFVJbnQ2NChmaXhlZF9jZmcuRklSU1RfQ09VUE9OX0RBVEVfSURYKSArIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgZXhpc3RzCiAgICBwdXNoaW50IDMKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjAKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQoKY291bnRfZHVlX2NvdXBvbnNfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjEKICAgIC8vIHdoaWxlIGN1cnJlbnRfdHMgPj0gY291cG9uX2R1ZV9kYXRlOgogICAgZnJhbWVfZGlnIDEKICAgIDw9CiAgICBieiBjb3VudF9kdWVfY291cG9uc19hZnRlcl93aGlsZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjMKICAgIC8vIHJlcXVpcmVkX2J1ZGdldD1VSW50NjQoZml4ZWRfY2ZnLk9QX1VQX0NPVVBPTl9EVUVfQ09VTlRJTkcpLAogICAgaW50YyA0IC8vIDI1NQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTI0CiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTIyLTEyNQogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9VUludDY0KGZpeGVkX2NmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEyNgogICAgLy8gY291cG9uX2lkeCArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxMjcKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYiBjb3VudF9kdWVfY291cG9uc193aGlsZV90b3BANAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEyOAogICAgLy8gZHVlX2NvdXBvbnMgPSBjb3Vwb25faWR4IC0gZml4ZWRfY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMwogICAgLQogICAgZnJhbWVfYnVyeSAyCiAgICBiIGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAOAoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5jb3Vwb25fZHVlX2RhdGUoY291cG9uOiB1aW50NjQpIC0+IHVpbnQ2NDoKY291cG9uX2R1ZV9kYXRlOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTMyCiAgICAvLyBkZWYgY291cG9uX2R1ZV9kYXRlKHNlbGYsIGNvdXBvbjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzMwogICAgLy8gcmV0dXJuIHNlbGYudGltZV9ldmVudHMudmFsdWVbZml4ZWRfY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWCArIGNvdXBvbiAtIDFdCiAgICBwdXNoaW50IDMKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKbmV4dF9jb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDEKICAgIC8vIGRlZiBuZXh0X2NvdXBvbl9kdWVfZGF0ZShzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE0MgogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDMKICAgIC8vIGlmIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgZHVwCiAgICBieXRlYyA3IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIGJ6IG5leHRfY291cG9uX2R1ZV9kYXRlX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTQ0CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLmNvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucyArIDEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAwCgpuZXh0X2NvdXBvbl9kdWVfZGF0ZV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDUKICAgIC8vIHJldHVybiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5GaXhlZENvdXBvbkNhc2hmbG93TWl4aW4uY291cG9uX2ludGVyZXN0X2Ftb3VudChwcmluY2lwYWxfYW1vdW50OiB1aW50NjQsIGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNDctMTQ5CiAgICAvLyBkZWYgY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBwcmluY2lwYWxfYW1vdW50OiBVSW50NjQsIGNvdXBvbjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTUwCiAgICAvLyBjb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVtjb3Vwb24gLSAxXS5hc191aW50NjQoKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDE5IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgc3dhcAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTUxCiAgICAvLyByZXR1cm4gcHJpbmNpcGFsX2Ftb3VudCAqIGNvdXBvbl9yYXRlX2JwcyAvLyBjc3QuQlBTCiAgICBmcmFtZV9kaWcgLTIKICAgICoKICAgIHB1c2hpbnQgMTAwMDAKICAgIC8KICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTUzCiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNTQtMTU1CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE1NgogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTU5CiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCAtIGFjY3J1aW5nX3N0YXJ0X3RpbWUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAxCiAgICAtCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE2MAogICAgLy8gY291cG9uX3BlcmlvZCA9IHNlbGYubmV4dF9jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG5leHRfY291cG9uX2R1ZV9kYXRlCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNjEKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE2MgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjIDYgLy8gODY0MDAKICAgIC8KCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTY0LTE2NwogICAgLy8gcmV0dXJuIHR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9Y291cG9uX2FjY3J1ZWRfcGVyaW9kLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWNvdXBvbl9wZXJpb2QsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGF5X2NvdW50X2ZhY3Rvcl9lbHNlX2JvZHlAMjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzNgogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjEzNwogICAgLy8gaWYgZHVlX2NvdXBvbnMgPj0gVUludDY0KDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBieiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTM4CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLmNvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMQoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDg6CiAgICBmcmFtZV9kaWcgMQogICAgYiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLkZpeGVkQ291cG9uQ2FzaGZsb3dNaXhpbi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmlzX2FjY3J1aW5nX2ludGVyZXN0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTY5CiAgICAvLyBkZWYgaXNfYWNjcnVpbmdfaW50ZXJlc3Qoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTcxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MS0xNzMKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTcyCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MS0xNzMKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTczCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MS0xNzMKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE3MC0xNzQKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICAvLyApCiAgICByZXRzdWIKCmlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNzAtMTc0CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uRml4ZWRDb3Vwb25DYXNoZmxvd01peGluLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxNzYtMTc4CiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50LCB1bml0czogVUludDY0LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTc5LTE4MAogICAgLy8gIyBUaGUgZm9sbG93aW5nIGFzc2VydCBzYWZlZ3VhcmRzIHRoZSBzdWJyb3V0aW5lIGZyb20gZm9yYmlkZGVuIGludm9jYXRpb25zCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTgxCiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE4MgogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxODMKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE4NAogICAgLy8gbmV4dF9jb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVtkdWVfY291cG9uc10uYXNfdWludDY0KCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIGJ5dGVjIDE5IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgc3dhcAogICAgcHVzaGludCAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjE4Ny0xODgKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBuZXh0X2NvdXBvbl9yYXRlX2JwcwogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg3LTE4OQogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToxOTAKICAgIC8vIC8vIChjc3QuQlBTICogY291cG9uX3BlcmlvZCkKICAgIHB1c2hpbnQgMTAwMDAKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg3LTE5MAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kKQogICAgLwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MTg1LTE5MQogICAgLy8gIyBkdWVfY291cG9ucyBpcyBlcXVhbCB0byB0aGUgMC1iYXNlIGlkeCBvZiBuZXh0IGNvdXBvbgogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAgICAgKiBjb3Vwb25fYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QpCiAgICAvLyApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5Db3Vwb25DYXNoZmxvd01peGluLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWxsX2R1ZV9jb3Vwb25zX3BhaWQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNgogICAgLy8gZGVmIGFsbF9kdWVfY291cG9uc19wYWlkKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI3CiAgICAvLyByZXR1cm4gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA+PSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogZHVlX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgID49CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5Db3Vwb25DYXNoZmxvd01peGluLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHZvaWQ6CmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjktMzEKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozMi0zNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5jb21tb24uUGF5bWVudEFnZW50Q29tbW9uTWl4aW4uYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgphc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxMgogICAgLy8gZGVmIGFzc2VydF9wYXltZW50X2F1dGhvcml6YXRpb24oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjEzCiAgICAvLyBpZiBzZWxmLm9wX2RhZW1vbi52YWx1ZSAhPSBHbG9iYWwuemVyb19hZGRyZXNzOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9ib29sX3RydWVANAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNgogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTUtMTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGFzc2VydF9wYXltZW50X2F1dGhvcml6YXRpb25fYm9vbF90cnVlQDQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTcKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBhc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uX2Jvb2xfZmFsc2VANQoKYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9ib29sX3RydWVANDoKICAgIGludGNfMSAvLyAxCgphc3NlcnRfcGF5bWVudF9hdXRob3JpemF0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTQtMTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gICAgIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAoKYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9hZnRlcl9pZl9lbHNlQDc6CiAgICByZXRzdWIKCmFzc2VydF9wYXltZW50X2F1dGhvcml6YXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X3BheW1lbnRfYXV0aG9yaXphdGlvbl9ib29sX21lcmdlQDYKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuY29tbW9uLlBheW1lbnRBZ2VudENvbW1vbk1peGluLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmlzX3BheW1lbnRfZXhlY3V0YWJsZToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjAKICAgIC8vIGRlZiBpc19wYXltZW50X2V4ZWN1dGFibGUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjItMjQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyLTI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyNQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0NDgKICAgIGdldGJpdAogICAgYm56IGlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgppc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9tZXJnZUA0OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyMS0yNgogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gICAgICkKICAgIC8vICAgICBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgLy8gKQogICAgc3dhcAogICAgcmV0c3ViCgppc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfbWVyZ2VANAoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5jb21tb24uUGF5bWVudEFnZW50Q29tbW9uTWl4aW4uYXNzZXJ0X2Vub3VnaF9mdW5kcyhwYXltZW50X2Ftb3VudDogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfZW5vdWdoX2Z1bmRzOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyOAogICAgLy8gZGVmIGFzc2VydF9lbm91Z2hfZnVuZHMoc2VsZiwgcGF5bWVudF9hbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozMAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjMwLTMxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGZyYW1lX2RpZyAtMQogICAgPj0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjktMzIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LmNvbW1vbi5QYXltZW50QWdlbnRDb21tb25NaXhpbi5wYXkocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKcGF5OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNAogICAgLy8gZGVmIHBheShzZWxmLCByZWNlaXZlcjogQWNjb3VudCwgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjM5CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNgogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwNwogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA5CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0KICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTEwCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDktMTEwCiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0KICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwOC0xMTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTEyCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE0CiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9USU1FX0VWRU5UX1NPUlRJTkcpLAogICAgcHVzaGludCA2NQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE1CiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTMtMTE2CiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD1VSW50NjQoY2ZnLk9QX1VQX1RJTUVfRVZFTlRfU09SVElORyksCiAgICAvLyAgICAgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkFwcEFjY291bnQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExNwogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbaWR4XQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE4CiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tpZHggKyAxXQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTkKICAgIC8vIGFzc2VydCB0aW1lX2YgPiB0aW1lX2ksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMAogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiAhPSBVSW50NjQoY3N0LkRDQ19DT05UKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpbnRjIDQgLy8gMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMzCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM2CiAgICAvLyBkZWYgYWNjb3VudF91bml0c192YWx1ZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIHVuaXRzOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM3CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzkKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDEKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDAtNDIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpIC0+IHZvaWQ6CmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0czoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0OAogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ5CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA1IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MAogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTYxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU4LTYyCiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1MgogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY1CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X2RlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFzc2V0X3N1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDgK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2798], "errorMessage": "Can not distribute zero units"}, {"pc": [1182], "errorMessage": "Coupon rates are not properly defined"}, {"pc": [1068], "errorMessage": "D-ASA already configured"}, {"pc": [4833], "errorMessage": "Defaulted"}, {"pc": [1075], "errorMessage": "Denomination asset is not properly set"}, {"pc": [1086], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [2814], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2283, 2378], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1173], "errorMessage": "Interest rate is not properly defined"}, {"pc": [1328, 1484, 1679, 1941, 2237, 2252, 2788, 3171, 3242, 3294, 3365, 3394], "errorMessage": "Invalid account holding address"}, {"pc": [3536, 3560, 3584, 3608, 3632, 3689, 3717, 3739, 3761, 3783, 3962, 3980, 3995, 4010, 4025], "errorMessage": "Invalid account role address"}, {"pc": [1346], "errorMessage": "Invalid amount of units for the account"}, {"pc": [1152], "errorMessage": "Invalid day-count convention ID"}, {"pc": [3673, 3952, 4895], "errorMessage": "Invalid role identifier"}, {"pc": [2659], "errorMessage": "Invalid secondary market closure date"}, {"pc": [2625], "errorMessage": "Invalid secondary market opening date"}, {"pc": [1119], "errorMessage": "Minimum denomination is not a divisor of principal"}, {"pc": [1688, 1946], "errorMessage": "No D-ASA units"}, {"pc": [1702], "errorMessage": "No due coupon to pay"}, {"pc": [1661, 1923, 2219, 2588, 2702, 2779, 3162, 3217, 3226, 3283, 3350, 3806, 4502, 4825], "errorMessage": "Not authorized"}, {"pc": [4567], "errorMessage": "Not enough funds for the payment"}, {"pc": [1955], "errorMessage": "Not mature"}, {"pc": [1707, 1962, 4451], "errorMessage": "Pending due coupon payment"}, {"pc": [2771], "errorMessage": "Primary distribution is closed"}, {"pc": [1317], "errorMessage": "Primary distribution not yet executed"}, {"pc": [2210], "errorMessage": "Secondary market is closed"}, {"pc": [2268], "errorMessage": "Sender and receiver must be different"}, {"pc": [2333], "errorMessage": "Sender and receiver units are not fungible"}, {"pc": [4717, 4841], "errorMessage": "Suspended operations"}, {"pc": [1203, 2593], "errorMessage": "Time events length is invalid"}, {"pc": [4618], "errorMessage": "Time events must be set in the future"}, {"pc": [4669], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [1264], "errorMessage": "Time periods are not properly defined"}, {"pc": [4690], "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)"}, {"pc": [2272], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [606], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [612], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [616], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [620], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [4563], "errorMessage": "account opted into asset"}, {"pc": [1785, 2033], "errorMessage": "asset exists"}, {"pc": [4785, 4800], "errorMessage": "check BoxMap entry exists"}, {"pc": [1336, 1500, 1694, 1738, 1750, 1986, 2004, 2276, 2290, 2299, 2306, 2317, 2324, 2338, 2373, 2415, 2459, 2822, 4444, 4493, 4517, 4536, 4711, 4727, 4743], "errorMessage": "check self.account entry exists"}, {"pc": [3824, 4823], "errorMessage": "check self.arranger exists"}, {"pc": [2896, 4831], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [2998, 4839], "errorMessage": "check self.asset_suspended exists"}, {"pc": [1789, 1997, 2037, 2802, 2917, 3306, 4430, 4756], "errorMessage": "check self.circulating_units exists"}, {"pc": [1458], "errorMessage": "check self.coupon_rates exists"}, {"pc": [2929, 4284, 4674], "errorMessage": "check self.day_count_convention exists"}, {"pc": [1781, 2029, 2908], "errorMessage": "check self.denomination_asset_id exists"}, {"pc": [4067, 4111], "errorMessage": "check self.due_coupons_watermark exists"}, {"pc": [2958], "errorMessage": "check self.interest_rate exists"}, {"pc": [2609, 2988, 4100, 4265, 4334, 4344], "errorMessage": "check self.issuance_date exists"}, {"pc": [1953, 2634, 2642, 2879, 2993, 4072], "errorMessage": "check self.maturity_date exists"}, {"pc": [3130], "errorMessage": "check self.metadata exists"}, {"pc": [4460, 4473], "errorMessage": "check self.op_daemon exists"}, {"pc": [1765, 4426], "errorMessage": "check self.paid_coupon_units exists"}, {"pc": [2763, 2983], "errorMessage": "check self.primary_distribution_closure_date exists"}, {"pc": [1301, 1311, 2749, 2978], "errorMessage": "check self.primary_distribution_opening_date exists"}, {"pc": [1167, 2943], "errorMessage": "check self.principal_discount exists"}, {"pc": [2194, 2204, 2673, 3108], "errorMessage": "check self.secondary_market_closure_date exists"}, {"pc": [2183, 2668, 3103], "errorMessage": "check self.secondary_market_opening_date exists"}, {"pc": [2913, 4525, 4560, 4579], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1066, 1445, 1490, 1657, 1919, 2172, 2583, 2738, 3078, 3221], "errorMessage": "check self.status exists"}, {"pc": [3091], "errorMessage": "check self.time_events exists"}, {"pc": [1511, 1595, 4084, 4202, 4353], "errorMessage": "check self.total_coupons exists"}, {"pc": [2810, 2852, 2973], "errorMessage": "check self.total_units exists"}, {"pc": [1794, 2042, 2839, 2922], "errorMessage": "check self.unit_value exists"}, {"pc": [1006, 1028, 1046, 1251, 1641, 1903, 2504, 2543, 2565, 2646, 3474, 4622], "errorMessage": "invalid array length header"}, {"pc": [2692, 3152, 3796], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1019], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1649, 1911, 3482], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1059], "errorMessage": "invalid number of bytes for arc4.dynamic_array>"}, {"pc": [1040, 2576], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1287, 1476, 1635, 1897, 2151, 2159, 2481, 2725, 3144, 3201, 3209, 3275, 3336, 3344, 3386, 3410, 3434, 3468, 3656, 3838, 3922], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [997], "errorMessage": "invalid number of bytes for arc4.uint16"}, {"pc": [941, 950, 959, 968, 977, 1295, 2167, 2733], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [986, 3458, 3646, 3912], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2509, 2548], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata"}, {"pc": [2496, 2535], "errorMessage": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))"}, {"pc": [2491, 2530], "errorMessage": "invalid tuple encoding"}, {"pc": [2935, 2950, 2965, 3006], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" -APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) - -def _parse_abi_args(args: object | None = None) -> list[object] | None: - """Helper to parse ABI args into the format expected by underlying client""" - if args is None: - return None - - def convert_dataclass(value: object) -> object: - if dataclasses.is_dataclass(value): - return tuple(convert_dataclass(getattr(value, field.name)) for field in dataclasses.fields(value)) - elif isinstance(value, (list, tuple)): - return type(value)(convert_dataclass(item) for item in value) - return value - - match args: - case tuple(): - method_args = list(args) - case _ if dataclasses.is_dataclass(args): - method_args = [getattr(args, field.name) for field in dataclasses.fields(args)] - case _: - raise ValueError("Invalid 'args' type. Expected 'tuple' or 'TypedDict' for respective typed arguments.") - - return [ - convert_dataclass(arg) if not isinstance(arg, algokit_utils.AppMethodCallTransactionArgument) else arg - for arg in method_args - ] if method_args else None - -def _init_dataclass(cls: type, data: dict) -> object: - """ - Recursively instantiate a dataclass of type `cls` from `data`. - - For each field on the dataclass, if the field type is also a dataclass - and the corresponding data is a dict, instantiate that field recursively. - """ - field_values = {} - for field in dataclasses.fields(cls): - field_value = data.get(field.name) - # Check if the field expects another dataclass and the value is a dict. - if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict): - field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value) - else: - field_values[field.name] = field_value - return cls(**field_values) - -@dataclasses.dataclass(frozen=True) -class AccountInfo: - """Struct for AccountInfo""" - payment_address: str - units: int - unit_value: int - paid_coupons: int - suspended: bool - -@dataclasses.dataclass(frozen=True) -class AssetInfo: - """Struct for AssetInfo""" - denomination_asset_id: int - settlement_asset_id: int - outstanding_principal: int - unit_value: int - day_count_convention: int - principal_discount: int - interest_rate: int - total_supply: int - circulating_supply: int - primary_distribution_opening_date: int - primary_distribution_closure_date: int - issuance_date: int - maturity_date: int - suspended: bool - performance: int - -@dataclasses.dataclass(frozen=True) -class AssetMetadata: - """Struct for AssetMetadata""" - contract_type: int - calendar: int - business_day_convention: int - end_of_month_convention: int - prepayment_effect: int - penalty_type: int - prospectus_hash: bytes - prospectus_url: str - -@dataclasses.dataclass(frozen=True) -class DayCountFactor: - """Struct for DayCountFactor""" - numerator: int - denominator: int - -@dataclasses.dataclass(frozen=True) -class CouponsInfo: - """Struct for CouponsInfo""" - total_coupons: int - due_coupons: int - next_coupon_due_date: int - day_count_factor: DayCountFactor - all_due_coupons_paid: bool - -@dataclasses.dataclass(frozen=True) -class CurrentUnitsValue: - """Struct for CurrentUnitsValue""" - units_value: int - accrued_interest: int - day_count_factor: DayCountFactor - -@dataclasses.dataclass(frozen=True) -class PaymentAmounts: - """Struct for PaymentAmounts""" - interest: int - principal: int - -@dataclasses.dataclass(frozen=True) -class PaymentResult: - """Struct for PaymentResult""" - amount: int - timestamp: int - context: bytes - -@dataclasses.dataclass(frozen=True) -class RoleConfig: - """Struct for RoleConfig""" - role_validity_start: int - role_validity_end: int - -@dataclasses.dataclass(frozen=True) -class SecondaryMarketSchedule: - """Struct for SecondaryMarketSchedule""" - secondary_market_opening_date: int - secondary_market_closure_date: int - - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetConfigArgs: - """Dataclass for asset_config arguments""" - denomination_asset_id: int - settlement_asset_id: int - principal: int - principal_discount: int - minimum_denomination: int - day_count_convention: int - interest_rate: int - coupon_rates: list[int] - time_events: list[int] - time_periods: list[tuple[int, int]] - - @property - def abi_method_signature(self) -> str: - return "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class GetAccountUnitsCurrentValueArgs: - """Dataclass for get_account_units_current_value arguments""" - holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class GetPaymentAmountArgs: - """Dataclass for get_payment_amount arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "get_payment_amount(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PayCouponArgs: - """Dataclass for pay_coupon arguments""" - holding_address: str - payment_info: bytes | str - - @property - def abi_method_signature(self) -> str: - return "pay_coupon(address,byte[])(uint64,uint64,byte[])" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PayPrincipalArgs: - """Dataclass for pay_principal arguments""" - holding_address: str - payment_info: bytes | str - - @property - def abi_method_signature(self) -> str: - return "pay_principal(address,byte[])(uint64,uint64,byte[])" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetTransferArgs: - """Dataclass for asset_transfer arguments""" - sender_holding_address: str - receiver_holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "asset_transfer(address,address,uint64)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class SetSecondaryTimeEventsArgs: - """Dataclass for set_secondary_time_events arguments""" - secondary_market_time_events: list[int] - - @property - def abi_method_signature(self) -> str: - return "set_secondary_time_events(uint64[])(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class SetDefaultStatusArgs: - """Dataclass for set_default_status arguments""" - defaulted: bool - - @property - def abi_method_signature(self) -> str: - return "set_default_status(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PrimaryDistributionArgs: - """Dataclass for primary_distribution arguments""" - holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "primary_distribution(address,uint64)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGovSuspensionArgs: - """Dataclass for account_gov_suspension arguments""" - holding_address: str - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "account_gov_suspension(address,bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountOpenArgs: - """Dataclass for account_open arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_open(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountCloseArgs: - """Dataclass for account_close arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_close(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountUpdatePaymentAddressArgs: - """Dataclass for account_update_payment_address arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_update_payment_address(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGetInfoArgs: - """Dataclass for account_get_info arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_get_info(address)(address,uint64,uint64,uint64,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRotateArrangerArgs: - """Dataclass for rbac_rotate_arranger arguments""" - new_arranger: str - - @property - def abi_method_signature(self) -> str: - return "rbac_rotate_arranger(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacSetOpDaemonArgs: - """Dataclass for rbac_set_op_daemon arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_set_op_daemon(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacAssignRoleArgs: - """Dataclass for rbac_assign_role arguments""" - role_id: int - role_address: str - config: bytes | str - - @property - def abi_method_signature(self) -> str: - return "rbac_assign_role(uint8,address,byte[])uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRevokeRoleArgs: - """Dataclass for rbac_revoke_role arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_revoke_role(uint8,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGovAssetSuspensionArgs: - """Dataclass for rbac_gov_asset_suspension arguments""" - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "rbac_gov_asset_suspension(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetAddressRolesArgs: - """Dataclass for rbac_get_address_roles arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetRoleConfigArgs: - """Dataclass for rbac_get_role_config arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_role_config(uint8,address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetCreateArgs: - """Dataclass for asset_create arguments""" - arranger: str - metadata: AssetMetadata - - @property - def abi_method_signature(self) -> str: - return "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetUpdateArgs: - """Dataclass for asset_update arguments""" - metadata: AssetMetadata - - @property - def abi_method_signature(self) -> str: - return "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - - -class _FixedCouponBondUpdate: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppUpdateMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - return self.app_client.params.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - -class FixedCouponBondParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_FixedCouponBondUpdate": - return _FixedCouponBondUpdate(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - })) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - })) - - def get_coupon_rates( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupon_rates()uint16[]", - })) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - })) - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - })) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - })) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - })) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - })) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - })) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - })) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - })) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - })) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - })) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> algokit_utils.AppCallParams: - return self.app_client.params.bare.clear_state( - params, - - ) - - -class _FixedCouponBondUpdateTransaction: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - return self.app_client.create_transaction.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - -class FixedCouponBondCreateTransactionParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_FixedCouponBondUpdateTransaction": - return _FixedCouponBondUpdateTransaction(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - })) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - })) - - def get_coupon_rates( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupon_rates()uint16[]", - })) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - })) - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - })) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - })) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - })) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - })) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - })) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - })) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - })) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - })) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - })) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> Transaction: - return self.app_client.create_transaction.bare.clear_state( - params, - - ) - - -class _FixedCouponBondUpdateSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - response = self.app_client.send.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - }), send_params=send_params, compilation_params=compilation_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppUpdateTransactionResult[None], parsed_response) - - -class FixedCouponBondSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_FixedCouponBondUpdateSend": - return _FixedCouponBondUpdateSend(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[None], parsed_response) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[CurrentUnitsValue]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CurrentUnitsValue, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[CurrentUnitsValue], parsed_response) - - def get_coupon_rates( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupon_rates()uint16[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentAmounts]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentAmounts, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentAmounts], parsed_response) - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[CouponsInfo]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CouponsInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[CouponsInfo], parsed_response) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentResult]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentResult, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentResult], parsed_response) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentResult]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentResult, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentResult], parsed_response) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[SecondaryMarketSchedule]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(SecondaryMarketSchedule, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[SecondaryMarketSchedule], parsed_response) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AssetInfo]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AssetInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AssetInfo], parsed_response) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AssetMetadata]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AssetMetadata, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AssetMetadata], parsed_response) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[int, int]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[int, int]], parsed_response) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AccountInfo]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AccountInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AccountInfo], parsed_response) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[str]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[str], parsed_response) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[RoleConfig]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleConfig, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[RoleConfig], parsed_response) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[None], parsed_response) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[algokit_utils.ABIReturn]: - return self.app_client.send.bare.clear_state( - params, - send_params=send_params, - ) - - -class GlobalStateValue(typing.TypedDict): - """Shape of global_state state key values""" - arranger: str - op_daemon: str - asset_suspended: int - asset_defaulted: int - total_units: int - circulating_units: int - unit_value: int - status: int - denomination_asset_id: int - settlement_asset_id: int - day_count_convention: int - metadata: bytes - principal_discount: int - interest_rate: int - total_coupons: int - primary_distribution_opening_date: int - primary_distribution_closure_date: int - issuance_date: int - secondary_market_opening_date: int - secondary_market_closure_date: int - maturity_date: int - paid_coupon_units: int - due_coupons_watermark: int - -class BoxStateValue(typing.TypedDict): - """Shape of box state key values""" - time_events: list[int] - coupon_rates: list[int] - -class FixedCouponBondState: - """Methods to access state for the current FixedCouponBond app""" - - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def global_state( - self - ) -> "_GlobalState": - """Methods to access global_state for the current app""" - return _GlobalState(self.app_client) - - @property - def box( - self - ) -> "_BoxState": - """Methods to access box for the current app""" - return _BoxState(self.app_client) - -class _GlobalState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = {} - - def get_all(self) -> GlobalStateValue: - """Get all current keyed values from global_state state""" - result = self.app_client.state.global_state.get_all() - if not result: - return typing.cast(GlobalStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.global_state.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(GlobalStateValue, converted) - - @property - def arranger(self) -> str: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def op_daemon(self) -> str: - """Get the current value of the op_daemon key in global_state state""" - value = self.app_client.state.global_state.get_value("op_daemon") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def asset_suspended(self) -> int: - """Get the current value of the asset_suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def asset_defaulted(self) -> int: - """Get the current value of the asset_defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def status(self) -> int: - """Get the current value of the status key in global_state state""" - value = self.app_client.state.global_state.get_value("status") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMBytes"], value) # type: ignore - return typing.cast(bytes, value) - - @property - def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def primary_distribution_opening_date(self) -> int: - """Get the current value of the primary_distribution_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def secondary_market_opening_date(self) -> int: - """Get the current value of the secondary_market_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def paid_coupon_units(self) -> int: - """Get the current value of the paid_coupon_units key in global_state state""" - value = self.app_client.state.global_state.get_value("paid_coupon_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def due_coupons_watermark(self) -> int: - """Get the current value of the due_coupons_watermark key in global_state state""" - value = self.app_client.state.global_state.get_value("due_coupons_watermark") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - -class _BoxState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = { - "RoleConfig": RoleConfig, - "AccountInfo": AccountInfo - } - - def get_all(self) -> BoxStateValue: - """Get all current keyed values from box state""" - result = self.app_client.state.box.get_all() - if not result: - return typing.cast(BoxStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.box.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(BoxStateValue, converted) - - @property - def time_events(self) -> list[int]: - """Get the current value of the time_events key in box state""" - value = self.app_client.state.box.get_value("time_events") - if isinstance(value, dict) and "uint64[]" in self._struct_classes: - return _init_dataclass(self._struct_classes["uint64[]"], value) # type: ignore - return typing.cast(list[int], value) - - @property - def coupon_rates(self) -> list[int]: - """Get the current value of the coupon_rates key in box state""" - value = self.app_client.state.box.get_value("coupon_rates") - if isinstance(value, dict) and "uint16[]" in self._struct_classes: - return _init_dataclass(self._struct_classes["uint16[]"], value) # type: ignore - return typing.cast(list[int], value) - - @property - def account_manager(self) -> "_MapState[str, RoleConfig]": - """Get values from the account_manager map in box state""" - return _MapState( - self.app_client.state.box, - "account_manager", - self._struct_classes.get("RoleConfig") - ) - - @property - def primary_dealer(self) -> "_MapState[str, RoleConfig]": - """Get values from the primary_dealer map in box state""" - return _MapState( - self.app_client.state.box, - "primary_dealer", - self._struct_classes.get("RoleConfig") - ) - - @property - def trustee(self) -> "_MapState[str, RoleConfig]": - """Get values from the trustee map in box state""" - return _MapState( - self.app_client.state.box, - "trustee", - self._struct_classes.get("RoleConfig") - ) - - @property - def authority(self) -> "_MapState[str, RoleConfig]": - """Get values from the authority map in box state""" - return _MapState( - self.app_client.state.box, - "authority", - self._struct_classes.get("RoleConfig") - ) - - @property - def interest_oracle(self) -> "_MapState[str, RoleConfig]": - """Get values from the interest_oracle map in box state""" - return _MapState( - self.app_client.state.box, - "interest_oracle", - self._struct_classes.get("RoleConfig") - ) - - @property - def account(self) -> "_MapState[str, AccountInfo]": - """Get values from the account map in box state""" - return _MapState( - self.app_client.state.box, - "account", - self._struct_classes.get("AccountInfo") - ) - -_KeyType = typing.TypeVar("_KeyType") -_ValueType = typing.TypeVar("_ValueType") - -class _AppClientStateMethodsProtocol(typing.Protocol): - def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: - ... - def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: - ... - -class _MapState(typing.Generic[_KeyType, _ValueType]): - """Generic class for accessing state maps with strongly typed keys and values""" - - def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, - struct_class: typing.Type[_ValueType] | None = None): - self._state_accessor = state_accessor - self._map_name = map_name - self._struct_class = struct_class - - def get_map(self) -> dict[_KeyType, _ValueType]: - """Get all current values in the map""" - result = self._state_accessor.get_map(self._map_name) - if self._struct_class and result: - return {k: _init_dataclass(self._struct_class, v) if isinstance(v, dict) else v - for k, v in result.items()} # type: ignore - return typing.cast(dict[_KeyType, _ValueType], result or {}) - - def get_value(self, key: _KeyType) -> _ValueType | None: - """Get a value from the map by key""" - key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore - value = self._state_accessor.get_map_value(self._map_name, key_value) - if value is not None and self._struct_class and isinstance(value, dict): - return _init_dataclass(self._struct_class, value) # type: ignore - return typing.cast(_ValueType | None, value) - - -class FixedCouponBondClient: - """Client for interacting with FixedCouponBond smart contract""" - - @typing.overload - def __init__(self, app_client: algokit_utils.AppClient) -> None: ... - - @typing.overload - def __init__( - self, - *, - algorand: _AlgoKitAlgorandClient, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: ... - - def __init__( - self, - app_client: algokit_utils.AppClient | None = None, - *, - algorand: _AlgoKitAlgorandClient | None = None, - app_id: int | None = None, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: - if app_client: - self.app_client = app_client - elif algorand and app_id: - self.app_client = algokit_utils.AppClient( - algokit_utils.AppClientParams( - algorand=algorand, - app_spec=APP_SPEC, - app_id=app_id, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - else: - raise ValueError("Either app_client or algorand and app_id must be provided") - - self.params = FixedCouponBondParams(self.app_client) - self.create_transaction = FixedCouponBondCreateTransactionParams(self.app_client) - self.send = FixedCouponBondSend(self.app_client) - self.state = FixedCouponBondState(self.app_client) - - @staticmethod - def from_creator_and_name( - creator_address: str, - app_name: str, - algorand: _AlgoKitAlgorandClient, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - ) -> "FixedCouponBondClient": - return FixedCouponBondClient( - algokit_utils.AppClient.from_creator_and_name( - creator_address=creator_address, - app_name=app_name, - app_spec=APP_SPEC, - algorand=algorand, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ignore_cache=ignore_cache, - app_lookup_cache=app_lookup_cache, - ) - ) - - @staticmethod - def from_network( - algorand: _AlgoKitAlgorandClient, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "FixedCouponBondClient": - return FixedCouponBondClient( - algokit_utils.AppClient.from_network( - app_spec=APP_SPEC, - algorand=algorand, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - @property - def app_id(self) -> int: - return self.app_client.app_id - - @property - def app_address(self) -> str: - return self.app_client.app_address - - @property - def app_name(self) -> str: - return self.app_client.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_client.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_client.algorand - - def clone( - self, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "FixedCouponBondClient": - return FixedCouponBondClient( - self.app_client.clone( - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - def new_group(self) -> "FixedCouponBondComposer": - return FixedCouponBondComposer(self) - - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))"], - return_value: algokit_utils.ABIReturn | None - ) -> CurrentUnitsValue | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_coupon_rates()uint16[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_payment_amount(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentAmounts | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> CouponsInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["pay_coupon(address,byte[])(uint64,uint64,byte[])"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentResult | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["pay_principal(address,byte[])(uint64,uint64,byte[])"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentResult | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_transfer(address,address,uint64)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["set_secondary_time_events(uint64[])(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> SecondaryMarketSchedule | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["set_default_status(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["primary_distribution(address,uint64)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)"], - return_value: algokit_utils.ABIReturn | None - ) -> AssetInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_time_events()uint64[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_secondary_market_schedule()uint64[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)"], - return_value: algokit_utils.ABIReturn | None - ) -> AssetMetadata | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_gov_suspension(address,bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_open(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_close(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[int, int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_update_payment_address(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_get_info(address)(address,uint64,uint64,uint64,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> AccountInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_rotate_arranger(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_set_op_daemon(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_assign_role(uint8,address,byte[])uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_revoke_role(uint8,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_arranger()address"], - return_value: algokit_utils.ABIReturn | None - ) -> str | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_address_roles(address)(bool,bool,bool,bool,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[bool, bool, bool, bool, bool] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_role_config(uint8,address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> RoleConfig | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None: ... - - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | AccountInfo | AssetInfo | AssetMetadata | CouponsInfo | CurrentUnitsValue | None | PaymentAmounts | PaymentResult | RoleConfig | SecondaryMarketSchedule | int | list[int] | str | tuple[bool, bool, bool, bool, bool] | tuple[int, int]: - """Decode ABI return value for the given method.""" - if return_value is None: - return None - - arc56_method = self.app_spec.get_arc56_method(method) - decoded = return_value.get_arc56_value(arc56_method, self.app_spec.structs) - - # If method returns a struct, convert the dict to appropriate dataclass - if (arc56_method and - arc56_method.returns and - arc56_method.returns.struct and - isinstance(decoded, dict)): - struct_class = globals().get(arc56_method.returns.struct) - if struct_class: - return struct_class(**typing.cast(dict, decoded)) - return decoded - - -@dataclasses.dataclass(frozen=True) -class FixedCouponBondMethodCallCreateParams( - algokit_utils.AppClientCreateSchema, algokit_utils.BaseAppClientMethodCallParams[ - AssetCreateArgs, - str | None, - ] -): - """Parameters for creating FixedCouponBond contract using ABI""" - on_complete: typing.Literal[OnComplete.NoOpOC] | None = None - method: str | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallCreateParams: - method_args = _parse_abi_args(self.args) - return algokit_utils.AppClientMethodCallCreateParams( - **{ - **self.__dict__, - "method": self.method or getattr(self.args, "abi_method_signature", None), - "args": method_args, - } - ) - -@dataclasses.dataclass(frozen=True) -class FixedCouponBondMethodCallUpdateParams( - algokit_utils.BaseAppClientMethodCallParams[ - AssetUpdateArgs, - str | None, - ] -): - """Parameters for calling FixedCouponBond contract using ABI""" - on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None - method: str | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallParams: - method_args = _parse_abi_args(self.args) - return algokit_utils.AppClientMethodCallParams( - **{ - **self.__dict__, - "method": self.method or getattr(self.args, "abi_method_signature", None), - "args": method_args, - } - ) - -class FixedCouponBondFactory(algokit_utils.TypedAppFactoryProtocol[FixedCouponBondMethodCallCreateParams, FixedCouponBondMethodCallUpdateParams, None]): - """Factory for deploying and managing FixedCouponBondClient smart contracts""" - - def __init__( - self, - algorand: _AlgoKitAlgorandClient, - *, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - version: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ): - self.app_factory = algokit_utils.AppFactory( - params=algokit_utils.AppFactoryParams( - algorand=algorand, - app_spec=APP_SPEC, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - version=version, - compilation_params=compilation_params, - ) - ) - self.params = FixedCouponBondFactoryParams(self.app_factory) - self.create_transaction = FixedCouponBondFactoryCreateTransaction(self.app_factory) - self.send = FixedCouponBondFactorySend(self.app_factory) - - @property - def app_name(self) -> str: - return self.app_factory.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_factory.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_factory.algorand - - def deploy( - self, - *, - on_update: algokit_utils.OnUpdate | None = None, - on_schema_break: algokit_utils.OnSchemaBreak | None = None, - create_params: FixedCouponBondMethodCallCreateParams | None = None, - update_params: FixedCouponBondMethodCallUpdateParams | None = None, - delete_params: None = None, - existing_deployments: algokit_utils.ApplicationLookup | None = None, - ignore_cache: bool = False, - app_name: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - send_params: algokit_utils.SendParams | None = None, - ) -> tuple[FixedCouponBondClient, algokit_utils.AppFactoryDeployResult]: - """Deploy the application""" - deploy_response = self.app_factory.deploy( - on_update=on_update, - on_schema_break=on_schema_break, - create_params=create_params.to_algokit_utils_params() if create_params else None, - update_params=update_params.to_algokit_utils_params() if update_params else None, - delete_params=delete_params, - existing_deployments=existing_deployments, - ignore_cache=ignore_cache, - app_name=app_name, - compilation_params=compilation_params, - send_params=send_params, - ) - - return FixedCouponBondClient(deploy_response[0]), deploy_response[1] - - def get_app_client_by_creator_and_name( - self, - creator_address: str, - app_name: str, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> FixedCouponBondClient: - """Get an app client by creator address and name""" - return FixedCouponBondClient( - self.app_factory.get_app_client_by_creator_and_name( - creator_address, - app_name, - default_sender, - default_signer, - ignore_cache, - app_lookup_cache, - approval_source_map, - clear_source_map, - ) - ) - - def get_app_client_by_id( - self, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> FixedCouponBondClient: - """Get an app client by app ID""" - return FixedCouponBondClient( - self.app_factory.get_app_client_by_id( - app_id, - app_name, - default_sender, - default_signer, - approval_source_map, - clear_source_map, - ) - ) - - -class FixedCouponBondFactoryParams: - """Parameters for creating transactions for FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = FixedCouponBondFactoryCreateParams(app_factory) - self.update = FixedCouponBondFactoryUpdateParams(app_factory) - self.delete = FixedCouponBondFactoryDeleteParams(app_factory) - -class FixedCouponBondFactoryCreateParams: - """Parameters for 'create' operations of FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateParams: - """Creates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - compilation_params=compilation_params) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_coupon_rates( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_coupon_rates()uint16[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_coupon_rates()uint16[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_payment_amount(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_coupons_status( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the pay_coupon(address,byte[])(uint64,uint64,byte[]) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the pay_principal(address,byte[])(uint64,uint64,byte[]) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_transfer(address,address,uint64)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_secondary_time_events(uint64[])(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_default_status(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the primary_distribution(address,uint64)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_asset_info( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_time_events( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_time_events()uint64[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_secondary_market_schedule( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_secondary_market_schedule()uint64[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_asset_metadata( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_gov_suspension(address,bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_open(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_close(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_update_payment_address(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_get_info(address)(address,uint64,uint64,uint64,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_rotate_arranger(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_set_op_daemon(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_assign_role(uint8,address,byte[])uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_revoke_role(uint8,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_arranger( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_arranger()address ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_address_roles(address)(bool,bool,bool,bool,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_role_config(uint8,address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - -class FixedCouponBondFactoryUpdateParams: - """Parameters for 'update' operations of FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppUpdateParams: - """Updates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_update( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - -class FixedCouponBondFactoryDeleteParams: - """Parameters for 'delete' operations of FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppDeleteParams: - """Deletes an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_delete( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - - -class FixedCouponBondFactoryCreateTransaction: - """Create transactions for FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = FixedCouponBondFactoryCreateTransactionCreate(app_factory) - - -class FixedCouponBondFactoryCreateTransactionCreate: - """Create new instances of FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - params: algokit_utils.CommonAppCallCreateParams | None = None, - ) -> Transaction: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.create_transaction.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - ) - - -class FixedCouponBondFactorySend: - """Send calls to FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = FixedCouponBondFactorySendCreate(app_factory) - - -class FixedCouponBondFactorySendCreate: - """Send create calls to FixedCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ) -> tuple[FixedCouponBondClient, algokit_utils.SendAppCreateTransactionResult]: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - result = self.app_factory.send.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - send_params=send_params, - compilation_params=compilation_params - ) - return FixedCouponBondClient(result[0]), result[1] - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> tuple[FixedCouponBondClient, algokit_utils.AppFactoryCreateMethodCallResult[None]]: - """Creates and sends a transaction using the asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - client, result = self.app_factory.send.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - send_params=send_params, - compilation_params=compilation_params - ) - return_value = None if result.abi_return is None else typing.cast(None, result.abi_return) - - return FixedCouponBondClient(client), algokit_utils.AppFactoryCreateMethodCallResult[None]( - **{ - **result.__dict__, - "app_id": result.app_id, - "abi_return": return_value, - "transaction": result.transaction, - "confirmation": result.confirmation, - "group_id": result.group_id, - "tx_ids": result.tx_ids, - "transactions": result.transactions, - "confirmations": result.confirmations, - "app_address": result.app_address, - } - ) - - -class _FixedCouponBondUpdateComposer: - def __init__(self, composer: "FixedCouponBondComposer"): - self.composer = composer - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self.composer._composer.add_app_update_method_call( - self.composer.client.params.update.asset_update( - args=args, - params=params, - compilation_params=compilation_params - ) - ) - self.composer._result_mappers.append( - lambda v: self.composer.client.decode_return_value( - "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", v - ) - ) - return self.composer - - -class FixedCouponBondComposer: - """Composer for creating transaction groups for FixedCouponBond contract calls""" - - def __init__(self, client: "FixedCouponBondClient"): - self.client = client - self._composer = client.algorand.new_group() - self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] - - @property - def update(self) -> "_FixedCouponBondUpdateComposer": - return _FixedCouponBondUpdateComposer(self) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", v - ) - ) - return self - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_account_units_current_value( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", v - ) - ) - return self - - def get_coupon_rates( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_coupon_rates( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_coupon_rates()uint16[]", v - ) - ) - return self - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_payment_amount( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_payment_amount(address)(uint64,uint64)", v - ) - ) - return self - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_coupons_status( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", v - ) - ) - return self - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.pay_coupon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "pay_coupon(address,byte[])(uint64,uint64,byte[])", v - ) - ) - return self - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.pay_principal( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "pay_principal(address,byte[])(uint64,uint64,byte[])", v - ) - ) - return self - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_transfer( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_transfer(address,address,uint64)uint64", v - ) - ) - return self - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.set_secondary_time_events( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "set_secondary_time_events(uint64[])(uint64,uint64)", v - ) - ) - return self - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.set_default_status( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "set_default_status(bool)uint64", v - ) - ) - return self - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.primary_distribution( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "primary_distribution(address,uint64)uint64", v - ) - ) - return self - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_asset_info( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", v - ) - ) - return self - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_time_events( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_time_events()uint64[]", v - ) - ) - return self - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_secondary_market_schedule( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_secondary_market_schedule()uint64[]", v - ) - ) - return self - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_asset_metadata( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", v - ) - ) - return self - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_gov_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_gov_suspension(address,bool)uint64", v - ) - ) - return self - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_open( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_open(address,address)uint64", v - ) - ) - return self - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_close( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_close(address)(uint64,uint64)", v - ) - ) - return self - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_update_payment_address( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_update_payment_address(address,address)uint64", v - ) - ) - return self - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_get_info( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_get_info(address)(address,uint64,uint64,uint64,bool)", v - ) - ) - return self - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_rotate_arranger( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_rotate_arranger(address)uint64", v - ) - ) - return self - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_set_op_daemon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_set_op_daemon(address)uint64", v - ) - ) - return self - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_assign_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_assign_role(uint8,address,byte[])uint64", v - ) - ) - return self - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_revoke_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_revoke_role(uint8,address)uint64", v - ) - ) - return self - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_gov_asset_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_gov_asset_suspension(bool)uint64", v - ) - ) - return self - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_arranger( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_arranger()address", v - ) - ) - return self - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_address_roles( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", v - ) - ) - return self - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_role_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_role_config(uint8,address)(uint64,uint64)", v - ) - ) - return self - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_create( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", v - ) - ) - return self - - def clear_state( - self, - *, - args: list[bytes] | None = None, - params: algokit_utils.CommonAppCallParams | None = None, - ) -> "FixedCouponBondComposer": - params=params or algokit_utils.CommonAppCallParams() - self._composer.add_app_call( - self.client.params.clear_state( - algokit_utils.AppClientBareCallParams( - **{ - **dataclasses.asdict(params), - "args": args - } - ) - ) - ) - return self - - def add_transaction( - self, txn: Transaction, signer: TransactionSigner | None = None - ) -> "FixedCouponBondComposer": - self._composer.add_transaction(txn, signer) - return self - - def composer(self) -> algokit_utils.TransactionComposer: - return self._composer - - def simulate( - self, - allow_more_logs: bool | None = None, - allow_empty_signatures: bool | None = None, - allow_unnamed_resources: bool | None = None, - extra_opcode_budget: int | None = None, - exec_trace_config: SimulateTraceConfig | None = None, - simulation_round: int | None = None, - skip_signatures: bool | None = None, - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.simulate( - allow_more_logs=allow_more_logs, - allow_empty_signatures=allow_empty_signatures, - allow_unnamed_resources=allow_unnamed_resources, - extra_opcode_budget=extra_opcode_budget, - exec_trace_config=exec_trace_config, - simulation_round=simulation_round, - skip_signatures=skip_signatures, - ) - - def send( - self, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.send(send_params) diff --git a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.puya.map b/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.puya.map deleted file mode 100644 index e7c96b13..00000000 --- a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.puya.map +++ /dev/null @@ -1,7793 +0,0 @@ -{ - "version": 3, - "sources": [ - "../../../modules/accounting.py", - "../../../modules/rbac.py", - "../../mock_module_accounting/contract.py" - ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC8BmD;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAgBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AD9BA;;;;;;;;;;;;;AAAmB;AAAnB;AACA;;AAAyB;AAAzB;AACA;;;;;;;;;;;;AAAkB;AAAlB;AACA;;AAAc;AAAd;AEhBR;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAQK;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAEG;AAAsB;;AAAtB;AAFH;AAAA;AFgFA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACjB+B;AAAgB;;AAArC;;;AAAP;AD9C0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmFA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACjD+B;AAAsB;;AAA3C;;;AAAP;ADxCO;AAAA;;AAAA;AAAA;AAAe;;;AAAf;AA+GA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAIU;AAFsB;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAhC;AAOO;;AAlCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACrF+B;AAAsB;;AAA3C;;;AAAP;ADuGA;;;AA5I0B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+Ie;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACf;;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAhIR;;;AACY;;AAAc;;;AAAd;AAiIiB;;AAzBxB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBU;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AA3K0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA6KA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL6B;;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+LO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AC5DA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGc;AAAX;AAAX;;;AACY;AAAA;;AAAA;AAqGG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxEM;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA+FJ;;;AA7FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA2FJ;;;AAzFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAuFJ;;;AArFG;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAmFJ;;;AAjFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAkFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGO;AAAW;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAmGG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1EM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA8FJ;;;AA5FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA0FJ;;;AAxFG;AAAW;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAsFJ;;;AApFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAqFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzJ+B;AAAgB;;AAArC;;;AAAP;AAyKA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;AAIA;;;;;;;AALT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA5QL;;AAAA;AAAA;AAAA;AAAA;;AA2QC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;AAvQL;;AAAA;AAAA;AAAA;AAAA;;AAsQC;AAGO;AAAA;AAxClB;;;AAiCe;;AAlQL;;AAAA;AAAA;AAAA;AAAA;;AAiQC;AAGO;AAAA;AAnClB;;;AA4Be;;AA7PL;;AAAA;AAAA;AAAA;AAAA;;AA4PC;AAGO;AAAA;AA9BlB;;;AAuBe;AAxPL;;AAAA;AAAA;AAAA;AAAA;;AAuPC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AA/ND;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.approval_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "intcblock 1 0 32 20" - }, - "7": { - "op": "bytecblock 0x151f7c75 0x52323023 0x52373023 0x52343023 0x52333023 0x52353023 0x52363023 0x52383023 \"asset_suspended\" \"circulating_units\" \"status\" 0x52323523 \"asset_defaulted\"" - }, - "111": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "113": { - "op": "bnz main_after_if_else@2", - "stack_out": [] - }, - "116": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "117": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323023", - "tmp%0#2" - ], - "stack_out": [ - "0x52323023", - "tmp%0#2" - ] - }, - "119": { - "op": "app_global_put", - "stack_out": [] - }, - "120": { - "op": "bytec 11 // 0x52323523", - "defined_out": [ - "0x52323523" - ], - "stack_out": [ - "0x52323523" - ] - }, - "122": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323523", - "tmp%1#2" - ], - "stack_out": [ - "0x52323523", - "tmp%1#2" - ] - }, - "124": { - "op": "app_global_put", - "stack_out": [] - }, - "125": { - "op": "bytec 8 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"" - ], - "stack_out": [ - "\"asset_suspended\"" - ] - }, - "127": { - "op": "intc_1 // 0", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "\"asset_suspended\"", - "0" - ] - }, - "128": { - "op": "app_global_put", - "stack_out": [] - }, - "129": { - "op": "bytec 12 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"" - ], - "stack_out": [ - "\"asset_defaulted\"" - ] - }, - "131": { - "op": "intc_1 // 0", - "stack_out": [ - "\"asset_defaulted\"", - "0" - ] - }, - "132": { - "op": "app_global_put", - "stack_out": [] - }, - "133": { - "op": "pushbytes \"total_units\"", - "defined_out": [ - "\"total_units\"" - ], - "stack_out": [ - "\"total_units\"" - ] - }, - "146": { - "op": "intc_1 // 0", - "stack_out": [ - "\"total_units\"", - "0" - ] - }, - "147": { - "op": "app_global_put", - "stack_out": [] - }, - "148": { - "op": "bytec 9 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"" - ], - "stack_out": [ - "\"circulating_units\"" - ] - }, - "150": { - "op": "intc_1 // 0", - "stack_out": [ - "\"circulating_units\"", - "0" - ] - }, - "151": { - "op": "app_global_put", - "stack_out": [] - }, - "152": { - "op": "pushbytes \"unit_value\"", - "defined_out": [ - "\"unit_value\"" - ], - "stack_out": [ - "\"unit_value\"" - ] - }, - "164": { - "op": "intc_1 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "165": { - "op": "app_global_put", - "stack_out": [] - }, - "166": { - "op": "bytec 10 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "\"status\"" - ] - }, - "168": { - "op": "intc_1 // 0", - "stack_out": [ - "\"status\"", - "0" - ] - }, - "169": { - "op": "app_global_put", - "stack_out": [] - }, - "170": { - "block": "main_after_if_else@2", - "stack_in": [], - "op": "txn NumAppArgs", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "172": { - "op": "bz main_create@22", - "stack_out": [] - }, - "175": { - "op": "txn OnCompletion", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "177": { - "op": "!", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "178": { - "op": "assert", - "stack_out": [] - }, - "179": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "181": { - "op": "assert", - "stack_out": [] - }, - "182": { - "op": "pushbytess 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method \"account_gov_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_close(address)(uint64,uint64)\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_info(address)(address,uint64,uint64,uint64,bool)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,byte[])uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_config(uint8,address)(uint64,uint64)\"", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)" - ], - "stack_out": [ - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))" - ] - }, - "249": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "tmp%6#0" - ], - "stack_out": [ - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "tmp%6#0" - ] - }, - "252": { - "op": "match account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config", - "stack_out": [] - }, - "280": { - "op": "err" - }, - "281": { - "block": "main_create@22", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "283": { - "op": "!", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "284": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%8#0", - "tmp%9#0" - ], - "stack_out": [ - "tmp%8#0", - "tmp%9#0" - ] - }, - "286": { - "op": "!", - "defined_out": [ - "tmp%10#0", - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0", - "tmp%10#0" - ] - }, - "287": { - "op": "&&", - "defined_out": [ - "tmp%11#0" - ], - "stack_out": [ - "tmp%11#0" - ] - }, - "288": { - "op": "assert", - "stack_out": [] - }, - "289": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "290": { - "op": "txn Sender", - "defined_out": [ - "0x52323023", - "tmp%0#2" - ], - "stack_out": [ - "0x52323023", - "tmp%0#2" - ] - }, - "292": { - "op": "app_global_put", - "stack_out": [] - }, - "293": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "294": { - "op": "return", - "stack_out": [] - }, - "295": { - "subroutine": "modules.accounting.AccountingModule.account_gov_suspension[routing]", - "params": {}, - "block": "account_gov_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "298": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "299": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "300": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "301": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "302": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "303": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "306": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "307": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "308": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "1" - ] - }, - "309": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "310": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "311": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0" - ] - }, - "312": { - "op": "getbit", - "defined_out": [ - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "313": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023" - ] - }, - "314": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "316": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ] - }, - "319": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "320": { - "op": "bytec 4 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52333023" - ] - }, - "322": { - "op": "uncover 2", - "stack_out": [ - "suspended#0", - "0x52333023", - "holding_address#0" - ] - }, - "324": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "325": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "326": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "327": { - "op": "bury 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "329": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "330": { - "op": "dup", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "331": { - "op": "pushint 56", - "defined_out": [ - "56", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56" - ] - }, - "333": { - "op": "intc_0 // 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56", - "1" - ] - }, - "334": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0", - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0" - ] - }, - "335": { - "op": "intc_1 // 0", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0" - ] - }, - "336": { - "op": "uncover 3", - "stack_out": [ - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0", - "suspended#0" - ] - }, - "338": { - "op": "setbit", - "defined_out": [ - "aggregate%updated_target%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%updated_target%0#0" - ] - }, - "339": { - "op": "pushint 56" - }, - "341": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "56", - "aggregate%updated_target%0#0" - ] - }, - "342": { - "op": "box_replace", - "stack_out": [] - }, - "343": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "345": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "346": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "347": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "348": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "349": { - "op": "log", - "stack_out": [] - }, - "350": { - "op": "intc_0 // 1", - "stack_out": [ - "1" - ] - }, - "351": { - "op": "return", - "stack_out": [] - }, - "352": { - "subroutine": "modules.accounting.AccountingModule.account_open[routing]", - "params": {}, - "block": "account_open", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "355": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "356": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "357": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "358": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "359": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "360": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "363": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ] - }, - "364": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0" - ] - }, - "365": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0", - "32" - ] - }, - "366": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "eq%1#0" - ] - }, - "367": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "368": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023" - ] - }, - "369": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023", - "tmp%0#3" - ] - }, - "371": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "374": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "375": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0" - ] - }, - "376": { - "op": "bytec 10 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0", - "\"status\"" - ] - }, - "378": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "379": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0" - ] - }, - "380": { - "op": "pushint 200", - "defined_out": [ - "200", - "holding_address#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "200" - ] - }, - "383": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#2" - ] - }, - "384": { - "op": "!", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "385": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "386": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "389": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "392": { - "op": "bytec 4 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52333023" - ] - }, - "394": { - "op": "uncover 2", - "stack_out": [ - "payment_address#0", - "0x52333023", - "holding_address#0" - ] - }, - "396": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "397": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "398": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "399": { - "op": "bury 1", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "401": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "tmp%2#1" - ] - }, - "402": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "403": { - "op": "intc_1 // 0", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "0" - ] - }, - "404": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "405": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0" - ] - }, - "407": { - "op": "dig 1", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "409": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0" - ] - }, - "410": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "412": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%2#0" - ] - }, - "413": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "414": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0" - ] - }, - "415": { - "op": "pushbytes 0x00", - "defined_out": [ - "0x00", - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0", - "0x00" - ] - }, - "418": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%4#0" - ] - }, - "419": { - "op": "box_put", - "stack_out": [] - }, - "420": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "422": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0" - ] - }, - "423": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "424": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "425": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "426": { - "op": "log", - "stack_out": [] - }, - "427": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "428": { - "op": "return", - "stack_out": [] - }, - "429": { - "subroutine": "modules.accounting.AccountingModule.account_close[routing]", - "params": {}, - "block": "account_close", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "432": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "433": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "434": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "435": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "436": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "437": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52343023" - ] - }, - "438": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "440": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "tmp%1#2" - ] - }, - "443": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0" - ] - }, - "444": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "447": { - "op": "bytec 4 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "449": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "450": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "451": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "452": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "453": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "455": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "456": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "457": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "458": { - "op": "pop", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "459": { - "op": "intc_2 // 32", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "460": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ] - }, - "461": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "closed_units#0", - "closed_units#0 (copy)" - ] - }, - "462": { - "op": "uncover 2", - "defined_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "box_prefixed_key%0#1" - ] - }, - "464": { - "op": "box_del", - "defined_out": [ - "closed_units#0", - "{box_del}" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "{box_del}" - ] - }, - "465": { - "op": "pop", - "stack_out": [ - "closed_units#0", - "closed_units#0" - ] - }, - "466": { - "op": "intc_1 // 0", - "stack_out": [ - "closed_units#0", - "closed_units#0", - "0" - ] - }, - "467": { - "op": "bytec 9 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "0", - "\"circulating_units\"" - ] - }, - "469": { - "op": "app_global_get_ex", - "defined_out": [ - "closed_units#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "470": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "closed_units#0", - "closed_units#0", - "maybe_value%0#0" - ] - }, - "471": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "maybe_value%0#0", - "closed_units#0" - ] - }, - "472": { - "op": "-", - "defined_out": [ - "closed_units#0", - "tmp%0#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%0#1" - ] - }, - "473": { - "op": "bytec 9 // \"circulating_units\"", - "stack_out": [ - "closed_units#0", - "tmp%0#1", - "\"circulating_units\"" - ] - }, - "475": { - "op": "dig 1", - "defined_out": [ - "\"circulating_units\"", - "closed_units#0", - "tmp%0#1", - "tmp%0#1 (copy)" - ], - "stack_out": [ - "closed_units#0", - "tmp%0#1", - "\"circulating_units\"", - "tmp%0#1 (copy)" - ] - }, - "477": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0", - "tmp%0#1" - ] - }, - "478": { - "op": "bnz account_close_after_if_else@3", - "stack_out": [ - "closed_units#0" - ] - }, - "481": { - "op": "bytec 10 // \"status\"", - "defined_out": [ - "\"status\"", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "\"status\"" - ] - }, - "483": { - "op": "pushint 200", - "defined_out": [ - "\"status\"", - "200", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "\"status\"", - "200" - ] - }, - "486": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0" - ] - }, - "487": { - "block": "account_close_after_if_else@3", - "stack_in": [ - "closed_units#0" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1" - ] - }, - "489": { - "op": "dig 1", - "defined_out": [ - "closed_units#0", - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1", - "closed_units#0" - ] - }, - "491": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "closed_units#0", - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "492": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#1" - ] - }, - "493": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "494": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "aggregate%head%1#0" - ] - }, - "495": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "496": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "497": { - "op": "concat", - "defined_out": [ - "closed_units#0", - "tmp%5#0" - ], - "stack_out": [ - "closed_units#0", - "tmp%5#0" - ] - }, - "498": { - "op": "log", - "stack_out": [ - "closed_units#0" - ] - }, - "499": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "1" - ] - }, - "500": { - "op": "return", - "stack_out": [ - "closed_units#0" - ] - }, - "501": { - "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", - "params": {}, - "block": "account_update_payment_address", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "504": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "505": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "506": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "507": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "508": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "509": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "512": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "513": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "514": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "32" - ] - }, - "515": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "516": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "517": { - "op": "txn Sender", - "defined_out": [ - "holding_address#0", - "tmp%0#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1" - ] - }, - "519": { - "op": "dig 2", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1", - "holding_address#0 (copy)" - ] - }, - "521": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%1#1" - ] - }, - "522": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "523": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "526": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "529": { - "op": "bytec 4 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0x52333023" - ] - }, - "531": { - "op": "uncover 2", - "stack_out": [ - "tmp%2#0", - "0x52333023", - "holding_address#0" - ] - }, - "533": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "534": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "535": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "536": { - "op": "bury 1", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "538": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "539": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "0" - ] - }, - "540": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#1", - "0", - "tmp%2#0" - ] - }, - "542": { - "op": "box_replace", - "stack_out": [] - }, - "543": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "545": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "546": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "547": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "548": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "549": { - "op": "log", - "stack_out": [] - }, - "550": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "551": { - "op": "return", - "stack_out": [] - }, - "552": { - "subroutine": "modules.accounting.AccountingModule.account_get_info[routing]", - "params": {}, - "block": "account_get_info", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "555": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "556": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "557": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "558": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "559": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "560": { - "op": "bytec 4 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "562": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "563": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "564": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "565": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "566": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "568": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "569": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "570": { - "op": "pop", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "571": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "0x151f7c75" - ] - }, - "572": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ] - }, - "573": { - "op": "concat", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "574": { - "op": "log", - "stack_out": [] - }, - "575": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "576": { - "op": "return", - "stack_out": [] - }, - "577": { - "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", - "params": {}, - "block": "rbac_rotate_arranger", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0" - ] - }, - "580": { - "op": "dup", - "defined_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ], - "stack_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ] - }, - "581": { - "op": "len", - "defined_out": [ - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0" - ] - }, - "582": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0", - "32" - ] - }, - "583": { - "op": "==", - "defined_out": [ - "eq%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "eq%0#0" - ] - }, - "584": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "new_arranger#0" - ] - }, - "585": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "588": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0x52323023", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "0x52323023" - ] - }, - "589": { - "op": "swap", - "stack_out": [ - "0x52323023", - "new_arranger#0" - ] - }, - "590": { - "op": "app_global_put", - "stack_out": [] - }, - "591": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "593": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "594": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "595": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "596": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "597": { - "op": "log", - "stack_out": [] - }, - "598": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "599": { - "op": "return", - "stack_out": [] - }, - "600": { - "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", - "params": {}, - "block": "rbac_set_op_daemon", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "603": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "604": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "605": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "606": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "607": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "608": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "611": { - "op": "bytec 11 // 0x52323523", - "defined_out": [ - "0x52323523", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52323523" - ] - }, - "613": { - "op": "swap", - "stack_out": [ - "0x52323523", - "address#0" - ] - }, - "614": { - "op": "app_global_put", - "stack_out": [] - }, - "615": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "617": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "618": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "619": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "620": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "621": { - "op": "log", - "stack_out": [] - }, - "622": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "623": { - "op": "return", - "stack_out": [] - }, - "624": { - "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", - "params": {}, - "block": "rbac_assign_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "627": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "628": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "629": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "630": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "631": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "632": { - "op": "txna ApplicationArgs 2" - }, - "635": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "636": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "638": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "639": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "640": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "641": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "642": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "645": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ] - }, - "646": { - "op": "intc_1 // 0", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)", - "0" - ] - }, - "647": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0" - ] - }, - "648": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "650": { - "op": "+", - "defined_out": [ - "add%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0" - ] - }, - "651": { - "op": "dig 1", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "tmp%3#0 (copy)" - ] - }, - "653": { - "op": "len", - "defined_out": [ - "add%0#0", - "len%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "len%2#0" - ] - }, - "654": { - "op": "==", - "defined_out": [ - "eq%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "eq%2#0" - ] - }, - "655": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "656": { - "op": "extract 2 0", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "config#0" - ] - }, - "659": { - "op": "swap", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#0" - ] - }, - "660": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "663": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "666": { - "op": "btoi", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "667": { - "op": "dupn 2", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "669": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "672": { - "op": "intc_3 // 20", - "defined_out": [ - "20", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "20" - ] - }, - "673": { - "op": "==", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%0#2" - ] - }, - "674": { - "op": "bz rbac_assign_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "677": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0x52323023", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023" - ] - }, - "678": { - "op": "dig 3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023", - "role_address#0" - ] - }, - "680": { - "op": "app_global_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "681": { - "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%2#1" - ] - }, - "683": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "684": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "685": { - "op": "swap", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "686": { - "op": "concat", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#0" - ] - }, - "687": { - "op": "log", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "688": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "1" - ] - }, - "689": { - "op": "return", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "690": { - "block": "rbac_assign_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "691": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "693": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%1#1" - ] - }, - "694": { - "op": "bz rbac_assign_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "697": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023" - ] - }, - "698": { - "op": "dig 3", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "700": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "701": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "702": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "703": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "705": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "tmp%2#2" - ] - }, - "706": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "707": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "config#0" - ] - }, - "709": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "710": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "713": { - "block": "rbac_assign_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "714": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "716": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%3#1" - ] - }, - "717": { - "op": "bz rbac_assign_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "720": { - "op": "bytec 5 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023" - ] - }, - "722": { - "op": "dig 3", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "724": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "725": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "726": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "727": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "729": { - "op": "!", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1", - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "tmp%4#0" - ] - }, - "730": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "731": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%2#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "config#0" - ] - }, - "733": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "734": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "737": { - "block": "rbac_assign_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "738": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "740": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%5#0" - ] - }, - "741": { - "op": "bz rbac_assign_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "744": { - "op": "bytec 6 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023" - ] - }, - "746": { - "op": "dig 3", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "748": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "749": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "750": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "751": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "753": { - "op": "!", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1", - "tmp%6#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "tmp%6#1" - ] - }, - "754": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "755": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%4#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "config#0" - ] - }, - "757": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "758": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "761": { - "block": "rbac_assign_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "762": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "764": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%7#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#1" - ] - }, - "765": { - "op": "bz rbac_assign_role_after_if_else@11", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "768": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023" - ] - }, - "769": { - "op": "dig 3", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "771": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "772": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "773": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "774": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "776": { - "op": "!", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1", - "tmp%8#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "tmp%8#0" - ] - }, - "777": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "778": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%6#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "config#0" - ] - }, - "780": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "781": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "784": { - "block": "rbac_assign_role_after_if_else@11", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "785": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "787": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%9#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%9#0" - ] - }, - "788": { - "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "791": { - "op": "bytec 7 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023" - ] - }, - "793": { - "op": "dig 3", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "795": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "796": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "797": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "798": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "800": { - "op": "!", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1", - "tmp%10#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "tmp%10#0" - ] - }, - "801": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "802": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%8#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "config#0" - ] - }, - "804": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "805": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "808": { - "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", - "params": {}, - "block": "rbac_revoke_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "811": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "812": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "813": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "814": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "815": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "816": { - "op": "txna ApplicationArgs 2" - }, - "819": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "820": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "822": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "823": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "824": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "825": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "826": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "829": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "832": { - "op": "btoi", - "defined_out": [ - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "833": { - "op": "dupn 2", - "defined_out": [ - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "835": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "838": { - "op": "dup", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "839": { - "op": "intc_3 // 20", - "defined_out": [ - "20", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)", - "20" - ] - }, - "840": { - "op": "!=", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "tmp%0#2" - ] - }, - "841": { - "error": "Invalid role identifier", - "op": "assert // Invalid role identifier", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "842": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "844": { - "op": "==", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ] - }, - "845": { - "op": "bz rbac_revoke_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "848": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023" - ] - }, - "849": { - "op": "dig 2", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "851": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "852": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "853": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "854": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "856": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "857": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "858": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "859": { - "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#1" - ] - }, - "861": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "862": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "863": { - "op": "swap", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "864": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#0" - ] - }, - "865": { - "op": "log", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "866": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "1" - ] - }, - "867": { - "op": "return", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "868": { - "block": "rbac_revoke_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "869": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "871": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#2" - ] - }, - "872": { - "op": "bz rbac_revoke_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "875": { - "op": "bytec 5 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023" - ] - }, - "877": { - "op": "dig 2", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "879": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "880": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "881": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "882": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "884": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "885": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "886": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "887": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "890": { - "block": "rbac_revoke_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "891": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "893": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%3#0" - ] - }, - "894": { - "op": "bz rbac_revoke_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "897": { - "op": "bytec 6 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023" - ] - }, - "899": { - "op": "dig 2", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "901": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "902": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "903": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "904": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "906": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "907": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "908": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "909": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "912": { - "block": "rbac_revoke_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "913": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "915": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%4#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%4#1" - ] - }, - "916": { - "op": "bz rbac_revoke_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "919": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023" - ] - }, - "920": { - "op": "dig 2", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "922": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "923": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "924": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "925": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "927": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "928": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "929": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "930": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "933": { - "block": "rbac_revoke_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "934": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "936": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#1" - ] - }, - "937": { - "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "940": { - "op": "bytec 7 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023" - ] - }, - "942": { - "op": "dig 2", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "944": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "945": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "946": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "947": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "949": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "950": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "951": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "952": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "955": { - "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", - "params": {}, - "block": "rbac_gov_asset_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "958": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "959": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "960": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "961": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "962": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "963": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "964": { - "op": "getbit", - "defined_out": [ - "suspended#0" - ], - "stack_out": [ - "suspended#0" - ] - }, - "965": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "0x52373023" - ] - }, - "966": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "968": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "suspended#0", - "tmp%1#0" - ] - }, - "971": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "suspended#0" - ] - }, - "972": { - "op": "bytec 8 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "\"asset_suspended\"" - ] - }, - "974": { - "op": "swap", - "stack_out": [ - "\"asset_suspended\"", - "suspended#0" - ] - }, - "975": { - "op": "app_global_put", - "stack_out": [] - }, - "976": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "978": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "979": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "980": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "981": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "982": { - "op": "log", - "stack_out": [] - }, - "983": { - "op": "intc_0 // 1", - "stack_out": [ - "1" - ] - }, - "984": { - "op": "return", - "stack_out": [] - }, - "985": { - "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", - "params": {}, - "block": "rbac_get_arranger", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "986": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0", - "0x52323023" - ], - "stack_out": [ - "0", - "0x52323023" - ] - }, - "987": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "988": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "989": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "990": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "991": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "992": { - "op": "log", - "stack_out": [] - }, - "993": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "994": { - "op": "return", - "stack_out": [] - }, - "995": { - "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", - "params": {}, - "block": "rbac_get_address_roles", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "998": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "999": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "1000": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "1001": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "1002": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "1003": { - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52343023" - ] - }, - "1004": { - "op": "dig 1", - "stack_out": [ - "address#0", - "0x52343023", - "address#0 (copy)" - ] - }, - "1006": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1" - ] - }, - "1009": { - "op": "bytec 5 // 0x52353023", - "defined_out": [ - "0x52353023", - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023" - ] - }, - "1011": { - "op": "dig 2", - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023", - "address#0 (copy)" - ] - }, - "1013": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ] - }, - "1016": { - "op": "bytec 6 // 0x52363023", - "defined_out": [ - "0x52363023", - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023" - ] - }, - "1018": { - "op": "dig 3", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023", - "address#0 (copy)" - ] - }, - "1020": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ] - }, - "1023": { - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023" - ] - }, - "1024": { - "op": "dig 4", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023", - "address#0 (copy)" - ] - }, - "1026": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ] - }, - "1029": { - "op": "bytec 7 // 0x52383023", - "defined_out": [ - "0x52383023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023" - ] - }, - "1031": { - "op": "uncover 5", - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023", - "address#0" - ] - }, - "1033": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ] - }, - "1036": { - "op": "pushbytes 0x00", - "defined_out": [ - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00" - ] - }, - "1039": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0" - ] - }, - "1040": { - "op": "uncover 6", - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0", - "tmp%0#1" - ] - }, - "1042": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0" - ] - }, - "1043": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1" - ] - }, - "1044": { - "op": "uncover 5", - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1", - "tmp%1#1" - ] - }, - "1046": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0" - ] - }, - "1047": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2" - ] - }, - "1049": { - "op": "uncover 4", - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2", - "tmp%2#1" - ] - }, - "1051": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0" - ] - }, - "1052": { - "op": "pushint 3", - "defined_out": [ - "3", - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0", - "3" - ] - }, - "1054": { - "op": "uncover 3", - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%1#0", - "3", - "tmp%3#1" - ] - }, - "1056": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0" - ] - }, - "1057": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0", - "4" - ] - }, - "1059": { - "op": "uncover 2", - "stack_out": [ - "aggregate%set_bit%2#0", - "4", - "tmp%4#1" - ] - }, - "1061": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0" - ] - }, - "1062": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0", - "0x151f7c75" - ] - }, - "1063": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ] - }, - "1064": { - "op": "concat", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "1065": { - "op": "log", - "stack_out": [] - }, - "1066": { - "op": "intc_0 // 1", - "stack_out": [ - "1" - ] - }, - "1067": { - "op": "return", - "stack_out": [] - }, - "1068": { - "subroutine": "modules.rbac.RbacModule.rbac_get_role_config[routing]", - "params": {}, - "block": "rbac_get_role_config", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "1071": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "1072": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "1073": { - "op": "intc_0 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "1074": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "1075": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "1076": { - "op": "txna ApplicationArgs 2" - }, - "1079": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "1080": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "1082": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "1083": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "1084": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "1085": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "1086": { - "op": "btoi", - "defined_out": [ - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "1087": { - "op": "dup", - "defined_out": [ - "role#0", - "role#0 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "role#0 (copy)" - ] - }, - "1088": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "1091": { - "op": "intc_3 // 20", - "defined_out": [ - "20", - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "20" - ] - }, - "1092": { - "op": "pushints 40 50 60 70 80", - "defined_out": [ - "20", - "40", - "50", - "60", - "70", - "80", - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "20", - "40", - "50", - "60", - "70", - "80" - ] - }, - "1099": { - "op": "uncover 6", - "stack_out": [ - "role_address#0", - "20", - "40", - "50", - "60", - "70", - "80", - "role#0" - ] - }, - "1101": { - "op": "match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7", - "stack_out": [ - "role_address#0" - ] - }, - "1115": { - "error": "Invalid role identifier", - "op": "err // Invalid role identifier" - }, - "1116": { - "block": "rbac_get_role_config_switch_case_5@7", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 7 // 0x52383023", - "defined_out": [ - "0x52383023" - ], - "stack_out": [ - "role_address#0", - "0x52383023" - ] - }, - "1118": { - "op": "dig 1", - "defined_out": [ - "0x52383023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52383023", - "role_address#0" - ] - }, - "1120": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1121": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "1122": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1123": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1125": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1126": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "1127": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "1128": { - "block": "rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9", - "stack_in": [ - "role_address#0", - "tmp%3#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0", - "0x151f7c75" - ] - }, - "1129": { - "op": "swap", - "defined_out": [ - "0x151f7c75", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "0x151f7c75", - "tmp%3#0" - ] - }, - "1130": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "tmp%4#0" - ] - }, - "1131": { - "op": "log", - "stack_out": [ - "role_address#0" - ] - }, - "1132": { - "op": "intc_0 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "1" - ] - }, - "1133": { - "op": "return", - "stack_out": [ - "role_address#0" - ] - }, - "1134": { - "block": "rbac_get_role_config_switch_case_4@6", - "stack_in": [ - "role_address#0" - ], - "op": "bytec_2 // 0x52373023", - "defined_out": [ - "0x52373023" - ], - "stack_out": [ - "role_address#0", - "0x52373023" - ] - }, - "1135": { - "op": "dig 1", - "defined_out": [ - "0x52373023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52373023", - "role_address#0" - ] - }, - "1137": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1138": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "1139": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1140": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1142": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1143": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "1144": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "1145": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "1148": { - "block": "rbac_get_role_config_switch_case_3@5", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 6 // 0x52363023", - "defined_out": [ - "0x52363023" - ], - "stack_out": [ - "role_address#0", - "0x52363023" - ] - }, - "1150": { - "op": "dig 1", - "defined_out": [ - "0x52363023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52363023", - "role_address#0" - ] - }, - "1152": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1153": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "1154": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1155": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1157": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1158": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "1159": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "1160": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "1163": { - "block": "rbac_get_role_config_switch_case_2@4", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 5 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "role_address#0", - "0x52353023" - ] - }, - "1165": { - "op": "dig 1", - "defined_out": [ - "0x52353023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52353023", - "role_address#0" - ] - }, - "1167": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1168": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "1169": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1170": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1172": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1173": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "1174": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "1175": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "1178": { - "block": "rbac_get_role_config_switch_case_1@3", - "stack_in": [ - "role_address#0" - ], - "op": "bytec_3 // 0x52343023", - "defined_out": [ - "0x52343023" - ], - "stack_out": [ - "role_address#0", - "0x52343023" - ] - }, - "1179": { - "op": "dig 1", - "defined_out": [ - "0x52343023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52343023", - "role_address#0" - ] - }, - "1181": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1182": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "1183": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1184": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1186": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "1187": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1188": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "1189": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "1192": { - "block": "rbac_get_role_config_switch_case_0@2", - "stack_in": [ - "role_address#0" - ], - "op": "pushbytes 0x00000000000000000000000000000000", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "1210": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "1213": { - "subroutine": "modules.rbac.RbacModule._role_is_active", - "params": { - "role_map#0": "bytes", - "role_address#0": "bytes" - }, - "block": "_role_is_active", - "stack_in": [], - "op": "proto 2 1" - }, - "1216": { - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1218": { - "op": "frame_dig -2", - "defined_out": [ - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)" - ] - }, - "1220": { - "op": "frame_dig -1", - "defined_out": [ - "role_address#0 (copy)", - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)", - "role_address#0 (copy)" - ] - }, - "1222": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "1223": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1224": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1225": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "1227": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "1230": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1232": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1233": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "1234": { - "op": "intc_1 // 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "0" - ] - }, - "1235": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ] - }, - "1236": { - "op": "global LatestTimestamp" - }, - "1238": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "1239": { - "op": "frame_bury 0", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0" - ] - }, - "1241": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ] - }, - "1242": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "1245": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1247": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "1248": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0" - ] - }, - "1249": { - "op": "pushint 8", - "defined_out": [ - "8", - "aggregate%box_get%2#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "8" - ] - }, - "1251": { - "op": "extract_uint64", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ] - }, - "1252": { - "op": "frame_dig 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0", - "awst_tmp%0#0" - ] - }, - "1254": { - "op": ">=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ] - }, - "1255": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "1258": { - "op": "intc_0 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "1259": { - "block": "_role_is_active_bool_merge@5", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ], - "op": "frame_bury 0", - "defined_out": [ - "and_result%0#0" - ] - }, - "1261": { - "retsub": true, - "op": "retsub" - }, - "1262": { - "block": "_role_is_active_bool_false@4", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "op": "intc_1 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "1263": { - "op": "b _role_is_active_bool_merge@5" - }, - "1266": { - "subroutine": "modules.rbac.RbacModule.assert_caller_is_arranger", - "params": {}, - "block": "assert_caller_is_arranger", - "stack_in": [], - "op": "txn Sender", - "defined_out": [ - "role_address#0" - ], - "stack_out": [ - "role_address#0" - ] - }, - "1268": { - "op": "intc_1 // 0", - "defined_out": [ - "0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0" - ] - }, - "1269": { - "op": "bytec_1 // 0x52323023", - "defined_out": [ - "0", - "0x52323023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0", - "0x52323023" - ] - }, - "1270": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1271": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "role_address#0", - "maybe_value%0#0" - ] - }, - "1272": { - "op": "==", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "1273": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [] - }, - "1274": { - "retsub": true, - "op": "retsub" - }, - "1275": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "params": {}, - "block": "assert_is_not_asset_defaulted", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "1276": { - "op": "bytec 12 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_defaulted\"" - ] - }, - "1278": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1279": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "1280": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "1281": { - "error": "Defaulted", - "op": "assert // Defaulted", - "stack_out": [] - }, - "1282": { - "retsub": true, - "op": "retsub" - }, - "1283": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "params": {}, - "block": "assert_is_not_asset_suspended", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "1284": { - "op": "bytec 8 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_suspended\"" - ] - }, - "1286": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1287": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "1288": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "1289": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "1290": { - "retsub": true, - "op": "retsub" - }, - "1291": { - "subroutine": "modules.rbac.RbacModule._assert_valid_role", - "params": { - "role_id#0": "uint64" - }, - "block": "_assert_valid_role", - "stack_in": [], - "op": "proto 1 0" - }, - "1294": { - "op": "frame_dig -1", - "defined_out": [ - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "1296": { - "op": "intc_3 // 20", - "defined_out": [ - "20", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "20" - ] - }, - "1297": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "1298": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "1301": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "1303": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "40" - ] - }, - "1305": { - "op": "==", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "1306": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "1309": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "1311": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "50" - ] - }, - "1313": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "1314": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "1317": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "1319": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "60" - ] - }, - "1321": { - "op": "==", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "1322": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "1325": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "1327": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "70" - ] - }, - "1329": { - "op": "==", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "1330": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "1333": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "1335": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "80" - ] - }, - "1337": { - "op": "==", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "1338": { - "op": "bz _assert_valid_role_bool_false@7", - "stack_out": [] - }, - "1341": { - "block": "_assert_valid_role_bool_true@6", - "stack_in": [], - "op": "intc_0 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "1342": { - "error": "Invalid role identifier", - "block": "_assert_valid_role_bool_merge@8", - "stack_in": [ - "or_result%0#0" - ], - "op": "assert // Invalid role identifier", - "defined_out": [], - "stack_out": [] - }, - "1343": { - "retsub": true, - "op": "retsub" - }, - "1344": { - "block": "_assert_valid_role_bool_false@7", - "stack_in": [], - "op": "intc_1 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "1345": { - "op": "b _assert_valid_role_bool_merge@8" - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.teal b/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.teal deleted file mode 100644 index c7b06048..00000000 --- a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.approval.teal +++ /dev/null @@ -1,1383 +0,0 @@ -#pragma version 11 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.approval_program() -> uint64: -main: - intcblock 1 0 32 20 - bytecblock 0x151f7c75 0x52323023 0x52373023 0x52343023 0x52333023 0x52353023 0x52363023 0x52383023 "asset_suspended" "circulating_units" "status" 0x52323523 "asset_defaulted" - txn ApplicationID - bnz main_after_if_else@2 - // modules/rbac.py:30-31 - // # RBAC Roles - // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec_1 // 0x52323023 - global ZeroAddress - app_global_put - // modules/rbac.py:32 - // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 11 // 0x52323523 - global ZeroAddress - app_global_put - // modules/rbac.py:47-48 - // # D-ASA Governance - // self.asset_suspended = False - bytec 8 // "asset_suspended" - intc_1 // 0 - app_global_put - // modules/rbac.py:49 - // self.asset_defaulted = False - bytec 12 // "asset_defaulted" - intc_1 // 0 - app_global_put - // modules/accounting.py:19 - // self.total_units = UInt64() - pushbytes "total_units" - intc_1 // 0 - app_global_put - // modules/accounting.py:20 - // self.circulating_units = UInt64() - bytec 9 // "circulating_units" - intc_1 // 0 - app_global_put - // modules/accounting.py:21 - // self.unit_value = UInt64() - pushbytes "unit_value" - intc_1 // 0 - app_global_put - // modules/accounting.py:22 - // self.status = UInt64(enm.STATUS_INACTIVE) - bytec 10 // "status" - intc_1 // 0 - app_global_put - -main_after_if_else@2: - // smart_contracts/mock_module_accounting/contract.py:6 - // class MockAccountingModule(AccountingModule): - txn NumAppArgs - bz main_create@22 - txn OnCompletion - ! - assert - txn ApplicationID - assert - pushbytess 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method "account_gov_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_close(address)(uint64,uint64)", method "account_update_payment_address(address,address)uint64", method "account_get_info(address)(address,uint64,uint64,uint64,bool)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,byte[])uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_config(uint8,address)(uint64,uint64)" - txna ApplicationArgs 0 - match account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config - err - -main_create@22: - // smart_contracts/mock_module_accounting/contract.py:14 - // @arc4.baremethod(create="require") - txn OnCompletion - ! - txn ApplicationID - ! - && - assert - // smart_contracts/mock_module_accounting/contract.py:16 - // self.arranger.value = Txn.sender - bytec_1 // 0x52323023 - txn Sender - app_global_put - // smart_contracts/mock_module_accounting/contract.py:14 - // @arc4.baremethod(create="require") - intc_0 // 1 - return - - -// modules.accounting.AccountingModule.account_gov_suspension[routing]() -> void: -account_gov_suspension: - // modules/accounting.py:94 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_1 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec_2 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 4 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:114 - // self.account[holding_address].suspended = suspended - dup - pushint 56 - intc_0 // 1 - box_extract - intc_1 // 0 - uncover 3 - setbit - pushint 56 - swap - box_replace - // modules/accounting.py:115 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:94 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.accounting.AccountingModule.account_open[routing]() -> void: -account_open: - // modules/accounting.py:117 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec_3 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_1 // 0 - bytec 10 // "status" - app_global_get_ex - assert // check self.status exists - pushint 200 - == - // modules/accounting.py:139 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/accounting.py:140 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:141 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:142 - // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS - bytec 4 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - ! - assert // Invalid account holding address - // modules/accounting.py:146 - // units=UInt64(0), - intc_1 // 0 - // modules/accounting.py:144-150 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=UInt64(0), - // unit_value=UInt64(0), - // paid_coupons=UInt64(0), - // suspended=False, - // ) - itob - uncover 2 - dig 1 - concat - dig 1 - concat - swap - concat - pushbytes 0x00 - concat - box_put - // modules/accounting.py:151 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:117 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.accounting.AccountingModule.account_close[routing]() -> void: -account_close: - // modules/accounting.py:153 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec_3 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:171 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 4 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:174 - // closed_units = self.account[holding_address].units - dup - box_get - pop - intc_2 // 32 - extract_uint64 - dup - uncover 2 - // modules/accounting.py:175 - // del self.account[holding_address] - box_del - pop - // modules/accounting.py:176 - // self.circulating_units -= closed_units - intc_1 // 0 - bytec 9 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - swap - - - bytec 9 // "circulating_units" - dig 1 - app_global_put - // modules/accounting.py:48 - // if self.circulating_units == UInt64(0): - bnz account_close_after_if_else@3 - // modules/accounting.py:49 - // self.status = UInt64(enm.STATUS_ENDED) - bytec 10 // "status" - pushint 200 - app_global_put - -account_close_after_if_else@3: - // modules/accounting.py:178 - // return closed_units, Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:153 - // @arc4.abimethod - dig 1 - itob - swap - itob - concat - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.accounting.AccountingModule.account_update_payment_address[routing]() -> void: -account_update_payment_address: - // modules/accounting.py:180 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:200 - // assert Txn.sender == holding_address, err.UNAUTHORIZED - txn Sender - dig 2 - == - assert // Not authorized - // modules/accounting.py:201 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:202 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 4 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:204 - // self.account[holding_address].payment_address = payment_address - intc_1 // 0 - uncover 2 - box_replace - // modules/accounting.py:205 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:180 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.accounting.AccountingModule.account_get_info[routing]() -> void: -account_get_info: - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 4 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:222 - // return self.account[holding_address] - box_get - pop - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: -rbac_rotate_arranger: - // modules/rbac.py:147 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:158 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:159 - // self.arranger.value = new_arranger - bytec_1 // 0x52323023 - swap - app_global_put - // modules/rbac.py:160 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:147 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: -rbac_set_op_daemon: - // modules/rbac.py:162 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:173 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:174 - // self.op_daemon.value = address - bytec 11 // 0x52323523 - swap - app_global_put - // modules/rbac.py:175 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:162 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: -rbac_assign_role: - // modules/rbac.py:177 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - intc_1 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/rbac.py:199 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:200 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:201 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:101 - // if role_id == UInt64(cst.ROLE_ARRANGER): - intc_3 // 20 - == - bz rbac_assign_role_after_if_else@3 - // modules/rbac.py:102 - // self.arranger.value = role_address - bytec_1 // 0x52323023 - dig 3 - app_global_put - -rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14: - // modules/rbac.py:203 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:177 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -rbac_assign_role_after_if_else@3: - // modules/rbac.py:105 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - dup - pushint 40 - == - bz rbac_assign_role_after_if_else@5 - // modules/rbac.py:106 - // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec_3 // 0x52343023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:107 - // self.account_manager[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@5: - // modules/rbac.py:109 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_assign_role_after_if_else@7 - // modules/rbac.py:110 - // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 5 // 0x52353023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:111 - // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@7: - // modules/rbac.py:113 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_assign_role_after_if_else@9 - // modules/rbac.py:114 - // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 6 // 0x52363023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:115 - // self.trustee[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@9: - // modules/rbac.py:117 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_assign_role_after_if_else@11 - // modules/rbac.py:118 - // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec_2 // 0x52373023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:119 - // self.authority[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@11: - // modules/rbac.py:121 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - // modules/rbac.py:122 - // assert role_address not in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 7 // 0x52383023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:123 - // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - - -// modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: -rbac_revoke_role: - // modules/rbac.py:205 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:224 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:225 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:226 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:126 - // assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE - dup - intc_3 // 20 - != - assert // Invalid role identifier - // modules/rbac.py:127 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushint 40 - == - bz rbac_revoke_role_after_if_else@3 - // modules/rbac.py:128 - // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec_3 // 0x52343023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:129 - // del self.account_manager[role_address] - box_del - pop - -rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:228 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:205 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -rbac_revoke_role_after_if_else@3: - // modules/rbac.py:131 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_revoke_role_after_if_else@5 - // modules/rbac.py:132 - // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 5 // 0x52353023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:133 - // del self.primary_dealer[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@5: - // modules/rbac.py:135 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_revoke_role_after_if_else@7 - // modules/rbac.py:136 - // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 6 // 0x52363023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:137 - // del self.trustee[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@7: - // modules/rbac.py:139 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_revoke_role_after_if_else@9 - // modules/rbac.py:140 - // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec_2 // 0x52373023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:141 - // del self.authority[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@9: - // modules/rbac.py:143 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - // modules/rbac.py:144 - // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 7 // 0x52383023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:145 - // del self.interest_oracle[role_address] - box_del - pop - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - - -// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: -rbac_gov_asset_suspension: - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - txna ApplicationArgs 1 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_1 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec_2 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/rbac.py:246 - // self.asset_suspended = suspended - bytec 8 // "asset_suspended" - swap - app_global_put - // modules/rbac.py:247 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: -rbac_get_arranger: - // modules/rbac.py:257 - // return self.arranger.value - intc_1 // 0 - bytec_1 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - // modules/rbac.py:249 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: -rbac_get_address_roles: - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:273 - // self._role_is_active(self.account_manager, address), - bytec_3 // 0x52343023 - dig 1 - callsub _role_is_active - // modules/rbac.py:274 - // self._role_is_active(self.primary_dealer, address), - bytec 5 // 0x52353023 - dig 2 - callsub _role_is_active - // modules/rbac.py:275 - // self._role_is_active(self.trustee, address), - bytec 6 // 0x52363023 - dig 3 - callsub _role_is_active - // modules/rbac.py:276 - // self._role_is_active(self.authority, address), - bytec_2 // 0x52373023 - dig 4 - callsub _role_is_active - // modules/rbac.py:277 - // self._role_is_active(self.interest_oracle, address), - bytec 7 // 0x52383023 - uncover 5 - callsub _role_is_active - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - pushbytes 0x00 - intc_1 // 0 - uncover 6 - setbit - intc_0 // 1 - uncover 5 - setbit - pushint 2 - uncover 4 - setbit - pushint 3 - uncover 3 - setbit - pushint 4 - uncover 2 - setbit - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_role_config[routing]() -> void: -rbac_get_role_config: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_0 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:294 - // role = role_id.as_uint64() - btoi - // modules/rbac.py:295 - // self._assert_valid_role(role) - dup - callsub _assert_valid_role - // modules/rbac.py:297 - // case UInt64(cst.ROLE_ARRANGER): - intc_3 // 20 - // modules/rbac.py:301 - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushints 40 50 60 70 80 - // modules/rbac.py:296-327 - // match role: - // case UInt64(cst.ROLE_ARRANGER): - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.account_manager[role_address] - // case UInt64(cst.ROLE_PRIMARY_DEALER): - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.primary_dealer[role_address] - // case UInt64(cst.ROLE_TRUSTEE): - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.trustee[role_address] - // case UInt64(cst.ROLE_AUTHORITY): - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.authority[role_address] - // case UInt64(cst.ROLE_INTEREST_ORACLE): - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.interest_oracle[role_address] - // case _: - // op.err(err.INVALID_ROLE) - uncover 6 - match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7 - // modules/rbac.py:327 - // op.err(err.INVALID_ROLE) - err // Invalid role identifier - -rbac_get_role_config_switch_case_5@7: - // modules/rbac.py:323 - // self.interest_oracle, role_address - bytec 7 // 0x52383023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:322-324 - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:325 - // return self.interest_oracle[role_address] - box_get - pop - -rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_0 // 1 - return - -rbac_get_role_config_switch_case_4@6: - // modules/rbac.py:318 - // self.authority, role_address - bytec_2 // 0x52373023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:317-319 - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:320 - // return self.authority[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_3@5: - // modules/rbac.py:313 - // self.trustee, role_address - bytec 6 // 0x52363023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:312-314 - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:315 - // return self.trustee[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_2@4: - // modules/rbac.py:308 - // self.primary_dealer, role_address - bytec 5 // 0x52353023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:307-309 - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:310 - // return self.primary_dealer[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_1@3: - // modules/rbac.py:303 - // self.account_manager, role_address - bytec_3 // 0x52343023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:302-304 - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:305 - // return self.account_manager[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_0@2: - // modules/rbac.py:298-300 - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - - -// modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: -_role_is_active: - // modules/rbac.py:57 - // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: - proto 2 1 - pushbytes "" - // modules/rbac.py:55 - // return role_address in role_map - frame_dig -2 - frame_dig -1 - concat - dup - box_len - bury 1 - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - bz _role_is_active_bool_false@4 - // modules/rbac.py:59 - // role_map[role_address].role_validity_start - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_1 // 0 - extract_uint64 - // modules/rbac.py:60 - // <= Global.latest_timestamp - global LatestTimestamp - dup - frame_bury 0 - // modules/rbac.py:59-60 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - <= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - // modules/rbac.py:61 - // <= role_map[role_address].role_validity_end - frame_dig 1 - box_get - assert // check BoxMap entry exists - pushint 8 - extract_uint64 - // modules/rbac.py:60-61 - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - frame_dig 0 - >= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - intc_0 // 1 - -_role_is_active_bool_merge@5: - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - frame_bury 0 - retsub - -_role_is_active_bool_false@4: - intc_1 // 0 - b _role_is_active_bool_merge@5 - - -// modules.rbac.RbacModule.assert_caller_is_arranger() -> void: -assert_caller_is_arranger: - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - txn Sender - // modules/rbac.py:52 - // return role_address == self.arranger.value - intc_1 // 0 - bytec_1 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - == - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - assert // Not authorized - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_defaulted() -> void: -assert_is_not_asset_defaulted: - // modules/rbac.py:83 - // assert not self.asset_defaulted, err.DEFAULTED - intc_1 // 0 - bytec 12 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - ! - assert // Defaulted - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_suspended() -> void: -assert_is_not_asset_suspended: - // modules/rbac.py:86 - // assert not self.asset_suspended, err.SUSPENDED - intc_1 // 0 - bytec 8 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - ! - assert // Suspended operations - retsub - - -// modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: -_assert_valid_role: - // modules/rbac.py:88 - // def _assert_valid_role(self, role_id: UInt64) -> None: - proto 1 0 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - frame_dig -1 - // modules/rbac.py:90 - // UInt64(cst.ROLE_ARRANGER), - intc_3 // 20 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:91 - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - pushint 40 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:92 - // UInt64(cst.ROLE_PRIMARY_DEALER), - pushint 50 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:93 - // UInt64(cst.ROLE_TRUSTEE), - pushint 60 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:94 - // UInt64(cst.ROLE_AUTHORITY), - pushint 70 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:95 - // UInt64(cst.ROLE_INTEREST_ORACLE), - pushint 80 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bz _assert_valid_role_bool_false@7 - -_assert_valid_role_bool_true@6: - intc_0 // 1 - -_assert_valid_role_bool_merge@8: - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - assert // Invalid role identifier - retsub - -_assert_valid_role_bool_false@7: - intc_1 // 0 - b _assert_valid_role_bool_merge@8 diff --git a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.arc56.json b/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.arc56.json deleted file mode 100644 index 168af179..00000000 --- a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.arc56.json +++ /dev/null @@ -1,662 +0,0 @@ -{ - "name": "MockAccountingModule", - "structs": { - "AccountInfo": [ - { - "name": "payment_address", - "type": "address" - }, - { - "name": "units", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "paid_coupons", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - } - ], - "RoleConfig": [ - { - "name": "role_validity_start", - "type": "uint64" - }, - { - "name": "role_validity_end", - "type": "uint64" - } - ] - }, - "methods": [ - { - "name": "account_gov_suspension", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set account suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set account suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "account_open", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account opening" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Open D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_close", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "desc": "Closed units, Timestamp of the account closing" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Close D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_update_payment_address", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account update" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Update the Payment Address of an account", - "events": [], - "recommendations": {} - }, - { - "name": "account_get_info", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(address,uint64,uint64,uint64,bool)", - "struct": "AccountInfo", - "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account info", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_rotate_arranger", - "args": [ - { - "type": "address", - "name": "new_arranger", - "desc": "New Arranger address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Rotate the Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_set_op_daemon", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Operation Daemon address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Non-Normative: Set the Operation Daemon address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_assign_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Assign a role to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_revoke_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role revocation" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Revoke a role from an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_gov_asset_suspension", - "args": [ - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set asset suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set asset suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_arranger", - "args": [], - "returns": { - "type": "address", - "desc": "Arranger address" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_address_roles", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Address to get roles for" - } - ], - "returns": { - "type": "(bool,bool,bool,bool,bool)", - "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Non-normative - Get roles assigned to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_role_config", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "RoleConfig", - "desc": "Role configuration" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get role configuration", - "events": [], - "recommendations": {} - } - ], - "arcs": [ - 22, - 28 - ], - "desc": "\n Accounting Module for testing\n ", - "networks": {}, - "state": { - "schema": { - "global": { - "ints": 6, - "bytes": 2 - }, - "local": { - "ints": 0, - "bytes": 0 - } - }, - "keys": { - "global": { - "arranger": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjIwIw==" - }, - "op_daemon": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjI1Iw==" - }, - "asset_suspended": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfc3VzcGVuZGVk" - }, - "asset_defaulted": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfZGVmYXVsdGVk" - }, - "total_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfdW5pdHM=" - }, - "circulating_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "Y2lyY3VsYXRpbmdfdW5pdHM=" - }, - "unit_value": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dW5pdF92YWx1ZQ==" - }, - "status": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c3RhdHVz" - } - }, - "local": {}, - "box": {} - }, - "maps": { - "global": {}, - "local": {}, - "box": { - "account_manager": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjQwIw==" - }, - "primary_dealer": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjUwIw==" - }, - "trustee": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjYwIw==" - }, - "authority": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjcwIw==" - }, - "interest_oracle": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjgwIw==" - }, - "account": { - "keyType": "address", - "valueType": "AccountInfo", - "prefix": "UjMwIw==" - } - } - } - }, - "bareActions": { - "create": [ - "NoOp" - ], - "call": [] - }, - "sourceInfo": { - "approval": { - "sourceInfo": [ - { - "pc": [ - 1281 - ], - "errorMessage": "Defaulted" - }, - { - "pc": [ - 329, - 402, - 455, - 538, - 568 - ], - "errorMessage": "Invalid account holding address" - }, - { - "pc": [ - 706, - 730, - 754, - 777, - 801, - 856, - 884, - 906, - 927, - 949, - 1125, - 1142, - 1157, - 1172, - 1186 - ], - "errorMessage": "Invalid account role address" - }, - { - "pc": [ - 841, - 1115, - 1342 - ], - "errorMessage": "Invalid role identifier" - }, - { - "pc": [ - 319, - 374, - 385, - 443, - 522, - 971, - 1273 - ], - "errorMessage": "Not authorized" - }, - { - "pc": [ - 1289 - ], - "errorMessage": "Suspended operations" - }, - { - "pc": [ - 1233, - 1248 - ], - "errorMessage": "check BoxMap entry exists" - }, - { - "pc": [ - 988, - 1271 - ], - "errorMessage": "check self.arranger exists" - }, - { - "pc": [ - 1279 - ], - "errorMessage": "check self.asset_defaulted exists" - }, - { - "pc": [ - 1287 - ], - "errorMessage": "check self.asset_suspended exists" - }, - { - "pc": [ - 470 - ], - "errorMessage": "check self.circulating_units exists" - }, - { - "pc": [ - 379 - ], - "errorMessage": "check self.status exists" - }, - { - "pc": [ - 647 - ], - "errorMessage": "invalid array length header" - }, - { - "pc": [ - 310, - 962 - ], - "errorMessage": "invalid number of bytes for arc4.bool" - }, - { - "pc": [ - 655 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 302, - 359, - 367, - 436, - 508, - 516, - 559, - 584, - 607, - 641, - 825, - 1002, - 1085 - ], - "errorMessage": "invalid number of bytes for arc4.static_array" - }, - { - "pc": [ - 631, - 815, - 1075 - ], - "errorMessage": "invalid number of bytes for arc4.uint8" - } - ], - "pcOffsetMethod": "none" - }, - "clear": { - "sourceInfo": [], - "pcOffsetMethod": "none" - } - }, - "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzIzMDIzIDB4NTIzNzMwMjMgMHg1MjM0MzAyMyAweDUyMzMzMDIzIDB4NTIzNTMwMjMgMHg1MjM2MzAyMyAweDUyMzgzMDIzICJhc3NldF9zdXNwZW5kZWQiICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgMHg1MjMyMzUyMyAiYXNzZXRfZGVmYXVsdGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwLTMxCiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAxMSAvLyAweDUyMzIzNTIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgOCAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDEyIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxOQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBwdXNoYnl0ZXMgInRvdGFsX3VuaXRzIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgOSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMQogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIHB1c2hieXRlcyAidW5pdF92YWx1ZSIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIyCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWMgMTAgLy8gInN0YXR1cyIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfYWNjb3VudGluZy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrQWNjb3VudGluZ01vZHVsZShBY2NvdW50aW5nTW9kdWxlKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ZGMwNjNiMzUgMHgxNGZjMTBlZiAweDRjMTEzZWQ1IDB4NzRhNzI5N2YgMHgxMDVjMTg0ZSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhY2NvdW50X2dvdl9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X2Nsb3NlIGFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyBhY2NvdW50X2dldF9pbmZvIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfY29uZmlnCiAgICBlcnIKCm1haW5fY3JlYXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX2FjY291bnRpbmcvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfYWNjb3VudGluZy9jb250cmFjdC5weToxNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjMyMzAyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9hY2NvdW50aW5nL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfRU5ERUQKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQyCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ2CiAgICAvLyB1bml0cz1VSW50NjQoMCksCiAgICBpbnRjXzEgLy8gMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0NC0xNTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHVuaXRfdmFsdWU9VUludDY0KDApLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1VSW50NjQoMCksCiAgICAvLyAgICAgc3VzcGVuZGVkPUZhbHNlLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9jbG9zZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfY2xvc2U6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzMzMwMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTc0CiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTc1CiAgICAvLyBkZWwgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDkgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDgKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gVUludDY0KDApOgogICAgYm56IGFjY291bnRfY2xvc2VfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDkKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVubS5TVEFUVVNfRU5ERUQpCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CgphY2NvdW50X2Nsb3NlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzgKICAgIC8vIHJldHVybiBjbG9zZWRfdW5pdHMsIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGRpZyAxCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3M6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfaW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ2V0X2luZm86CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzMzMwMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjIyCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU5CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTYwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc0CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDExIC8vIDB4NTIzMjM1MjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDEKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMzUzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOQogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzgzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjQKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgaW50Y18zIC8vIDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQxCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzgzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGRlbCBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTcKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjczCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyA1IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjM2MzAyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGFkZHJlc3MpLAogICAgYnl0ZWMgNyAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV9jb25maWc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk0CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTcKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk2LTMyNwogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNwogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDcgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIwCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzCiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyMzYzMDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEyLTMxNAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE1CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA1IC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMi0zMDQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk4LTMwMAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3JvbGVfaXNfYWN0aXZlKHJvbGVfbWFwOiBieXRlcywgcm9sZV9hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogpfcm9sZV9pc19hY3RpdmU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIGRlZiBfcm9sZV9pc19hY3RpdmUoc2VsZiwgcm9sZV9tYXA6IHR5cC5SYmFjUm9sZSwgcm9sZV9hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTkKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjAKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTIgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOCAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg4CiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDgK", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" - }, - "byteCode": { - "approval": "CyAEAQAgFCYNBBUffHUEUjIwIwRSNzAjBFI0MCMEUjMwIwRSNTAjBFI2MCMEUjgwIw9hc3NldF9zdXNwZW5kZWQRY2lyY3VsYXRpbmdfdW5pdHMGc3RhdHVzBFIyNSMPYXNzZXRfZGVmYXVsdGVkMRhAADYpMgNnJwsyA2cnCCNnJwwjZ4ALdG90YWxfdW5pdHMjZycJI2eACnVuaXRfdmFsdWUjZycKI2cxG0EAajEZFEQxGESCDQTcBjs1BBT8EO8ETBE+1QR0pyl/BBBcGE4EgvcbLQTvBPXTBAO4MykEPb6AvQTfVOgsBAEMgpkEdAas0gTD5LKXNhoAjg0ADwBIAJUA3QEQASkBQAFYAhACowLBAssDFAAxGRQxGBQQRCkxAGciQzYaAUkVJBJENhoCSRUiEkQjUyoxAIgDfkQnBE8CUEm9RQFESYE4IrojTwNUgThMuzIHFihMULAiQzYaAUkVJBJENhoCSRUkEkQrMQCIA0dEIycKZUSByAESFESIA3aIA3snBE8CUEm9RQEURCMWTwJLAVBLAVBMUIABAFC/MgcWKExQsCJDNhoBSRUkEkQrMQCIAwJEiAM8JwRMUEm9RQFESb5IJFtJTwK8SCMnCWVETAknCUsBZ0AABicKgcgBZzIHSwEWTBZQKExQsCJDNhoBSRUkEkQ2GgJJFSQSRDEASwISRIgC7YgC8icETwJQSb1FAUQjTwK7MgcWKExQsCJDNhoBSRUkEkQnBExQSb1FAUS+SChMULAiQzYaAUkVJBJEiAKmKUxnMgcWKExQsCJDNhoBSRUkEkSIAo8nC0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSSNZgQIISwEVEkRXAgBMiAJbiAJhF0cCiAJrJRJBAA0pSwNnMgcWKExQsCJDSYEoEkEAECtLA1BJvUUBFERLAr9C/+BJgTISQQARJwVLA1BJvUUBFERLAr9C/8hJgTwSQQARJwZLA1BJvUUBFERLAr9C/7BJgUYSQQAQKksDUEm9RQEUREsCv0L/mUmBUBJB/5InB0sDUEm9RQEUREsCv0L/gTYaAUkVIhJENhoCSU4CFSQSRIgBtYgBuxdHAogBxUklE0SBKBJBABQrSwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBUsCUEm9RQFEvEhC/+FJgTwSQQAPJwZLAlBJvUUBRLxIQv/LSYFGEkEADipLAlBJvUUBRLxIQv+2SYFQEkH/rycHSwJQSb1FAUS8SEL/oDYaAUkVIhJEI1MqMQCIAPJEJwhMZzIHFihMULAiQyMpZUQoTFCwIkM2GgFJFSQSRCtLAYgAzCcFSwKIAMUnBksDiAC+KksEiAC4JwdPBYgAsYABACNPBlQiTwVUgQJPBFSBA08DVIEETwJUKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJEF0mIAMglgwUoMjxGUE8GjgYATQA/ADAAIQATAAEAJwdLAVBJvUUBRL5IKExQsCJDKksBUEm9RQFEvkhC/+wnBksBUEm9RQFEvkhC/90nBUsBUEm9RQFEvkhC/84rSwFQSb1FAUS+SEL/wIAQAAAAAAAAAAAAAAAAAAAAAEL/q4oCAYAAi/6L/1BJvUUBQQAgiwG+RCNbMgdJjAAOQQARiwG+RIEIW4sAD0EABCKMAIkjQv/5MQAjKWVEEkSJIycMZUQURIkjJwhlRBREiYoBAIv/JRJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADIkSJI0L/+g==", - "clear": "C4EBQw==" - }, - "compilerInfo": { - "compiler": "puya", - "compilerVersion": { - "major": 5, - "minor": 7, - "patch": 1 - } - }, - "events": [], - "templateVariables": {} -} \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.puya.map b/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.puya.map deleted file mode 100644 index d580b5c4..00000000 --- a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.puya.map +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 3, - "sources": [], - "mappings": ";;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "pushint 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3": { - "op": "return", - "stack_out": [] - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.teal b/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.teal deleted file mode 100644 index 75f539be..00000000 --- a/smart_contracts/artifacts/mock_module_accounting/MockAccountingModule.clear.teal +++ /dev/null @@ -1,7 +0,0 @@ -#pragma version 11 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: -main: - pushint 1 - return diff --git a/smart_contracts/artifacts/mock_module_accounting/mock_accounting_module_client.py b/smart_contracts/artifacts/mock_module_accounting/mock_accounting_module_client.py deleted file mode 100644 index cc76b79c..00000000 --- a/smart_contracts/artifacts/mock_module_accounting/mock_accounting_module_client.py +++ /dev/null @@ -1,2065 +0,0 @@ -# flake8: noqa -# fmt: off -# mypy: ignore-errors -# This file was automatically generated by algokit-client-generator. -# DO NOT MODIFY IT BY HAND. -# requires: algokit-utils@^3.0.0 - -# common -import dataclasses -import typing -# core algosdk -import algosdk -from algosdk.transaction import OnComplete -from algosdk.atomic_transaction_composer import TransactionSigner -from algosdk.source_map import SourceMap -from algosdk.transaction import Transaction -from algosdk.v2client.models import SimulateTraceConfig -# utils -import algokit_utils -from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient - -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_close", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_config", "returns": {"type": "(uint64,uint64)", "desc": "Role configuration", "struct": "RoleConfig"}, "desc": "Get role configuration", "events": [], "readonly": true, "recommendations": {}}], "name": "MockAccountingModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjI1Iw==", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}, "account": {"keyType": "address", "valueType": "AccountInfo", "prefix": "UjMwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 6}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}], "RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYNBBUffHUEUjIwIwRSNzAjBFI0MCMEUjMwIwRSNTAjBFI2MCMEUjgwIw9hc3NldF9zdXNwZW5kZWQRY2lyY3VsYXRpbmdfdW5pdHMGc3RhdHVzBFIyNSMPYXNzZXRfZGVmYXVsdGVkMRhAADYpMgNnJwsyA2cnCCNnJwwjZ4ALdG90YWxfdW5pdHMjZycJI2eACnVuaXRfdmFsdWUjZycKI2cxG0EAajEZFEQxGESCDQTcBjs1BBT8EO8ETBE+1QR0pyl/BBBcGE4EgvcbLQTvBPXTBAO4MykEPb6AvQTfVOgsBAEMgpkEdAas0gTD5LKXNhoAjg0ADwBIAJUA3QEQASkBQAFYAhACowLBAssDFAAxGRQxGBQQRCkxAGciQzYaAUkVJBJENhoCSRUiEkQjUyoxAIgDfkQnBE8CUEm9RQFESYE4IrojTwNUgThMuzIHFihMULAiQzYaAUkVJBJENhoCSRUkEkQrMQCIA0dEIycKZUSByAESFESIA3aIA3snBE8CUEm9RQEURCMWTwJLAVBLAVBMUIABAFC/MgcWKExQsCJDNhoBSRUkEkQrMQCIAwJEiAM8JwRMUEm9RQFESb5IJFtJTwK8SCMnCWVETAknCUsBZ0AABicKgcgBZzIHSwEWTBZQKExQsCJDNhoBSRUkEkQ2GgJJFSQSRDEASwISRIgC7YgC8icETwJQSb1FAUQjTwK7MgcWKExQsCJDNhoBSRUkEkQnBExQSb1FAUS+SChMULAiQzYaAUkVJBJEiAKmKUxnMgcWKExQsCJDNhoBSRUkEkSIAo8nC0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSSNZgQIISwEVEkRXAgBMiAJbiAJhF0cCiAJrJRJBAA0pSwNnMgcWKExQsCJDSYEoEkEAECtLA1BJvUUBFERLAr9C/+BJgTISQQARJwVLA1BJvUUBFERLAr9C/8hJgTwSQQARJwZLA1BJvUUBFERLAr9C/7BJgUYSQQAQKksDUEm9RQEUREsCv0L/mUmBUBJB/5InB0sDUEm9RQEUREsCv0L/gTYaAUkVIhJENhoCSU4CFSQSRIgBtYgBuxdHAogBxUklE0SBKBJBABQrSwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBUsCUEm9RQFEvEhC/+FJgTwSQQAPJwZLAlBJvUUBRLxIQv/LSYFGEkEADipLAlBJvUUBRLxIQv+2SYFQEkH/rycHSwJQSb1FAUS8SEL/oDYaAUkVIhJEI1MqMQCIAPJEJwhMZzIHFihMULAiQyMpZUQoTFCwIkM2GgFJFSQSRCtLAYgAzCcFSwKIAMUnBksDiAC+KksEiAC4JwdPBYgAsYABACNPBlQiTwVUgQJPBFSBA08DVIEETwJUKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJEF0mIAMglgwUoMjxGUE8GjgYATQA/ADAAIQATAAEAJwdLAVBJvUUBRL5IKExQsCJDKksBUEm9RQFEvkhC/+wnBksBUEm9RQFEvkhC/90nBUsBUEm9RQFEvkhC/84rSwFQSb1FAUS+SEL/wIAQAAAAAAAAAAAAAAAAAAAAAEL/q4oCAYAAi/6L/1BJvUUBQQAgiwG+RCNbMgdJjAAOQQARiwG+RIEIW4sAD0EABCKMAIkjQv/5MQAjKWVEEkSJIycMZUQURIkjJwhlRBREiYoBAIv/JRJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADIkSJI0L/+g==", "clear": "C4EBQw=="}, "desc": "\n Accounting Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzIzMDIzIDB4NTIzNzMwMjMgMHg1MjM0MzAyMyAweDUyMzMzMDIzIDB4NTIzNTMwMjMgMHg1MjM2MzAyMyAweDUyMzgzMDIzICJhc3NldF9zdXNwZW5kZWQiICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgMHg1MjMyMzUyMyAiYXNzZXRfZGVmYXVsdGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwLTMxCiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAxMSAvLyAweDUyMzIzNTIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgOCAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDkKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gRmFsc2UKICAgIGJ5dGVjIDEyIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxOQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBwdXNoYnl0ZXMgInRvdGFsX3VuaXRzIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgOSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMQogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIHB1c2hieXRlcyAidW5pdF92YWx1ZSIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIyCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWMgMTAgLy8gInN0YXR1cyIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfYWNjb3VudGluZy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrQWNjb3VudGluZ01vZHVsZShBY2NvdW50aW5nTW9kdWxlKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2NyZWF0ZUAyMgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4ZGMwNjNiMzUgMHgxNGZjMTBlZiAweDRjMTEzZWQ1IDB4NzRhNzI5N2YgMHgxMDVjMTg0ZSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhY2NvdW50X2dvdl9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X2Nsb3NlIGFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyBhY2NvdW50X2dldF9pbmZvIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbiByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfY29uZmlnCiAgICBlcnIKCm1haW5fY3JlYXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX2FjY291bnRpbmcvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfYWNjb3VudGluZy9jb250cmFjdC5weToxNgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzEgLy8gMHg1MjMyMzAyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9hY2NvdW50aW5nL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nb3Zfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ292X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc3CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfRU5ERUQKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQyCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ2CiAgICAvLyB1bml0cz1VSW50NjQoMCksCiAgICBpbnRjXzEgLy8gMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0NC0xNTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHVuaXRfdmFsdWU9VUludDY0KDApLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1VSW50NjQoMCksCiAgICAvLyAgICAgc3VzcGVuZGVkPUZhbHNlLAogICAgLy8gKQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9jbG9zZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfY2xvc2U6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzMzMwMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTc0CiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTc1CiAgICAvLyBkZWwgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDkgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDgKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gVUludDY0KDApOgogICAgYm56IGFjY291bnRfY2xvc2VfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDkKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVubS5TVEFUVVNfRU5ERUQpCiAgICBieXRlYyAxMCAvLyAic3RhdHVzIgogICAgcHVzaGludCAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CgphY2NvdW50X2Nsb3NlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzgKICAgIC8vIHJldHVybiBjbG9zZWRfdW5pdHMsIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGRpZyAxCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3M6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAwCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcyA9IHBheW1lbnRfYWRkcmVzcwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9nZXRfaW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfZ2V0X2luZm86CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzMzMwMjMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjIyCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU4CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTU5CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gbmV3X2FycmFuZ2VyCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTYwCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfc2V0X29wX2RhZW1vbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfc2V0X29wX2RhZW1vbjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTczCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc0CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDExIC8vIDB4NTIzMjM1MjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDEKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMzUzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA2IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOQogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzgzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjQKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgaW50Y18zIC8vIDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQxCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzgzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGRlbCBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTcKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjczCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyA1IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjM2MzAyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGFkZHJlc3MpLAogICAgYnl0ZWMgNyAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV9jb25maWc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk0CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTcKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk2LTMyNwogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNwogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDcgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIwCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzCiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyMzYzMDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEyLTMxNAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE1CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA1IC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMi0zMDQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk4LTMwMAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3JvbGVfaXNfYWN0aXZlKHJvbGVfbWFwOiBieXRlcywgcm9sZV9hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogpfcm9sZV9pc19hY3RpdmU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIGRlZiBfcm9sZV9pc19hY3RpdmUoc2VsZiwgcm9sZV9tYXA6IHR5cC5SYmFjUm9sZSwgcm9sZV9hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTkKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjAKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTIgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOCAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg4CiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTUKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIHJldHN1YgoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDgK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [1281], "errorMessage": "Defaulted"}, {"pc": [329, 402, 455, 538, 568], "errorMessage": "Invalid account holding address"}, {"pc": [706, 730, 754, 777, 801, 856, 884, 906, 927, 949, 1125, 1142, 1157, 1172, 1186], "errorMessage": "Invalid account role address"}, {"pc": [841, 1115, 1342], "errorMessage": "Invalid role identifier"}, {"pc": [319, 374, 385, 443, 522, 971, 1273], "errorMessage": "Not authorized"}, {"pc": [1289], "errorMessage": "Suspended operations"}, {"pc": [1233, 1248], "errorMessage": "check BoxMap entry exists"}, {"pc": [988, 1271], "errorMessage": "check self.arranger exists"}, {"pc": [1279], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [1287], "errorMessage": "check self.asset_suspended exists"}, {"pc": [470], "errorMessage": "check self.circulating_units exists"}, {"pc": [379], "errorMessage": "check self.status exists"}, {"pc": [647], "errorMessage": "invalid array length header"}, {"pc": [310, 962], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [655], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [302, 359, 367, 436, 508, 516, 559, 584, 607, 641, 825, 1002, 1085], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [631, 815, 1075], "errorMessage": "invalid number of bytes for arc4.uint8"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" -APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) - -def _parse_abi_args(args: object | None = None) -> list[object] | None: - """Helper to parse ABI args into the format expected by underlying client""" - if args is None: - return None - - def convert_dataclass(value: object) -> object: - if dataclasses.is_dataclass(value): - return tuple(convert_dataclass(getattr(value, field.name)) for field in dataclasses.fields(value)) - elif isinstance(value, (list, tuple)): - return type(value)(convert_dataclass(item) for item in value) - return value - - match args: - case tuple(): - method_args = list(args) - case _ if dataclasses.is_dataclass(args): - method_args = [getattr(args, field.name) for field in dataclasses.fields(args)] - case _: - raise ValueError("Invalid 'args' type. Expected 'tuple' or 'TypedDict' for respective typed arguments.") - - return [ - convert_dataclass(arg) if not isinstance(arg, algokit_utils.AppMethodCallTransactionArgument) else arg - for arg in method_args - ] if method_args else None - -def _init_dataclass(cls: type, data: dict) -> object: - """ - Recursively instantiate a dataclass of type `cls` from `data`. - - For each field on the dataclass, if the field type is also a dataclass - and the corresponding data is a dict, instantiate that field recursively. - """ - field_values = {} - for field in dataclasses.fields(cls): - field_value = data.get(field.name) - # Check if the field expects another dataclass and the value is a dict. - if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict): - field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value) - else: - field_values[field.name] = field_value - return cls(**field_values) - -@dataclasses.dataclass(frozen=True) -class AccountInfo: - """Struct for AccountInfo""" - payment_address: str - units: int - unit_value: int - paid_coupons: int - suspended: bool - -@dataclasses.dataclass(frozen=True) -class RoleConfig: - """Struct for RoleConfig""" - role_validity_start: int - role_validity_end: int - - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGovSuspensionArgs: - """Dataclass for account_gov_suspension arguments""" - holding_address: str - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "account_gov_suspension(address,bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountOpenArgs: - """Dataclass for account_open arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_open(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountCloseArgs: - """Dataclass for account_close arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_close(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountUpdatePaymentAddressArgs: - """Dataclass for account_update_payment_address arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_update_payment_address(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGetInfoArgs: - """Dataclass for account_get_info arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_get_info(address)(address,uint64,uint64,uint64,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRotateArrangerArgs: - """Dataclass for rbac_rotate_arranger arguments""" - new_arranger: str - - @property - def abi_method_signature(self) -> str: - return "rbac_rotate_arranger(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacSetOpDaemonArgs: - """Dataclass for rbac_set_op_daemon arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_set_op_daemon(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacAssignRoleArgs: - """Dataclass for rbac_assign_role arguments""" - role_id: int - role_address: str - config: bytes | str - - @property - def abi_method_signature(self) -> str: - return "rbac_assign_role(uint8,address,byte[])uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRevokeRoleArgs: - """Dataclass for rbac_revoke_role arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_revoke_role(uint8,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGovAssetSuspensionArgs: - """Dataclass for rbac_gov_asset_suspension arguments""" - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "rbac_gov_asset_suspension(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetAddressRolesArgs: - """Dataclass for rbac_get_address_roles arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetRoleConfigArgs: - """Dataclass for rbac_get_role_config arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_role_config(uint8,address)(uint64,uint64)" - - -class MockAccountingModuleParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> algokit_utils.AppCallParams: - return self.app_client.params.bare.clear_state( - params, - - ) - - -class MockAccountingModuleCreateTransactionParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> Transaction: - return self.app_client.create_transaction.bare.clear_state( - params, - - ) - - -class MockAccountingModuleSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[int, int]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[int, int]], parsed_response) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AccountInfo]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AccountInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AccountInfo], parsed_response) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[str]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[str], parsed_response) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[RoleConfig]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleConfig, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[RoleConfig], parsed_response) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[algokit_utils.ABIReturn]: - return self.app_client.send.bare.clear_state( - params, - send_params=send_params, - ) - - -class GlobalStateValue(typing.TypedDict): - """Shape of global_state state key values""" - arranger: str - op_daemon: str - asset_suspended: int - asset_defaulted: int - total_units: int - circulating_units: int - unit_value: int - status: int - -class MockAccountingModuleState: - """Methods to access state for the current MockAccountingModule app""" - - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def global_state( - self - ) -> "_GlobalState": - """Methods to access global_state for the current app""" - return _GlobalState(self.app_client) - - @property - def box( - self - ) -> "_BoxState": - """Methods to access box for the current app""" - return _BoxState(self.app_client) - -class _GlobalState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = {} - - def get_all(self) -> GlobalStateValue: - """Get all current keyed values from global_state state""" - result = self.app_client.state.global_state.get_all() - if not result: - return typing.cast(GlobalStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.global_state.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(GlobalStateValue, converted) - - @property - def arranger(self) -> str: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def op_daemon(self) -> str: - """Get the current value of the op_daemon key in global_state state""" - value = self.app_client.state.global_state.get_value("op_daemon") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def asset_suspended(self) -> int: - """Get the current value of the asset_suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def asset_defaulted(self) -> int: - """Get the current value of the asset_defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def status(self) -> int: - """Get the current value of the status key in global_state state""" - value = self.app_client.state.global_state.get_value("status") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - -class _BoxState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = { - "RoleConfig": RoleConfig, - "AccountInfo": AccountInfo - } - - def get_all(self) -> dict[str, typing.Any]: - """Get all current keyed values from box state""" - result = self.app_client.state.box.get_all() - if not result: - return {} - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.box.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return converted - - @property - def account_manager(self) -> "_MapState[str, RoleConfig]": - """Get values from the account_manager map in box state""" - return _MapState( - self.app_client.state.box, - "account_manager", - self._struct_classes.get("RoleConfig") - ) - - @property - def primary_dealer(self) -> "_MapState[str, RoleConfig]": - """Get values from the primary_dealer map in box state""" - return _MapState( - self.app_client.state.box, - "primary_dealer", - self._struct_classes.get("RoleConfig") - ) - - @property - def trustee(self) -> "_MapState[str, RoleConfig]": - """Get values from the trustee map in box state""" - return _MapState( - self.app_client.state.box, - "trustee", - self._struct_classes.get("RoleConfig") - ) - - @property - def authority(self) -> "_MapState[str, RoleConfig]": - """Get values from the authority map in box state""" - return _MapState( - self.app_client.state.box, - "authority", - self._struct_classes.get("RoleConfig") - ) - - @property - def interest_oracle(self) -> "_MapState[str, RoleConfig]": - """Get values from the interest_oracle map in box state""" - return _MapState( - self.app_client.state.box, - "interest_oracle", - self._struct_classes.get("RoleConfig") - ) - - @property - def account(self) -> "_MapState[str, AccountInfo]": - """Get values from the account map in box state""" - return _MapState( - self.app_client.state.box, - "account", - self._struct_classes.get("AccountInfo") - ) - -_KeyType = typing.TypeVar("_KeyType") -_ValueType = typing.TypeVar("_ValueType") - -class _AppClientStateMethodsProtocol(typing.Protocol): - def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: - ... - def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: - ... - -class _MapState(typing.Generic[_KeyType, _ValueType]): - """Generic class for accessing state maps with strongly typed keys and values""" - - def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, - struct_class: typing.Type[_ValueType] | None = None): - self._state_accessor = state_accessor - self._map_name = map_name - self._struct_class = struct_class - - def get_map(self) -> dict[_KeyType, _ValueType]: - """Get all current values in the map""" - result = self._state_accessor.get_map(self._map_name) - if self._struct_class and result: - return {k: _init_dataclass(self._struct_class, v) if isinstance(v, dict) else v - for k, v in result.items()} # type: ignore - return typing.cast(dict[_KeyType, _ValueType], result or {}) - - def get_value(self, key: _KeyType) -> _ValueType | None: - """Get a value from the map by key""" - key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore - value = self._state_accessor.get_map_value(self._map_name, key_value) - if value is not None and self._struct_class and isinstance(value, dict): - return _init_dataclass(self._struct_class, value) # type: ignore - return typing.cast(_ValueType | None, value) - - -class MockAccountingModuleClient: - """Client for interacting with MockAccountingModule smart contract""" - - @typing.overload - def __init__(self, app_client: algokit_utils.AppClient) -> None: ... - - @typing.overload - def __init__( - self, - *, - algorand: _AlgoKitAlgorandClient, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: ... - - def __init__( - self, - app_client: algokit_utils.AppClient | None = None, - *, - algorand: _AlgoKitAlgorandClient | None = None, - app_id: int | None = None, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: - if app_client: - self.app_client = app_client - elif algorand and app_id: - self.app_client = algokit_utils.AppClient( - algokit_utils.AppClientParams( - algorand=algorand, - app_spec=APP_SPEC, - app_id=app_id, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - else: - raise ValueError("Either app_client or algorand and app_id must be provided") - - self.params = MockAccountingModuleParams(self.app_client) - self.create_transaction = MockAccountingModuleCreateTransactionParams(self.app_client) - self.send = MockAccountingModuleSend(self.app_client) - self.state = MockAccountingModuleState(self.app_client) - - @staticmethod - def from_creator_and_name( - creator_address: str, - app_name: str, - algorand: _AlgoKitAlgorandClient, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - ) -> "MockAccountingModuleClient": - return MockAccountingModuleClient( - algokit_utils.AppClient.from_creator_and_name( - creator_address=creator_address, - app_name=app_name, - app_spec=APP_SPEC, - algorand=algorand, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ignore_cache=ignore_cache, - app_lookup_cache=app_lookup_cache, - ) - ) - - @staticmethod - def from_network( - algorand: _AlgoKitAlgorandClient, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "MockAccountingModuleClient": - return MockAccountingModuleClient( - algokit_utils.AppClient.from_network( - app_spec=APP_SPEC, - algorand=algorand, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - @property - def app_id(self) -> int: - return self.app_client.app_id - - @property - def app_address(self) -> str: - return self.app_client.app_address - - @property - def app_name(self) -> str: - return self.app_client.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_client.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_client.algorand - - def clone( - self, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "MockAccountingModuleClient": - return MockAccountingModuleClient( - self.app_client.clone( - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - def new_group(self) -> "MockAccountingModuleComposer": - return MockAccountingModuleComposer(self) - - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_gov_suspension(address,bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_open(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_close(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[int, int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_update_payment_address(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_get_info(address)(address,uint64,uint64,uint64,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> AccountInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_rotate_arranger(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_set_op_daemon(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_assign_role(uint8,address,byte[])uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_revoke_role(uint8,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_arranger()address"], - return_value: algokit_utils.ABIReturn | None - ) -> str | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_address_roles(address)(bool,bool,bool,bool,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[bool, bool, bool, bool, bool] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_role_config(uint8,address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> RoleConfig | None: ... - @typing.overload - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None: ... - - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None | AccountInfo | RoleConfig | int | str | tuple[bool, bool, bool, bool, bool] | tuple[int, int]: - """Decode ABI return value for the given method.""" - if return_value is None: - return None - - arc56_method = self.app_spec.get_arc56_method(method) - decoded = return_value.get_arc56_value(arc56_method, self.app_spec.structs) - - # If method returns a struct, convert the dict to appropriate dataclass - if (arc56_method and - arc56_method.returns and - arc56_method.returns.struct and - isinstance(decoded, dict)): - struct_class = globals().get(arc56_method.returns.struct) - if struct_class: - return struct_class(**typing.cast(dict, decoded)) - return decoded - - -@dataclasses.dataclass(frozen=True) -class MockAccountingModuleBareCallCreateParams(algokit_utils.AppClientBareCallCreateParams): - """Parameters for creating MockAccountingModule contract with bare calls""" - on_complete: typing.Literal[OnComplete.NoOpOC] | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientBareCallCreateParams: - return algokit_utils.AppClientBareCallCreateParams(**self.__dict__) - -class MockAccountingModuleFactory(algokit_utils.TypedAppFactoryProtocol[MockAccountingModuleBareCallCreateParams, None, None]): - """Factory for deploying and managing MockAccountingModuleClient smart contracts""" - - def __init__( - self, - algorand: _AlgoKitAlgorandClient, - *, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - version: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ): - self.app_factory = algokit_utils.AppFactory( - params=algokit_utils.AppFactoryParams( - algorand=algorand, - app_spec=APP_SPEC, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - version=version, - compilation_params=compilation_params, - ) - ) - self.params = MockAccountingModuleFactoryParams(self.app_factory) - self.create_transaction = MockAccountingModuleFactoryCreateTransaction(self.app_factory) - self.send = MockAccountingModuleFactorySend(self.app_factory) - - @property - def app_name(self) -> str: - return self.app_factory.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_factory.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_factory.algorand - - def deploy( - self, - *, - on_update: algokit_utils.OnUpdate | None = None, - on_schema_break: algokit_utils.OnSchemaBreak | None = None, - create_params: MockAccountingModuleBareCallCreateParams | None = None, - update_params: None = None, - delete_params: None = None, - existing_deployments: algokit_utils.ApplicationLookup | None = None, - ignore_cache: bool = False, - app_name: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - send_params: algokit_utils.SendParams | None = None, - ) -> tuple[MockAccountingModuleClient, algokit_utils.AppFactoryDeployResult]: - """Deploy the application""" - deploy_response = self.app_factory.deploy( - on_update=on_update, - on_schema_break=on_schema_break, - create_params=create_params.to_algokit_utils_params() if create_params else None, - update_params=update_params, - delete_params=delete_params, - existing_deployments=existing_deployments, - ignore_cache=ignore_cache, - app_name=app_name, - compilation_params=compilation_params, - send_params=send_params, - ) - - return MockAccountingModuleClient(deploy_response[0]), deploy_response[1] - - def get_app_client_by_creator_and_name( - self, - creator_address: str, - app_name: str, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> MockAccountingModuleClient: - """Get an app client by creator address and name""" - return MockAccountingModuleClient( - self.app_factory.get_app_client_by_creator_and_name( - creator_address, - app_name, - default_sender, - default_signer, - ignore_cache, - app_lookup_cache, - approval_source_map, - clear_source_map, - ) - ) - - def get_app_client_by_id( - self, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> MockAccountingModuleClient: - """Get an app client by app ID""" - return MockAccountingModuleClient( - self.app_factory.get_app_client_by_id( - app_id, - app_name, - default_sender, - default_signer, - approval_source_map, - clear_source_map, - ) - ) - - -class MockAccountingModuleFactoryParams: - """Parameters for creating transactions for MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = MockAccountingModuleFactoryCreateParams(app_factory) - self.update = MockAccountingModuleFactoryUpdateParams(app_factory) - self.delete = MockAccountingModuleFactoryDeleteParams(app_factory) - -class MockAccountingModuleFactoryCreateParams: - """Parameters for 'create' operations of MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateParams: - """Creates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - compilation_params=compilation_params) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_gov_suspension(address,bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_open(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_close(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_update_payment_address(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_get_info(address)(address,uint64,uint64,uint64,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_rotate_arranger(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_set_op_daemon(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_assign_role(uint8,address,byte[])uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_revoke_role(uint8,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_arranger( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_arranger()address ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_address_roles(address)(bool,bool,bool,bool,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_role_config(uint8,address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - -class MockAccountingModuleFactoryUpdateParams: - """Parameters for 'update' operations of MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppUpdateParams: - """Updates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_update( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - -class MockAccountingModuleFactoryDeleteParams: - """Parameters for 'delete' operations of MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppDeleteParams: - """Deletes an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_delete( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - - -class MockAccountingModuleFactoryCreateTransaction: - """Create transactions for MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = MockAccountingModuleFactoryCreateTransactionCreate(app_factory) - - -class MockAccountingModuleFactoryCreateTransactionCreate: - """Create new instances of MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - params: algokit_utils.CommonAppCallCreateParams | None = None, - ) -> Transaction: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.create_transaction.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - ) - - -class MockAccountingModuleFactorySend: - """Send calls to MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = MockAccountingModuleFactorySendCreate(app_factory) - - -class MockAccountingModuleFactorySendCreate: - """Send create calls to MockAccountingModule contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ) -> tuple[MockAccountingModuleClient, algokit_utils.SendAppCreateTransactionResult]: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - result = self.app_factory.send.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - send_params=send_params, - compilation_params=compilation_params - ) - return MockAccountingModuleClient(result[0]), result[1] - - -class MockAccountingModuleComposer: - """Composer for creating transaction groups for MockAccountingModule contract calls""" - - def __init__(self, client: "MockAccountingModuleClient"): - self.client = client - self._composer = client.algorand.new_group() - self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.account_gov_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_gov_suspension(address,bool)uint64", v - ) - ) - return self - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.account_open( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_open(address,address)uint64", v - ) - ) - return self - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.account_close( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_close(address)(uint64,uint64)", v - ) - ) - return self - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.account_update_payment_address( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_update_payment_address(address,address)uint64", v - ) - ) - return self - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.account_get_info( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_get_info(address)(address,uint64,uint64,uint64,bool)", v - ) - ) - return self - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_rotate_arranger( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_rotate_arranger(address)uint64", v - ) - ) - return self - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_set_op_daemon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_set_op_daemon(address)uint64", v - ) - ) - return self - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_assign_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_assign_role(uint8,address,byte[])uint64", v - ) - ) - return self - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_revoke_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_revoke_role(uint8,address)uint64", v - ) - ) - return self - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_gov_asset_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_gov_asset_suspension(bool)uint64", v - ) - ) - return self - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_arranger( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_arranger()address", v - ) - ) - return self - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_address_roles( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", v - ) - ) - return self - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_role_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_role_config(uint8,address)(uint64,uint64)", v - ) - ) - return self - - def clear_state( - self, - *, - args: list[bytes] | None = None, - params: algokit_utils.CommonAppCallParams | None = None, - ) -> "MockAccountingModuleComposer": - params=params or algokit_utils.CommonAppCallParams() - self._composer.add_app_call( - self.client.params.clear_state( - algokit_utils.AppClientBareCallParams( - **{ - **dataclasses.asdict(params), - "args": args - } - ) - ) - ) - return self - - def add_transaction( - self, txn: Transaction, signer: TransactionSigner | None = None - ) -> "MockAccountingModuleComposer": - self._composer.add_transaction(txn, signer) - return self - - def composer(self) -> algokit_utils.TransactionComposer: - return self._composer - - def simulate( - self, - allow_more_logs: bool | None = None, - allow_empty_signatures: bool | None = None, - allow_unnamed_resources: bool | None = None, - extra_opcode_budget: int | None = None, - exec_trace_config: SimulateTraceConfig | None = None, - simulation_round: int | None = None, - skip_signatures: bool | None = None, - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.simulate( - allow_more_logs=allow_more_logs, - allow_empty_signatures=allow_empty_signatures, - allow_unnamed_resources=allow_unnamed_resources, - extra_opcode_budget=extra_opcode_budget, - exec_trace_config=exec_trace_config, - simulation_round=simulation_round, - skip_signatures=skip_signatures, - ) - - def send( - self, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.send(send_params) diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map index 4f79d95a..de6bf348 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.puya.map @@ -4,7 +4,7 @@ "../../../modules/rbac.py", "../../mock_module_rbac/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BmD;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAgBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AC3CR;;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;AAAA;AAQK;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAEG;AAAsB;;AAAtB;AAFH;AAAA;ADqIA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGc;AAAX;AAAX;;;AACY;AAAA;;AAAA;AAqGG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxEM;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA+FJ;;;AA7FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA2FJ;;;AAzFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAuFJ;;;AArFG;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAmFJ;;;AAjFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAkFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGO;AAAW;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAmGG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1EM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA8FJ;;;AA5FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA0FJ;;;AAxFG;AAAW;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAsFJ;;;AApFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAqFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzJ+B;AAAgB;;AAArC;;;AAAP;AAyKA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;AAIA;;;;;;;AALT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA5QL;;AAAA;AAAA;AAAA;AAAA;;AA2QC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;AAvQL;;AAAA;AAAA;AAAA;AAAA;;AAsQC;AAGO;AAAA;AAxClB;;;AAiCe;;AAlQL;;AAAA;AAAA;AAAA;AAAA;;AAiQC;AAGO;AAAA;AAnClB;;;AA4Be;;AA7PL;;AAAA;AAAA;AAAA;AAAA;;AA4PC;AAGO;AAAA;AA9BlB;;;AAuBe;AAxPL;;AAAA;AAAA;AAAA;AAAA;;AAuPC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AA/ND;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAKJ;;;AACW;;AACH;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BmD;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAkBA;;AAA0B;AAA1B;AAGA;;AAAiB;AAAjB;AC7CR;;AAAA;;;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;AAAA;ADgJK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;ACxIA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAEG;AAAsB;;AAAtB;AAFH;AAAA;ADsJG;;;AAdH;AAAA;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcG;;;AACA;;AAAA;AAAA;AACO;;AAhBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1Hc;AAAX;AAAX;;;AACY;AAAA;;AAAA;AA2HG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9FM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAqHJ;;;AAnHG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAiHJ;;;AA/GG;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA6GJ;;;AA3GG;AAAW;;AAAX;AAAX;;;AACuC;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAyGJ;;;AAvGG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAwGP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AA1HO;AAAW;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAyHG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhGM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAoHJ;;;AAlHG;AAAW;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAgHJ;;;AA9GG;AAAW;;AAAX;AAAX;;;AACmC;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA4GJ;;;AA1GG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AA2GP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL+B;AAAgB;;AAArC;;;AAAP;AAgMA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAtM+B;AAAc;;AAAnC;;;AAAP;AAmNA;;AAAA;AAAA;AACO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;AAAA;AAAA;AAXV;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;AAArB;;AAAA;;;AACqB;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAtBP;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAkBU;AACP;AAAA;;;AAES;AAIA;;;;;;;AALT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA9TL;;AAAA;AAAA;AAAA;AAAA;;AA6TC;AAGO;AAAA;AAjDlB;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Ce;AAzTL;;AAAA;AAAA;AAAA;AAAA;;AAwTC;AAGO;AAAA;AA5ClB;;;AAqCe;AApTL;;AAAA;AAAA;AAAA;AAAA;;AAmTC;AAGO;AAAA;AAvClB;;;AAgCe;;AA/SL;;AAAA;AAAA;AAAA;AAAA;;AA8SC;AAGO;AAAA;AAlClB;;;AA2Be;;AA1SL;;AAAA;AAAA;AAAA;AAAA;;AAySC;AAGO;AAAA;AA7BlB;;;AAsBkB;;;;;;;;;;;;;;;;;;AAtBlB;;;AA7QD;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAKJ;;;AACW;;AACH;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;AAAA;;AAOH;;AAPG;AAAA;;;;AAAP;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -15,9 +15,9 @@ "op": "intcblock 1 0 32 20" }, "7": { - "op": "bytecblock 0x151f7c75 0x52323023 0x52373023 0x52343023 0x52353023 0x52363023 0x52383023 0x52323523 \"asset_suspended\" \"asset_defaulted\"" + "op": "bytecblock 0x151f7c75 0x523a41525223 0x523a54525323 0x523a41555423 0x523a4d4e4723 0x523a50594423 0x523a4d4f4323 \"defaulted\" 0x523a4f504423 \"contract_suspended\"" }, - "81": { + "92": { "op": "txn ApplicationID", "defined_out": [ "tmp%0#0" @@ -26,103 +26,103 @@ "tmp%0#0" ] }, - "83": { + "94": { "op": "bnz main_after_if_else@2", "stack_out": [] }, - "86": { - "op": "bytec_1 // 0x52323023", + "97": { + "op": "bytec_1 // 0x523a41525223", "defined_out": [ - "0x52323023" + "0x523a41525223" ], "stack_out": [ - "0x52323023" + "0x523a41525223" ] }, - "87": { + "98": { "op": "global ZeroAddress", "defined_out": [ - "0x52323023", + "0x523a41525223", "tmp%0#2" ], "stack_out": [ - "0x52323023", + "0x523a41525223", "tmp%0#2" ] }, - "89": { + "100": { "op": "app_global_put", "stack_out": [] }, - "90": { - "op": "bytec 7 // 0x52323523", + "101": { + "op": "bytec 8 // 0x523a4f504423", "defined_out": [ - "0x52323523" + "0x523a4f504423" ], "stack_out": [ - "0x52323523" + "0x523a4f504423" ] }, - "92": { + "103": { "op": "global ZeroAddress", "defined_out": [ - "0x52323523", + "0x523a4f504423", "tmp%1#2" ], "stack_out": [ - "0x52323523", + "0x523a4f504423", "tmp%1#2" ] }, - "94": { + "105": { "op": "app_global_put", "stack_out": [] }, - "95": { - "op": "bytec 8 // \"asset_suspended\"", + "106": { + "op": "bytec 9 // \"contract_suspended\"", "defined_out": [ - "\"asset_suspended\"" + "\"contract_suspended\"" ], "stack_out": [ - "\"asset_suspended\"" + "\"contract_suspended\"" ] }, - "97": { + "108": { "op": "intc_1 // 0", "defined_out": [ - "\"asset_suspended\"", + "\"contract_suspended\"", "0" ], "stack_out": [ - "\"asset_suspended\"", + "\"contract_suspended\"", "0" ] }, - "98": { + "109": { "op": "app_global_put", "stack_out": [] }, - "99": { - "op": "bytec 9 // \"asset_defaulted\"", + "110": { + "op": "bytec 7 // \"defaulted\"", "defined_out": [ - "\"asset_defaulted\"" + "\"defaulted\"" ], "stack_out": [ - "\"asset_defaulted\"" + "\"defaulted\"" ] }, - "101": { + "112": { "op": "intc_1 // 0", "stack_out": [ - "\"asset_defaulted\"", + "\"defaulted\"", "0" ] }, - "102": { + "113": { "op": "app_global_put", "stack_out": [] }, - "103": { + "114": { "block": "main_after_if_else@2", "stack_in": [], "op": "txn NumAppArgs", @@ -133,53 +133,80 @@ "tmp%0#1" ] }, - "105": { - "op": "bz main_create@17", + "116": { + "op": "bz main_create@20", "stack_out": [] }, - "108": { - "op": "txn OnCompletion", + "119": { + "op": "pushbytes 0x914f04eb // method \"contract_update()void\"", + "defined_out": [ + "Method(contract_update()void)" + ], + "stack_out": [ + "Method(contract_update()void)" + ] + }, + "125": { + "op": "txna ApplicationArgs 0", "defined_out": [ + "Method(contract_update()void)", "tmp%2#0" ], "stack_out": [ + "Method(contract_update()void)", "tmp%2#0" ] }, - "110": { + "128": { + "op": "match main_contract_update_route@5", + "stack_out": [] + }, + "132": { + "block": "main_switch_case_next@6", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "tmp%8#0" + ] + }, + "134": { "op": "!", "defined_out": [ - "tmp%3#0" + "tmp%9#0" ], "stack_out": [ - "tmp%3#0" + "tmp%9#0" ] }, - "111": { + "135": { "op": "assert", "stack_out": [] }, - "112": { + "136": { "op": "txn ApplicationID", "defined_out": [ - "tmp%4#0" + "tmp%10#0" ], "stack_out": [ - "tmp%4#0" + "tmp%10#0" ] }, - "114": { + "138": { "op": "assert", "stack_out": [] }, - "115": { - "op": "pushbytess 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,byte[])uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_config(uint8,address)(uint64,uint64)\"", + "139": { + "op": "pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x39241fa3 0x010c8299 0x7406acd2 0x1a72a2ee // method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,(uint64,uint64))uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_contract_suspension(bool)uint64\", method \"rbac_contract_default(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_validity(uint8,address)(uint64,uint64)\"", "defined_out": [ - "Method(rbac_assign_role(uint8,address,byte[])uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_contract_default(bool)uint64)", + "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", "Method(rbac_revoke_role(uint8,address)uint64)", "Method(rbac_rotate_arranger(address)uint64)", "Method(rbac_set_op_daemon(address)uint64)" @@ -187,50 +214,93 @@ "stack_out": [ "Method(rbac_rotate_arranger(address)uint64)", "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_contract_suspension(bool)uint64)", + "Method(rbac_contract_default(bool)uint64)", "Method(rbac_get_arranger()address)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))" + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))" ] }, - "157": { + "186": { "op": "txna ApplicationArgs 0", "defined_out": [ - "Method(rbac_assign_role(uint8,address,byte[])uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", + "Method(rbac_contract_default(bool)uint64)", + "Method(rbac_contract_suspension(bool)uint64)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", "Method(rbac_revoke_role(uint8,address)uint64)", "Method(rbac_rotate_arranger(address)uint64)", "Method(rbac_set_op_daemon(address)uint64)", - "tmp%6#0" + "tmp%12#0" ], "stack_out": [ "Method(rbac_rotate_arranger(address)uint64)", "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", + "Method(rbac_assign_role(uint8,address,(uint64,uint64))uint64)", "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", + "Method(rbac_contract_suspension(bool)uint64)", + "Method(rbac_contract_default(bool)uint64)", "Method(rbac_get_arranger()address)", "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "tmp%6#0" + "Method(rbac_get_role_validity(uint8,address)(uint64,uint64))", + "tmp%12#0" ] }, - "160": { - "op": "match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config", + "189": { + "op": "match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_contract_default rbac_get_arranger rbac_get_address_roles rbac_get_role_validity", "stack_out": [] }, - "178": { + "209": { "op": "err" }, - "179": { - "block": "main_create@17", + "210": { + "block": "main_contract_update_route@5", "stack_in": [], "op": "txn OnCompletion", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0" + ] + }, + "212": { + "op": "pushint 4 // UpdateApplication", + "defined_out": [ + "UpdateApplication", + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0", + "UpdateApplication" + ] + }, + "214": { + "op": "==", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "215": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%4#0", + "tmp%5#0" + ], + "stack_out": [ + "tmp%4#0", + "tmp%5#0" + ] + }, + "217": { + "op": "&&", "defined_out": [ "tmp%7#0" ], @@ -238,75 +308,114 @@ "tmp%7#0" ] }, - "181": { + "218": { + "op": "assert", + "stack_out": [] + }, + "219": { + "op": "b contract_update" + }, + "222": { + "block": "main_create@20", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%13#0" + ], + "stack_out": [ + "tmp%13#0" + ] + }, + "224": { "op": "!", "defined_out": [ - "tmp%8#0" + "tmp%14#0" ], "stack_out": [ - "tmp%8#0" + "tmp%14#0" ] }, - "182": { + "225": { "op": "txn ApplicationID", "defined_out": [ - "tmp%8#0", - "tmp%9#0" + "tmp%14#0", + "tmp%15#0" ], "stack_out": [ - "tmp%8#0", - "tmp%9#0" + "tmp%14#0", + "tmp%15#0" ] }, - "184": { + "227": { "op": "!", "defined_out": [ - "tmp%10#0", - "tmp%8#0" + "tmp%14#0", + "tmp%16#0" ], "stack_out": [ - "tmp%8#0", - "tmp%10#0" + "tmp%14#0", + "tmp%16#0" ] }, - "185": { + "228": { "op": "&&", "defined_out": [ - "tmp%11#0" + "tmp%17#0" ], "stack_out": [ - "tmp%11#0" + "tmp%17#0" ] }, - "186": { + "229": { "op": "assert", "stack_out": [] }, - "187": { - "op": "bytec_1 // 0x52323023", + "230": { + "op": "bytec_1 // 0x523a41525223", "defined_out": [ - "0x52323023" + "0x523a41525223" ], "stack_out": [ - "0x52323023" + "0x523a41525223" ] }, - "188": { + "231": { "op": "txn Sender", "defined_out": [ - "0x52323023", + "0x523a41525223", "tmp%0#2" ], "stack_out": [ - "0x52323023", + "0x523a41525223", "tmp%0#2" ] }, - "190": { + "233": { "op": "app_global_put", "stack_out": [] }, - "191": { + "234": { + "op": "intc_0 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "235": { + "op": "return", + "stack_out": [] + }, + "236": { + "subroutine": "modules.rbac.RbacModule.contract_update[routing]", + "params": {}, + "block": "contract_update", + "stack_in": [], + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "239": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -315,11 +424,11 @@ "1" ] }, - "192": { + "240": { "op": "return", "stack_out": [] }, - "193": { + "241": { "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", "params": {}, "block": "rbac_rotate_arranger", @@ -332,7 +441,7 @@ "new_arranger#0" ] }, - "196": { + "244": { "op": "dup", "defined_out": [ "new_arranger#0", @@ -343,7 +452,7 @@ "new_arranger#0 (copy)" ] }, - "197": { + "245": { "op": "len", "defined_out": [ "len%0#0", @@ -354,7 +463,7 @@ "len%0#0" ] }, - "198": { + "246": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -367,7 +476,7 @@ "32" ] }, - "199": { + "247": { "op": "==", "defined_out": [ "eq%0#0", @@ -378,40 +487,40 @@ "eq%0#0" ] }, - "200": { + "248": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "new_arranger#0" ] }, - "201": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" + "249": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" }, - "204": { - "op": "bytec_1 // 0x52323023", + "252": { + "op": "bytec_1 // 0x523a41525223", "defined_out": [ - "0x52323023", + "0x523a41525223", "new_arranger#0" ], "stack_out": [ "new_arranger#0", - "0x52323023" + "0x523a41525223" ] }, - "205": { + "253": { "op": "swap", "stack_out": [ - "0x52323023", + "0x523a41525223", "new_arranger#0" ] }, - "206": { + "254": { "op": "app_global_put", "stack_out": [] }, - "207": { + "255": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -420,7 +529,7 @@ "tmp%0#1" ] }, - "209": { + "257": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -429,7 +538,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "210": { + "258": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -440,14 +549,14 @@ "0x151f7c75" ] }, - "211": { + "259": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "212": { + "260": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -456,11 +565,11 @@ "tmp%4#0" ] }, - "213": { + "261": { "op": "log", "stack_out": [] }, - "214": { + "262": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -469,11 +578,11 @@ "1" ] }, - "215": { + "263": { "op": "return", "stack_out": [] }, - "216": { + "264": { "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", "params": {}, "block": "rbac_set_op_daemon", @@ -486,7 +595,7 @@ "address#0" ] }, - "219": { + "267": { "op": "dup", "defined_out": [ "address#0", @@ -497,7 +606,7 @@ "address#0 (copy)" ] }, - "220": { + "268": { "op": "len", "defined_out": [ "address#0", @@ -508,7 +617,7 @@ "len%0#0" ] }, - "221": { + "269": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -521,7 +630,7 @@ "32" ] }, - "222": { + "270": { "op": "==", "defined_out": [ "address#0", @@ -532,40 +641,40 @@ "eq%0#0" ] }, - "223": { + "271": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "224": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" + "272": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" }, - "227": { - "op": "bytec 7 // 0x52323523", + "275": { + "op": "bytec 8 // 0x523a4f504423", "defined_out": [ - "0x52323523", + "0x523a4f504423", "address#0" ], "stack_out": [ "address#0", - "0x52323523" + "0x523a4f504423" ] }, - "229": { + "277": { "op": "swap", "stack_out": [ - "0x52323523", + "0x523a4f504423", "address#0" ] }, - "230": { + "278": { "op": "app_global_put", "stack_out": [] }, - "231": { + "279": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -574,7 +683,7 @@ "tmp%0#1" ] }, - "233": { + "281": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -583,7 +692,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "234": { + "282": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -594,14 +703,14 @@ "0x151f7c75" ] }, - "235": { + "283": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "236": { + "284": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -610,11 +719,11 @@ "tmp%4#0" ] }, - "237": { + "285": { "op": "log", "stack_out": [] }, - "238": { + "286": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -623,11 +732,11 @@ "1" ] }, - "239": { + "287": { "op": "return", "stack_out": [] }, - "240": { + "288": { "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", "params": {}, "block": "rbac_assign_role", @@ -640,7 +749,7 @@ "role_id#0" ] }, - "243": { + "291": { "op": "dup", "defined_out": [ "role_id#0", @@ -651,7 +760,7 @@ "role_id#0 (copy)" ] }, - "244": { + "292": { "op": "len", "defined_out": [ "len%0#0", @@ -662,7 +771,7 @@ "len%0#0" ] }, - "245": { + "293": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -675,7 +784,7 @@ "1" ] }, - "246": { + "294": { "op": "==", "defined_out": [ "eq%0#0", @@ -686,17 +795,17 @@ "eq%0#0" ] }, - "247": { + "295": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "248": { + "296": { "op": "txna ApplicationArgs 2" }, - "251": { + "299": { "op": "dup", "defined_out": [ "role_address#0", @@ -708,7 +817,7 @@ "role_address#0" ] }, - "252": { + "300": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -720,7 +829,7 @@ "role_address#0" ] }, - "254": { + "302": { "op": "len", "defined_out": [ "len%1#0", @@ -733,7 +842,7 @@ "len%1#0" ] }, - "255": { + "303": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -748,7 +857,7 @@ "32" ] }, - "256": { + "304": { "op": "==", "defined_out": [ "eq%1#0", @@ -761,7 +870,7 @@ "eq%1#0" ] }, - "257": { + "305": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -769,293 +878,217 @@ "role_id#0" ] }, - "258": { - "op": "txna ApplicationArgs 3", + "306": { + "op": "txna ApplicationArgs 3" + }, + "309": { + "op": "dup", "defined_out": [ "role_address#0", "role_id#0", - "tmp%3#0" + "validity#0" ], "stack_out": [ "role_address#0", "role_id#0", - "tmp%3#0" + "validity#0", + "validity#0" ] }, - "261": { - "op": "dup", + "310": { + "op": "cover 2", "defined_out": [ "role_address#0", "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" + "validity#0" ], "stack_out": [ "role_address#0", + "validity#0", "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ] - }, - "262": { - "op": "intc_1 // 0", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)", - "0" + "validity#0" ] }, - "263": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", + "312": { + "op": "len", "defined_out": [ - "aggregate%array_length%0#0", + "len%2#0", "role_address#0", "role_id#0", - "tmp%3#0" + "validity#0" ], "stack_out": [ "role_address#0", + "validity#0", "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0" + "len%2#0" ] }, - "264": { - "op": "pushint 2", + "313": { + "op": "pushint 16", "defined_out": [ - "2", - "aggregate%array_length%0#0", + "16", + "len%2#0", "role_address#0", "role_id#0", - "tmp%3#0" + "validity#0" ], "stack_out": [ "role_address#0", + "validity#0", "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0", - "2" + "len%2#0", + "16" ] }, - "266": { - "op": "+", + "315": { + "op": "==", "defined_out": [ - "add%0#0", + "eq%2#0", "role_address#0", "role_id#0", - "tmp%3#0" + "validity#0" ], "stack_out": [ "role_address#0", + "validity#0", "role_id#0", - "tmp%3#0", - "add%0#0" + "eq%2#0" ] }, - "267": { - "op": "dig 1", + "316": { + "error": "invalid number of bytes for smart_contracts.abi_types.RoleValidity", + "op": "assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity", "stack_out": [ "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "tmp%3#0 (copy)" + "validity#0", + "role_id#0" ] }, - "269": { - "op": "len", + "317": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" + }, + "320": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" + }, + "323": { + "op": "btoi", "defined_out": [ - "add%0#0", - "len%2#0", "role_address#0", - "role_id#0", - "tmp%3#0" + "role_id#1", + "validity#0" ], "stack_out": [ "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "len%2#0" + "validity#0", + "role_id#1" ] }, - "270": { - "op": "==", - "defined_out": [ - "eq%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "eq%2#0" - ] - }, - "271": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "272": { - "op": "extract 2 0", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "config#0" - ] - }, - "275": { - "op": "swap", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#0" - ] - }, - "276": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "279": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "282": { - "op": "btoi", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "283": { + "324": { "op": "dupn 2", "defined_out": [ - "config#0", "role_address#0", "role_id#1", - "role_id#1 (copy)" + "role_id#1 (copy)", + "validity#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1", "role_id#1 (copy)" ] }, - "285": { + "326": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1" ] }, - "288": { + "329": { "op": "intc_3 // 20", "defined_out": [ "20", - "config#0", "role_address#0", - "role_id#1" + "role_id#1", + "validity#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1", "20" ] }, - "289": { + "330": { "op": "==", "defined_out": [ - "config#0", "role_address#0", "role_id#1", - "tmp%0#2" + "tmp%0#2", + "validity#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "tmp%0#2" ] }, - "290": { + "331": { "op": "bz rbac_assign_role_after_if_else@3", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "293": { - "op": "bytec_1 // 0x52323023", + "334": { + "op": "bytec_1 // 0x523a41525223", "defined_out": [ - "0x52323023", - "config#0", + "0x523a41525223", "role_address#0", - "role_id#1" + "role_id#1", + "validity#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "0x52323023" + "0x523a41525223" ] }, - "294": { + "335": { "op": "dig 3", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "0x52323023", + "0x523a41525223", "role_address#0" ] }, - "296": { + "337": { "op": "app_global_put", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "297": { - "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", + "338": { + "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_in": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ], "op": "global LatestTimestamp", @@ -1064,24 +1097,24 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "tmp%2#1" ] }, - "299": { + "340": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "aggregate%val_as_bytes%0#0" ] }, - "300": { + "341": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -1089,67 +1122,67 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "aggregate%val_as_bytes%0#0", "0x151f7c75" ] }, - "301": { + "342": { "op": "swap", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "302": { + "343": { "op": "concat", "defined_out": [ - "tmp%7#0" + "tmp%6#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "tmp%7#0" + "tmp%6#0" ] }, - "303": { + "344": { "op": "log", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "304": { + "345": { "op": "intc_0 // 1", "defined_out": [ "1" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "1" ] }, - "305": { + "346": { "op": "return", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "306": { + "347": { "block": "rbac_assign_role_after_if_else@3", "stack_in": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ], "op": "dup", @@ -1158,12 +1191,12 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1" ] }, - "307": { + "348": { "op": "pushint 40", "defined_out": [ "40", @@ -1171,13 +1204,13 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1", "40" ] }, - "309": { + "350": { "op": "==", "defined_out": [ "role_id#1", @@ -1185,48 +1218,48 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "tmp%1#1" ] }, - "310": { + "351": { "op": "bz rbac_assign_role_after_if_else@5", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "313": { - "op": "bytec_3 // 0x52343023", + "354": { + "op": "bytec 4 // 0x523a4d4e4723", "defined_out": [ - "0x52343023", + "0x523a4d4e4723", "role_id#1" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "0x52343023" + "0x523a4d4e4723" ] }, - "314": { + "356": { "op": "dig 3", "defined_out": [ - "0x52343023", + "0x523a4d4e4723", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "0x52343023", + "0x523a4d4e4723", "role_address#0" ] }, - "316": { + "358": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -1235,12 +1268,12 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%0#0" ] }, - "317": { + "359": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -1250,13 +1283,13 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%0#0", "box_prefixed_key%0#0 (copy)" ] }, - "318": { + "360": { "op": "box_len", "defined_out": [ "_%0#0", @@ -1267,24 +1300,24 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%0#0", "_%0#0", "maybe_exists%0#0" ] }, - "319": { + "361": { "op": "bury 1", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%0#0", "maybe_exists%0#0" ] }, - "321": { + "363": { "op": "!", "defined_out": [ "box_prefixed_key%0#0", @@ -1294,54 +1327,54 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%0#0", "tmp%2#2" ] }, - "322": { + "364": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%0#0" ] }, - "323": { + "365": { "op": "dig 2", "defined_out": [ "box_prefixed_key%0#0", - "config#0", "role_address#0", - "role_id#1" + "role_id#1", + "validity#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%0#0", - "config#0" + "validity#0" ] }, - "325": { + "367": { "op": "box_put", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "326": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" + "368": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "329": { + "371": { "block": "rbac_assign_role_after_if_else@5", "stack_in": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ], "op": "dup", @@ -1350,12 +1383,12 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1" ] }, - "330": { + "372": { "op": "pushint 50", "defined_out": [ "50", @@ -1363,62 +1396,62 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1", "50" ] }, - "332": { + "374": { "op": "==", "defined_out": [ "role_id#1", - "tmp%3#1" + "tmp%3#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "tmp%3#1" + "tmp%3#0" ] }, - "333": { + "375": { "op": "bz rbac_assign_role_after_if_else@7", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "336": { - "op": "bytec 4 // 0x52353023", + "378": { + "op": "bytec 5 // 0x523a50594423", "defined_out": [ - "0x52353023", + "0x523a50594423", "role_id#1" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "0x52353023" + "0x523a50594423" ] }, - "338": { + "380": { "op": "dig 3", "defined_out": [ - "0x52353023", + "0x523a50594423", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "0x52353023", + "0x523a50594423", "role_address#0" ] }, - "340": { + "382": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -1427,12 +1460,12 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%2#0" ] }, - "341": { + "383": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -1442,13 +1475,13 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%2#0", "box_prefixed_key%2#0 (copy)" ] }, - "342": { + "384": { "op": "box_len", "defined_out": [ "_%1#0", @@ -1459,24 +1492,24 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%2#0", "_%1#0", "maybe_exists%1#0" ] }, - "343": { + "385": { "op": "bury 1", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%2#0", "maybe_exists%1#0" ] }, - "345": { + "387": { "op": "!", "defined_out": [ "box_prefixed_key%2#0", @@ -1486,54 +1519,54 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%2#0", "tmp%4#0" ] }, - "346": { + "388": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%2#0" ] }, - "347": { + "389": { "op": "dig 2", "defined_out": [ "box_prefixed_key%2#0", - "config#0", "role_address#0", - "role_id#1" + "role_id#1", + "validity#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%2#0", - "config#0" + "validity#0" ] }, - "349": { + "391": { "op": "box_put", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "350": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" + "392": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "353": { + "395": { "block": "rbac_assign_role_after_if_else@7", "stack_in": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ], "op": "dup", @@ -1542,12 +1575,12 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1" ] }, - "354": { + "396": { "op": "pushint 60", "defined_out": [ "60", @@ -1555,62 +1588,62 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1", "60" ] }, - "356": { + "398": { "op": "==", "defined_out": [ "role_id#1", - "tmp%5#0" + "tmp%5#1" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "tmp%5#0" + "tmp%5#1" ] }, - "357": { + "399": { "op": "bz rbac_assign_role_after_if_else@9", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "360": { - "op": "bytec 5 // 0x52363023", + "402": { + "op": "bytec_2 // 0x523a54525323", "defined_out": [ - "0x52363023", + "0x523a54525323", "role_id#1" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "0x52363023" + "0x523a54525323" ] }, - "362": { + "403": { "op": "dig 3", "defined_out": [ - "0x52363023", + "0x523a54525323", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "0x52363023", + "0x523a54525323", "role_address#0" ] }, - "364": { + "405": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -1619,12 +1652,12 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%4#0" ] }, - "365": { + "406": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -1634,13 +1667,13 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%4#0", "box_prefixed_key%4#0 (copy)" ] }, - "366": { + "407": { "op": "box_len", "defined_out": [ "_%2#0", @@ -1651,24 +1684,24 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%4#0", "_%2#0", "maybe_exists%2#0" ] }, - "367": { + "408": { "op": "bury 1", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%4#0", "maybe_exists%2#0" ] }, - "369": { + "410": { "op": "!", "defined_out": [ "box_prefixed_key%4#0", @@ -1678,54 +1711,54 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%4#0", "tmp%6#1" ] }, - "370": { + "411": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%4#0" ] }, - "371": { + "412": { "op": "dig 2", "defined_out": [ "box_prefixed_key%4#0", - "config#0", "role_address#0", - "role_id#1" + "role_id#1", + "validity#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%4#0", - "config#0" + "validity#0" ] }, - "373": { + "414": { "op": "box_put", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "374": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" + "415": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "377": { + "418": { "block": "rbac_assign_role_after_if_else@9", "stack_in": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ], "op": "dup", @@ -1734,12 +1767,12 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1" ] }, - "378": { + "419": { "op": "pushint 70", "defined_out": [ "70", @@ -1747,62 +1780,62 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1", "70" ] }, - "380": { + "421": { "op": "==", "defined_out": [ "role_id#1", - "tmp%7#1" + "tmp%7#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "tmp%7#1" + "tmp%7#0" ] }, - "381": { + "422": { "op": "bz rbac_assign_role_after_if_else@11", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "384": { - "op": "bytec_2 // 0x52373023", + "425": { + "op": "bytec_3 // 0x523a41555423", "defined_out": [ - "0x52373023", + "0x523a41555423", "role_id#1" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "0x52373023" + "0x523a41555423" ] }, - "385": { + "426": { "op": "dig 3", "defined_out": [ - "0x52373023", + "0x523a41555423", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "0x52373023", + "0x523a41555423", "role_address#0" ] }, - "387": { + "428": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -1811,12 +1844,12 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%6#0" ] }, - "388": { + "429": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -1826,13 +1859,13 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%6#0", "box_prefixed_key%6#0 (copy)" ] }, - "389": { + "430": { "op": "box_len", "defined_out": [ "_%3#0", @@ -1843,24 +1876,24 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%6#0", "_%3#0", "maybe_exists%3#0" ] }, - "390": { + "431": { "op": "bury 1", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%6#0", "maybe_exists%3#0" ] }, - "392": { + "433": { "op": "!", "defined_out": [ "box_prefixed_key%6#0", @@ -1870,54 +1903,54 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%6#0", "tmp%8#0" ] }, - "393": { + "434": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%6#0" ] }, - "394": { + "435": { "op": "dig 2", "defined_out": [ "box_prefixed_key%6#0", - "config#0", "role_address#0", - "role_id#1" + "role_id#1", + "validity#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%6#0", - "config#0" + "validity#0" ] }, - "396": { + "437": { "op": "box_put", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "397": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" + "438": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "400": { + "441": { "block": "rbac_assign_role_after_if_else@11", "stack_in": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ], "op": "dup", @@ -1926,12 +1959,12 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1" ] }, - "401": { + "442": { "op": "pushint 80", "defined_out": [ "80", @@ -1939,13 +1972,13 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "role_id#1", "80" ] }, - "403": { + "444": { "op": "==", "defined_out": [ "role_id#1", @@ -1953,48 +1986,48 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "tmp%9#0" ] }, - "404": { - "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", + "445": { + "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "407": { - "op": "bytec 6 // 0x52383023", + "448": { + "op": "bytec 6 // 0x523a4d4f4323", "defined_out": [ - "0x52383023", + "0x523a4d4f4323", "role_id#1" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "0x52383023" + "0x523a4d4f4323" ] }, - "409": { + "450": { "op": "dig 3", "defined_out": [ - "0x52383023", + "0x523a4d4f4323", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", - "0x52383023", + "0x523a4d4f4323", "role_address#0" ] }, - "411": { + "452": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -2003,12 +2036,12 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%8#0" ] }, - "412": { + "453": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -2018,13 +2051,13 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%8#0", "box_prefixed_key%8#0 (copy)" ] }, - "413": { + "454": { "op": "box_len", "defined_out": [ "_%4#0", @@ -2035,24 +2068,24 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%8#0", "_%4#0", "maybe_exists%4#0" ] }, - "414": { + "455": { "op": "bury 1", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%8#0", "maybe_exists%4#0" ] }, - "416": { + "457": { "op": "!", "defined_out": [ "box_prefixed_key%8#0", @@ -2062,50 +2095,50 @@ ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%8#0", "tmp%10#0" ] }, - "417": { + "458": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%8#0" ] }, - "418": { + "459": { "op": "dig 2", "defined_out": [ "box_prefixed_key%8#0", - "config#0", "role_address#0", - "role_id#1" + "role_id#1", + "validity#0" ], "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1", "box_prefixed_key%8#0", - "config#0" + "validity#0" ] }, - "420": { + "461": { "op": "box_put", "stack_out": [ "role_address#0", - "config#0", + "validity#0", "role_id#1" ] }, - "421": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" + "462": { + "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14" }, - "424": { + "465": { "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", "params": {}, "block": "rbac_revoke_role", @@ -2118,7 +2151,7 @@ "role_id#0" ] }, - "427": { + "468": { "op": "dup", "defined_out": [ "role_id#0", @@ -2129,7 +2162,7 @@ "role_id#0 (copy)" ] }, - "428": { + "469": { "op": "len", "defined_out": [ "len%0#0", @@ -2140,7 +2173,7 @@ "len%0#0" ] }, - "429": { + "470": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -2153,7 +2186,7 @@ "1" ] }, - "430": { + "471": { "op": "==", "defined_out": [ "eq%0#0", @@ -2164,17 +2197,17 @@ "eq%0#0" ] }, - "431": { + "472": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "432": { + "473": { "op": "txna ApplicationArgs 2" }, - "435": { + "476": { "op": "dup", "defined_out": [ "role_address#0", @@ -2186,7 +2219,7 @@ "role_address#0" ] }, - "436": { + "477": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -2198,7 +2231,7 @@ "role_address#0" ] }, - "438": { + "479": { "op": "len", "defined_out": [ "len%1#0", @@ -2211,7 +2244,7 @@ "len%1#0" ] }, - "439": { + "480": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -2226,7 +2259,7 @@ "32" ] }, - "440": { + "481": { "op": "==", "defined_out": [ "eq%1#0", @@ -2239,7 +2272,7 @@ "eq%1#0" ] }, - "441": { + "482": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -2247,15 +2280,15 @@ "role_id#0" ] }, - "442": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" + "483": { + "callsub": "modules.rbac.RbacModule._assert_caller_is_arranger", + "op": "callsub _assert_caller_is_arranger" }, - "445": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" + "486": { + "callsub": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", + "op": "callsub _assert_is_not_contract_defaulted" }, - "448": { + "489": { "op": "btoi", "defined_out": [ "role_address#0", @@ -2266,7 +2299,7 @@ "role_id#1" ] }, - "449": { + "490": { "op": "dupn 2", "defined_out": [ "role_address#0", @@ -2280,7 +2313,7 @@ "role_id#1 (copy)" ] }, - "451": { + "492": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -2289,7 +2322,7 @@ "role_id#1" ] }, - "454": { + "495": { "op": "dup", "stack_out": [ "role_address#0", @@ -2298,7 +2331,7 @@ "role_id#1 (copy)" ] }, - "455": { + "496": { "op": "intc_3 // 20", "defined_out": [ "20", @@ -2314,7 +2347,7 @@ "20" ] }, - "456": { + "497": { "op": "!=", "defined_out": [ "role_address#0", @@ -2328,7 +2361,7 @@ "tmp%0#2" ] }, - "457": { + "498": { "error": "Invalid role identifier", "op": "assert // Invalid role identifier", "stack_out": [ @@ -2337,7 +2370,7 @@ "role_id#1" ] }, - "458": { + "499": { "op": "pushint 40", "defined_out": [ "40", @@ -2351,7 +2384,7 @@ "40" ] }, - "460": { + "501": { "op": "==", "defined_out": [ "role_address#0", @@ -2364,36 +2397,36 @@ "tmp%1#1" ] }, - "461": { + "502": { "op": "bz rbac_revoke_role_after_if_else@3", "stack_out": [ "role_address#0", "role_id#1" ] }, - "464": { - "op": "bytec_3 // 0x52343023", + "505": { + "op": "bytec 4 // 0x523a4d4e4723", "defined_out": [ - "0x52343023", + "0x523a4d4e4723", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52343023" + "0x523a4d4e4723" ] }, - "465": { + "507": { "op": "dig 2", "stack_out": [ "role_address#0", "role_id#1", - "0x52343023", + "0x523a4d4e4723", "role_address#0" ] }, - "467": { + "509": { "op": "concat", "defined_out": [ "box_prefixed_key%0#0", @@ -2406,7 +2439,7 @@ "box_prefixed_key%0#0" ] }, - "468": { + "510": { "op": "dup", "defined_out": [ "box_prefixed_key%0#0", @@ -2421,7 +2454,7 @@ "box_prefixed_key%0#0 (copy)" ] }, - "469": { + "511": { "op": "box_len", "defined_out": [ "_%0#0", @@ -2438,7 +2471,7 @@ "maybe_exists%0#0" ] }, - "470": { + "512": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -2447,7 +2480,7 @@ "maybe_exists%0#0" ] }, - "472": { + "514": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -2456,7 +2489,7 @@ "box_prefixed_key%0#0" ] }, - "473": { + "515": { "op": "box_del", "defined_out": [ "role_address#0", @@ -2469,14 +2502,14 @@ "{box_del}" ] }, - "474": { + "516": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "475": { + "517": { "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_in": [ "role_address#0", @@ -2492,7 +2525,7 @@ "tmp%2#1" ] }, - "477": { + "519": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -2503,7 +2536,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "478": { + "520": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -2516,7 +2549,7 @@ "0x151f7c75" ] }, - "479": { + "521": { "op": "swap", "stack_out": [ "role_address#0", @@ -2525,7 +2558,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "480": { + "522": { "op": "concat", "defined_out": [ "tmp%5#0" @@ -2536,14 +2569,14 @@ "tmp%5#0" ] }, - "481": { + "523": { "op": "log", "stack_out": [ "role_address#0", "role_id#1" ] }, - "482": { + "524": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -2554,14 +2587,14 @@ "1" ] }, - "483": { + "525": { "op": "return", "stack_out": [ "role_address#0", "role_id#1" ] }, - "484": { + "526": { "block": "rbac_revoke_role_after_if_else@3", "stack_in": [ "role_address#0", @@ -2577,7 +2610,7 @@ "role_id#1" ] }, - "485": { + "527": { "op": "pushint 50", "defined_out": [ "50", @@ -2590,7 +2623,7 @@ "50" ] }, - "487": { + "529": { "op": "==", "defined_out": [ "role_id#1", @@ -2602,40 +2635,40 @@ "tmp%2#2" ] }, - "488": { + "530": { "op": "bz rbac_revoke_role_after_if_else@5", "stack_out": [ "role_address#0", "role_id#1" ] }, - "491": { - "op": "bytec 4 // 0x52353023", + "533": { + "op": "bytec 5 // 0x523a50594423", "defined_out": [ - "0x52353023", + "0x523a50594423", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52353023" + "0x523a50594423" ] }, - "493": { + "535": { "op": "dig 2", "defined_out": [ - "0x52353023", + "0x523a50594423", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52353023", + "0x523a50594423", "role_address#0" ] }, - "495": { + "537": { "op": "concat", "defined_out": [ "box_prefixed_key%2#0", @@ -2648,7 +2681,7 @@ "box_prefixed_key%2#0" ] }, - "496": { + "538": { "op": "dup", "defined_out": [ "box_prefixed_key%2#0", @@ -2663,7 +2696,7 @@ "box_prefixed_key%2#0 (copy)" ] }, - "497": { + "539": { "op": "box_len", "defined_out": [ "_%1#0", @@ -2680,7 +2713,7 @@ "maybe_exists%1#0" ] }, - "498": { + "540": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -2689,7 +2722,7 @@ "maybe_exists%1#0" ] }, - "500": { + "542": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -2698,7 +2731,7 @@ "box_prefixed_key%2#0" ] }, - "501": { + "543": { "op": "box_del", "defined_out": [ "role_address#0", @@ -2711,17 +2744,17 @@ "{box_del}" ] }, - "502": { + "544": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "503": { + "545": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "506": { + "548": { "block": "rbac_revoke_role_after_if_else@5", "stack_in": [ "role_address#0", @@ -2737,7 +2770,7 @@ "role_id#1" ] }, - "507": { + "549": { "op": "pushint 60", "defined_out": [ "60", @@ -2750,7 +2783,7 @@ "60" ] }, - "509": { + "551": { "op": "==", "defined_out": [ "role_id#1", @@ -2762,40 +2795,40 @@ "tmp%3#0" ] }, - "510": { + "552": { "op": "bz rbac_revoke_role_after_if_else@7", "stack_out": [ "role_address#0", "role_id#1" ] }, - "513": { - "op": "bytec 5 // 0x52363023", + "555": { + "op": "bytec_2 // 0x523a54525323", "defined_out": [ - "0x52363023", + "0x523a54525323", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52363023" + "0x523a54525323" ] }, - "515": { + "556": { "op": "dig 2", "defined_out": [ - "0x52363023", + "0x523a54525323", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52363023", + "0x523a54525323", "role_address#0" ] }, - "517": { + "558": { "op": "concat", "defined_out": [ "box_prefixed_key%4#0", @@ -2808,7 +2841,7 @@ "box_prefixed_key%4#0" ] }, - "518": { + "559": { "op": "dup", "defined_out": [ "box_prefixed_key%4#0", @@ -2823,7 +2856,7 @@ "box_prefixed_key%4#0 (copy)" ] }, - "519": { + "560": { "op": "box_len", "defined_out": [ "_%2#0", @@ -2840,7 +2873,7 @@ "maybe_exists%2#0" ] }, - "520": { + "561": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -2849,7 +2882,7 @@ "maybe_exists%2#0" ] }, - "522": { + "563": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -2858,7 +2891,7 @@ "box_prefixed_key%4#0" ] }, - "523": { + "564": { "op": "box_del", "defined_out": [ "role_address#0", @@ -2871,17 +2904,17 @@ "{box_del}" ] }, - "524": { + "565": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "525": { + "566": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "528": { + "569": { "block": "rbac_revoke_role_after_if_else@7", "stack_in": [ "role_address#0", @@ -2897,7 +2930,7 @@ "role_id#1" ] }, - "529": { + "570": { "op": "pushint 70", "defined_out": [ "70", @@ -2910,7 +2943,7 @@ "70" ] }, - "531": { + "572": { "op": "==", "defined_out": [ "role_id#1", @@ -2922,40 +2955,40 @@ "tmp%4#1" ] }, - "532": { + "573": { "op": "bz rbac_revoke_role_after_if_else@9", "stack_out": [ "role_address#0", "role_id#1" ] }, - "535": { - "op": "bytec_2 // 0x52373023", + "576": { + "op": "bytec_3 // 0x523a41555423", "defined_out": [ - "0x52373023", + "0x523a41555423", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52373023" + "0x523a41555423" ] }, - "536": { + "577": { "op": "dig 2", "defined_out": [ - "0x52373023", + "0x523a41555423", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52373023", + "0x523a41555423", "role_address#0" ] }, - "538": { + "579": { "op": "concat", "defined_out": [ "box_prefixed_key%6#0", @@ -2968,7 +3001,7 @@ "box_prefixed_key%6#0" ] }, - "539": { + "580": { "op": "dup", "defined_out": [ "box_prefixed_key%6#0", @@ -2983,7 +3016,7 @@ "box_prefixed_key%6#0 (copy)" ] }, - "540": { + "581": { "op": "box_len", "defined_out": [ "_%3#0", @@ -3000,7 +3033,7 @@ "maybe_exists%3#0" ] }, - "541": { + "582": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -3009,7 +3042,7 @@ "maybe_exists%3#0" ] }, - "543": { + "584": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -3018,7 +3051,7 @@ "box_prefixed_key%6#0" ] }, - "544": { + "585": { "op": "box_del", "defined_out": [ "role_address#0", @@ -3031,17 +3064,17 @@ "{box_del}" ] }, - "545": { + "586": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "546": { + "587": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "549": { + "590": { "block": "rbac_revoke_role_after_if_else@9", "stack_in": [ "role_address#0", @@ -3057,7 +3090,7 @@ "role_id#1" ] }, - "550": { + "591": { "op": "pushint 80", "defined_out": [ "80", @@ -3070,7 +3103,7 @@ "80" ] }, - "552": { + "593": { "op": "==", "defined_out": [ "role_id#1", @@ -3082,40 +3115,40 @@ "tmp%5#1" ] }, - "553": { + "594": { "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", "stack_out": [ "role_address#0", "role_id#1" ] }, - "556": { - "op": "bytec 6 // 0x52383023", + "597": { + "op": "bytec 6 // 0x523a4d4f4323", "defined_out": [ - "0x52383023", + "0x523a4d4f4323", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52383023" + "0x523a4d4f4323" ] }, - "558": { + "599": { "op": "dig 2", "defined_out": [ - "0x52383023", + "0x523a4d4f4323", "role_address#0", "role_id#1" ], "stack_out": [ "role_address#0", "role_id#1", - "0x52383023", + "0x523a4d4f4323", "role_address#0" ] }, - "560": { + "601": { "op": "concat", "defined_out": [ "box_prefixed_key%8#0", @@ -3128,7 +3161,7 @@ "box_prefixed_key%8#0" ] }, - "561": { + "602": { "op": "dup", "defined_out": [ "box_prefixed_key%8#0", @@ -3143,7 +3176,7 @@ "box_prefixed_key%8#0 (copy)" ] }, - "562": { + "603": { "op": "box_len", "defined_out": [ "_%4#0", @@ -3160,7 +3193,7 @@ "maybe_exists%4#0" ] }, - "563": { + "604": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -3169,7 +3202,7 @@ "maybe_exists%4#0" ] }, - "565": { + "606": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -3178,7 +3211,7 @@ "box_prefixed_key%8#0" ] }, - "566": { + "607": { "op": "box_del", "defined_out": [ "role_address#0", @@ -3191,20 +3224,20 @@ "{box_del}" ] }, - "567": { + "608": { "op": "pop", "stack_out": [ "role_address#0", "role_id#1" ] }, - "568": { + "609": { "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" }, - "571": { - "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", + "612": { + "subroutine": "modules.rbac.RbacModule.rbac_contract_suspension[routing]", "params": {}, - "block": "rbac_gov_asset_suspension", + "block": "rbac_contract_suspension", "stack_in": [], "op": "txna ApplicationArgs 1", "defined_out": [ @@ -3214,7 +3247,7 @@ "tmp%0#0" ] }, - "574": { + "615": { "op": "dup", "defined_out": [ "tmp%0#0", @@ -3225,7 +3258,7 @@ "tmp%0#0 (copy)" ] }, - "575": { + "616": { "op": "len", "defined_out": [ "len%0#0", @@ -3236,7 +3269,7 @@ "len%0#0" ] }, - "576": { + "617": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -3249,7 +3282,7 @@ "1" ] }, - "577": { + "618": { "op": "==", "defined_out": [ "eq%0#0", @@ -3260,14 +3293,14 @@ "eq%0#0" ] }, - "578": { + "619": { "error": "invalid number of bytes for arc4.bool", "op": "assert // invalid number of bytes for arc4.bool", "stack_out": [ "tmp%0#0" ] }, - "579": { + "620": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -3278,7 +3311,7 @@ "0" ] }, - "580": { + "621": { "op": "getbit", "defined_out": [ "suspended#0" @@ -3287,31 +3320,31 @@ "suspended#0" ] }, - "581": { - "op": "bytec_2 // 0x52373023", + "622": { + "op": "bytec_3 // 0x523a41555423", "defined_out": [ - "0x52373023", + "0x523a41555423", "suspended#0" ], "stack_out": [ "suspended#0", - "0x52373023" + "0x523a41555423" ] }, - "582": { + "623": { "op": "txn Sender", "defined_out": [ - "0x52373023", + "0x523a41555423", "suspended#0", "tmp%0#2" ], "stack_out": [ "suspended#0", - "0x52373023", + "0x523a41555423", "tmp%0#2" ] }, - "584": { + "625": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3323,36 +3356,36 @@ "tmp%1#0" ] }, - "587": { + "628": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [ "suspended#0" ] }, - "588": { - "op": "bytec 8 // \"asset_suspended\"", + "629": { + "op": "bytec 9 // \"contract_suspended\"", "defined_out": [ - "\"asset_suspended\"", + "\"contract_suspended\"", "suspended#0" ], "stack_out": [ "suspended#0", - "\"asset_suspended\"" + "\"contract_suspended\"" ] }, - "590": { + "631": { "op": "swap", "stack_out": [ - "\"asset_suspended\"", + "\"contract_suspended\"", "suspended#0" ] }, - "591": { + "632": { "op": "app_global_put", "stack_out": [] }, - "592": { + "633": { "op": "global LatestTimestamp", "defined_out": [ "tmp%0#1" @@ -3361,7 +3394,7 @@ "tmp%0#1" ] }, - "594": { + "635": { "op": "itob", "defined_out": [ "aggregate%val_as_bytes%0#0" @@ -3370,7 +3403,7 @@ "aggregate%val_as_bytes%0#0" ] }, - "595": { + "636": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -3381,14 +3414,14 @@ "0x151f7c75" ] }, - "596": { + "637": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%val_as_bytes%0#0" ] }, - "597": { + "638": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -3397,21 +3430,231 @@ "tmp%4#0" ] }, - "598": { + "639": { "op": "log", "stack_out": [] }, - "599": { + "640": { "op": "intc_0 // 1", "stack_out": [ "1" ] }, - "600": { + "641": { "op": "return", "stack_out": [] }, - "601": { + "642": { + "subroutine": "modules.rbac.RbacModule.rbac_contract_default[routing]", + "params": {}, + "block": "rbac_contract_default", + "stack_in": [], + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "645": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ], + "stack_out": [ + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "646": { + "op": "len", + "defined_out": [ + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0" + ] + }, + "647": { + "op": "intc_0 // 1", + "defined_out": [ + "1", + "len%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "len%0#0", + "1" + ] + }, + "648": { + "op": "==", + "defined_out": [ + "eq%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "eq%0#0" + ] + }, + "649": { + "error": "invalid number of bytes for arc4.bool", + "op": "assert // invalid number of bytes for arc4.bool", + "stack_out": [ + "tmp%0#0" + ] + }, + "650": { + "op": "intc_1 // 0", + "defined_out": [ + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0" + ] + }, + "651": { + "op": "getbit", + "defined_out": [ + "defaulted#0" + ], + "stack_out": [ + "defaulted#0" + ] + }, + "652": { + "op": "bytec_2 // 0x523a54525323", + "defined_out": [ + "0x523a54525323", + "defaulted#0" + ], + "stack_out": [ + "defaulted#0", + "0x523a54525323" + ] + }, + "653": { + "op": "txn Sender", + "defined_out": [ + "0x523a54525323", + "defaulted#0", + "tmp%0#2" + ], + "stack_out": [ + "defaulted#0", + "0x523a54525323", + "tmp%0#2" + ] + }, + "655": { + "callsub": "modules.rbac.RbacModule._role_is_active", + "op": "callsub _role_is_active", + "defined_out": [ + "defaulted#0", + "tmp%1#0" + ], + "stack_out": [ + "defaulted#0", + "tmp%1#0" + ] + }, + "658": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "defaulted#0" + ] + }, + "659": { + "op": "bytec 7 // \"defaulted\"", + "defined_out": [ + "\"defaulted\"", + "defaulted#0" + ], + "stack_out": [ + "defaulted#0", + "\"defaulted\"" + ] + }, + "661": { + "op": "swap", + "stack_out": [ + "\"defaulted\"", + "defaulted#0" + ] + }, + "662": { + "op": "app_global_put", + "stack_out": [] + }, + "663": { + "op": "global LatestTimestamp", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "665": { + "op": "itob", + "defined_out": [ + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0" + ] + }, + "666": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ], + "stack_out": [ + "aggregate%val_as_bytes%0#0", + "0x151f7c75" + ] + }, + "667": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "aggregate%val_as_bytes%0#0" + ] + }, + "668": { + "op": "concat", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "669": { + "op": "log", + "stack_out": [] + }, + "670": { + "op": "intc_0 // 1", + "stack_out": [ + "1" + ] + }, + "671": { + "op": "return", + "stack_out": [] + }, + "672": { "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", "params": {}, "block": "rbac_get_arranger", @@ -3424,18 +3667,18 @@ "0" ] }, - "602": { - "op": "bytec_1 // 0x52323023", + "673": { + "op": "bytec_1 // 0x523a41525223", "defined_out": [ "0", - "0x52323023" + "0x523a41525223" ], "stack_out": [ "0", - "0x52323023" + "0x523a41525223" ] }, - "603": { + "674": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -3446,14 +3689,14 @@ "maybe_exists%0#0" ] }, - "604": { + "675": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ "maybe_value%0#0" ] }, - "605": { + "676": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -3464,14 +3707,14 @@ "0x151f7c75" ] }, - "606": { + "677": { "op": "swap", "stack_out": [ "0x151f7c75", "maybe_value%0#0" ] }, - "607": { + "678": { "op": "concat", "defined_out": [ "tmp%2#0" @@ -3480,11 +3723,11 @@ "tmp%2#0" ] }, - "608": { + "679": { "op": "log", "stack_out": [] }, - "609": { + "680": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -3493,11 +3736,11 @@ "1" ] }, - "610": { + "681": { "op": "return", "stack_out": [] }, - "611": { + "682": { "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", "params": {}, "block": "rbac_get_address_roles", @@ -3510,7 +3753,7 @@ "address#0" ] }, - "614": { + "685": { "op": "dup", "defined_out": [ "address#0", @@ -3521,7 +3764,7 @@ "address#0 (copy)" ] }, - "615": { + "686": { "op": "len", "defined_out": [ "address#0", @@ -3532,7 +3775,7 @@ "len%0#0" ] }, - "616": { + "687": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -3545,7 +3788,7 @@ "32" ] }, - "617": { + "688": { "op": "==", "defined_out": [ "address#0", @@ -3556,33 +3799,33 @@ "eq%0#0" ] }, - "618": { + "689": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ "address#0" ] }, - "619": { - "op": "bytec_3 // 0x52343023", + "690": { + "op": "bytec 4 // 0x523a4d4e4723", "defined_out": [ - "0x52343023", + "0x523a4d4e4723", "address#0" ], "stack_out": [ "address#0", - "0x52343023" + "0x523a4d4e4723" ] }, - "620": { + "692": { "op": "dig 1", "stack_out": [ "address#0", - "0x52343023", + "0x523a4d4e4723", "address#0 (copy)" ] }, - "622": { + "694": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3594,29 +3837,29 @@ "tmp%0#1" ] }, - "625": { - "op": "bytec 4 // 0x52353023", + "697": { + "op": "bytec 5 // 0x523a50594423", "defined_out": [ - "0x52353023", + "0x523a50594423", "address#0", "tmp%0#1" ], "stack_out": [ "address#0", "tmp%0#1", - "0x52353023" + "0x523a50594423" ] }, - "627": { + "699": { "op": "dig 2", "stack_out": [ "address#0", "tmp%0#1", - "0x52353023", + "0x523a50594423", "address#0 (copy)" ] }, - "629": { + "701": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3630,10 +3873,10 @@ "tmp%1#1" ] }, - "632": { - "op": "bytec 5 // 0x52363023", + "704": { + "op": "bytec_2 // 0x523a54525323", "defined_out": [ - "0x52363023", + "0x523a54525323", "address#0", "tmp%0#1", "tmp%1#1" @@ -3642,20 +3885,20 @@ "address#0", "tmp%0#1", "tmp%1#1", - "0x52363023" + "0x523a54525323" ] }, - "634": { + "705": { "op": "dig 3", "stack_out": [ "address#0", "tmp%0#1", "tmp%1#1", - "0x52363023", + "0x523a54525323", "address#0 (copy)" ] }, - "636": { + "707": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3671,10 +3914,10 @@ "tmp%2#1" ] }, - "639": { - "op": "bytec_2 // 0x52373023", + "710": { + "op": "bytec_3 // 0x523a41555423", "defined_out": [ - "0x52373023", + "0x523a41555423", "address#0", "tmp%0#1", "tmp%1#1", @@ -3685,21 +3928,21 @@ "tmp%0#1", "tmp%1#1", "tmp%2#1", - "0x52373023" + "0x523a41555423" ] }, - "640": { + "711": { "op": "dig 4", "stack_out": [ "address#0", "tmp%0#1", "tmp%1#1", "tmp%2#1", - "0x52373023", + "0x523a41555423", "address#0 (copy)" ] }, - "642": { + "713": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3717,10 +3960,10 @@ "tmp%3#1" ] }, - "645": { - "op": "bytec 6 // 0x52383023", + "716": { + "op": "bytec 6 // 0x523a4d4f4323", "defined_out": [ - "0x52383023", + "0x523a4d4f4323", "address#0", "tmp%0#1", "tmp%1#1", @@ -3733,21 +3976,21 @@ "tmp%1#1", "tmp%2#1", "tmp%3#1", - "0x52383023" + "0x523a4d4f4323" ] }, - "647": { + "718": { "op": "uncover 5", "stack_out": [ "tmp%0#1", "tmp%1#1", "tmp%2#1", "tmp%3#1", - "0x52383023", + "0x523a4d4f4323", "address#0" ] }, - "649": { + "720": { "callsub": "modules.rbac.RbacModule._role_is_active", "op": "callsub _role_is_active", "defined_out": [ @@ -3765,7 +4008,7 @@ "tmp%4#1" ] }, - "652": { + "723": { "op": "pushbytes 0x00", "defined_out": [ "0x00", @@ -3784,7 +4027,7 @@ "0x00" ] }, - "655": { + "726": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -3805,7 +4048,7 @@ "0" ] }, - "656": { + "727": { "op": "uncover 6", "stack_out": [ "tmp%1#1", @@ -3817,7 +4060,7 @@ "tmp%0#1" ] }, - "658": { + "729": { "op": "setbit", "defined_out": [ "aggregate%encoded_bool%0#0", @@ -3834,7 +4077,7 @@ "aggregate%encoded_bool%0#0" ] }, - "659": { + "730": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -3853,7 +4096,7 @@ "1" ] }, - "660": { + "731": { "op": "uncover 5", "stack_out": [ "tmp%2#1", @@ -3864,7 +4107,7 @@ "tmp%1#1" ] }, - "662": { + "733": { "op": "setbit", "defined_out": [ "aggregate%set_bit%0#0", @@ -3879,7 +4122,7 @@ "aggregate%set_bit%0#0" ] }, - "663": { + "734": { "op": "pushint 2", "defined_out": [ "2", @@ -3896,7 +4139,7 @@ "2" ] }, - "665": { + "736": { "op": "uncover 4", "stack_out": [ "tmp%3#1", @@ -3906,7 +4149,7 @@ "tmp%2#1" ] }, - "667": { + "738": { "op": "setbit", "defined_out": [ "aggregate%set_bit%1#0", @@ -3919,7 +4162,7 @@ "aggregate%set_bit%1#0" ] }, - "668": { + "739": { "op": "pushint 3", "defined_out": [ "3", @@ -3934,7 +4177,7 @@ "3" ] }, - "670": { + "741": { "op": "uncover 3", "stack_out": [ "tmp%4#1", @@ -3943,7 +4186,7 @@ "tmp%3#1" ] }, - "672": { + "743": { "op": "setbit", "defined_out": [ "aggregate%set_bit%2#0", @@ -3954,7 +4197,7 @@ "aggregate%set_bit%2#0" ] }, - "673": { + "744": { "op": "pushint 4", "defined_out": [ "4", @@ -3967,7 +4210,7 @@ "4" ] }, - "675": { + "746": { "op": "uncover 2", "stack_out": [ "aggregate%set_bit%2#0", @@ -3975,7 +4218,7 @@ "tmp%4#1" ] }, - "677": { + "748": { "op": "setbit", "defined_out": [ "aggregate%set_bit%3#0" @@ -3984,7 +4227,7 @@ "aggregate%set_bit%3#0" ] }, - "678": { + "749": { "op": "bytec_0 // 0x151f7c75", "defined_out": [ "0x151f7c75", @@ -3995,14 +4238,14 @@ "0x151f7c75" ] }, - "679": { + "750": { "op": "swap", "stack_out": [ "0x151f7c75", "aggregate%set_bit%3#0" ] }, - "680": { + "751": { "op": "concat", "defined_out": [ "tmp%8#0" @@ -4011,24 +4254,24 @@ "tmp%8#0" ] }, - "681": { + "752": { "op": "log", "stack_out": [] }, - "682": { + "753": { "op": "intc_0 // 1", "stack_out": [ "1" ] }, - "683": { + "754": { "op": "return", "stack_out": [] }, - "684": { - "subroutine": "modules.rbac.RbacModule.rbac_get_role_config[routing]", + "755": { + "subroutine": "modules.rbac.RbacModule.rbac_get_role_validity[routing]", "params": {}, - "block": "rbac_get_role_config", + "block": "rbac_get_role_validity", "stack_in": [], "op": "txna ApplicationArgs 1", "defined_out": [ @@ -4038,7 +4281,7 @@ "role_id#0" ] }, - "687": { + "758": { "op": "dup", "defined_out": [ "role_id#0", @@ -4049,7 +4292,7 @@ "role_id#0 (copy)" ] }, - "688": { + "759": { "op": "len", "defined_out": [ "len%0#0", @@ -4060,7 +4303,7 @@ "len%0#0" ] }, - "689": { + "760": { "op": "intc_0 // 1", "defined_out": [ "1", @@ -4073,7 +4316,7 @@ "1" ] }, - "690": { + "761": { "op": "==", "defined_out": [ "eq%0#0", @@ -4084,17 +4327,17 @@ "eq%0#0" ] }, - "691": { + "762": { "error": "invalid number of bytes for arc4.uint8", "op": "assert // invalid number of bytes for arc4.uint8", "stack_out": [ "role_id#0" ] }, - "692": { + "763": { "op": "txna ApplicationArgs 2" }, - "695": { + "766": { "op": "dup", "defined_out": [ "role_address#0", @@ -4106,7 +4349,7 @@ "role_address#0" ] }, - "696": { + "767": { "op": "cover 2", "defined_out": [ "role_address#0", @@ -4118,7 +4361,7 @@ "role_address#0" ] }, - "698": { + "769": { "op": "len", "defined_out": [ "len%1#0", @@ -4131,7 +4374,7 @@ "len%1#0" ] }, - "699": { + "770": { "op": "intc_2 // 32", "defined_out": [ "32", @@ -4146,7 +4389,7 @@ "32" ] }, - "700": { + "771": { "op": "==", "defined_out": [ "eq%1#0", @@ -4159,7 +4402,7 @@ "eq%1#0" ] }, - "701": { + "772": { "error": "invalid number of bytes for arc4.static_array", "op": "assert // invalid number of bytes for arc4.static_array", "stack_out": [ @@ -4167,7 +4410,7 @@ "role_id#0" ] }, - "702": { + "773": { "op": "btoi", "defined_out": [ "role#0", @@ -4178,7 +4421,7 @@ "role#0" ] }, - "703": { + "774": { "op": "dup", "defined_out": [ "role#0", @@ -4191,7 +4434,7 @@ "role#0 (copy)" ] }, - "704": { + "775": { "callsub": "modules.rbac.RbacModule._assert_valid_role", "op": "callsub _assert_valid_role", "stack_out": [ @@ -4199,7 +4442,7 @@ "role#0" ] }, - "707": { + "778": { "op": "intc_3 // 20", "defined_out": [ "20", @@ -4212,7 +4455,7 @@ "20" ] }, - "708": { + "779": { "op": "pushints 40 50 60 70 80", "defined_out": [ "20", @@ -4235,7 +4478,7 @@ "80" ] }, - "715": { + "786": { "op": "uncover 6", "stack_out": [ "role_address#0", @@ -4248,43 +4491,43 @@ "role#0" ] }, - "717": { - "op": "match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7", + "788": { + "op": "match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7", "stack_out": [ "role_address#0" ] }, - "731": { + "802": { "error": "Invalid role identifier", "op": "err // Invalid role identifier" }, - "732": { - "block": "rbac_get_role_config_switch_case_5@7", + "803": { + "block": "rbac_get_role_validity_switch_case_5@7", "stack_in": [ "role_address#0" ], - "op": "bytec 6 // 0x52383023", + "op": "bytec 6 // 0x523a4d4f4323", "defined_out": [ - "0x52383023" + "0x523a4d4f4323" ], "stack_out": [ "role_address#0", - "0x52383023" + "0x523a4d4f4323" ] }, - "734": { + "805": { "op": "dig 1", "defined_out": [ - "0x52383023", + "0x523a4d4f4323", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52383023", + "0x523a4d4f4323", "role_address#0" ] }, - "736": { + "807": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4295,7 +4538,7 @@ "box_prefixed_key%0#1" ] }, - "737": { + "808": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4308,7 +4551,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "738": { + "809": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4323,7 +4566,7 @@ "maybe_exists%0#0" ] }, - "739": { + "810": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4331,7 +4574,7 @@ "maybe_exists%0#0" ] }, - "741": { + "812": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4339,7 +4582,7 @@ "box_prefixed_key%0#1" ] }, - "742": { + "813": { "op": "box_get", "defined_out": [ "aggregate%box_get%8#0", @@ -4352,7 +4595,7 @@ "aggregate%box_get%9#0" ] }, - "743": { + "814": { "op": "pop", "defined_out": [ "role_address#0", @@ -4363,8 +4606,8 @@ "tmp%3#0" ] }, - "744": { - "block": "rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9", + "815": { + "block": "rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9", "stack_in": [ "role_address#0", "tmp%3#0" @@ -4379,7 +4622,7 @@ "0x151f7c75" ] }, - "745": { + "816": { "op": "swap", "defined_out": [ "0x151f7c75", @@ -4391,7 +4634,7 @@ "tmp%3#0" ] }, - "746": { + "817": { "op": "concat", "defined_out": [ "tmp%4#0" @@ -4401,13 +4644,13 @@ "tmp%4#0" ] }, - "747": { + "818": { "op": "log", "stack_out": [ "role_address#0" ] }, - "748": { + "819": { "op": "intc_0 // 1", "defined_out": [ "1" @@ -4417,39 +4660,39 @@ "1" ] }, - "749": { + "820": { "op": "return", "stack_out": [ "role_address#0" ] }, - "750": { - "block": "rbac_get_role_config_switch_case_4@6", + "821": { + "block": "rbac_get_role_validity_switch_case_4@6", "stack_in": [ "role_address#0" ], - "op": "bytec_2 // 0x52373023", + "op": "bytec_3 // 0x523a41555423", "defined_out": [ - "0x52373023" + "0x523a41555423" ], "stack_out": [ "role_address#0", - "0x52373023" + "0x523a41555423" ] }, - "751": { + "822": { "op": "dig 1", "defined_out": [ - "0x52373023", + "0x523a41555423", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52373023", + "0x523a41555423", "role_address#0" ] }, - "753": { + "824": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4460,7 +4703,7 @@ "box_prefixed_key%0#1" ] }, - "754": { + "825": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4473,7 +4716,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "755": { + "826": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4488,7 +4731,7 @@ "maybe_exists%0#0" ] }, - "756": { + "827": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4496,7 +4739,7 @@ "maybe_exists%0#0" ] }, - "758": { + "829": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4504,7 +4747,7 @@ "box_prefixed_key%0#1" ] }, - "759": { + "830": { "op": "box_get", "defined_out": [ "aggregate%box_get%6#0", @@ -4517,7 +4760,7 @@ "aggregate%box_get%7#0" ] }, - "760": { + "831": { "op": "pop", "defined_out": [ "role_address#0", @@ -4528,36 +4771,36 @@ "tmp%3#0" ] }, - "761": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" + "832": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "764": { - "block": "rbac_get_role_config_switch_case_3@5", + "835": { + "block": "rbac_get_role_validity_switch_case_3@5", "stack_in": [ "role_address#0" ], - "op": "bytec 5 // 0x52363023", + "op": "bytec_2 // 0x523a54525323", "defined_out": [ - "0x52363023" + "0x523a54525323" ], "stack_out": [ "role_address#0", - "0x52363023" + "0x523a54525323" ] }, - "766": { + "836": { "op": "dig 1", "defined_out": [ - "0x52363023", + "0x523a54525323", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52363023", + "0x523a54525323", "role_address#0" ] }, - "768": { + "838": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4568,7 +4811,7 @@ "box_prefixed_key%0#1" ] }, - "769": { + "839": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4581,7 +4824,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "770": { + "840": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4596,7 +4839,7 @@ "maybe_exists%0#0" ] }, - "771": { + "841": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4604,7 +4847,7 @@ "maybe_exists%0#0" ] }, - "773": { + "843": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4612,7 +4855,7 @@ "box_prefixed_key%0#1" ] }, - "774": { + "844": { "op": "box_get", "defined_out": [ "aggregate%box_get%4#0", @@ -4625,7 +4868,7 @@ "aggregate%box_get%5#0" ] }, - "775": { + "845": { "op": "pop", "defined_out": [ "role_address#0", @@ -4636,36 +4879,36 @@ "tmp%3#0" ] }, - "776": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" + "846": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "779": { - "block": "rbac_get_role_config_switch_case_2@4", + "849": { + "block": "rbac_get_role_validity_switch_case_2@4", "stack_in": [ "role_address#0" ], - "op": "bytec 4 // 0x52353023", + "op": "bytec 5 // 0x523a50594423", "defined_out": [ - "0x52353023" + "0x523a50594423" ], "stack_out": [ "role_address#0", - "0x52353023" + "0x523a50594423" ] }, - "781": { + "851": { "op": "dig 1", "defined_out": [ - "0x52353023", + "0x523a50594423", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52353023", + "0x523a50594423", "role_address#0" ] }, - "783": { + "853": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4676,7 +4919,7 @@ "box_prefixed_key%0#1" ] }, - "784": { + "854": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4689,7 +4932,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "785": { + "855": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4704,7 +4947,7 @@ "maybe_exists%0#0" ] }, - "786": { + "856": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4712,7 +4955,7 @@ "maybe_exists%0#0" ] }, - "788": { + "858": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4720,7 +4963,7 @@ "box_prefixed_key%0#1" ] }, - "789": { + "859": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -4733,7 +4976,7 @@ "aggregate%box_get%3#0" ] }, - "790": { + "860": { "op": "pop", "defined_out": [ "role_address#0", @@ -4744,36 +4987,36 @@ "tmp%3#0" ] }, - "791": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" + "861": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "794": { - "block": "rbac_get_role_config_switch_case_1@3", + "864": { + "block": "rbac_get_role_validity_switch_case_1@3", "stack_in": [ "role_address#0" ], - "op": "bytec_3 // 0x52343023", + "op": "bytec 4 // 0x523a4d4e4723", "defined_out": [ - "0x52343023" + "0x523a4d4e4723" ], "stack_out": [ "role_address#0", - "0x52343023" + "0x523a4d4e4723" ] }, - "795": { + "866": { "op": "dig 1", "defined_out": [ - "0x52343023", + "0x523a4d4e4723", "role_address#0" ], "stack_out": [ "role_address#0", - "0x52343023", + "0x523a4d4e4723", "role_address#0" ] }, - "797": { + "868": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1", @@ -4784,7 +5027,7 @@ "box_prefixed_key%0#1" ] }, - "798": { + "869": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1", @@ -4797,7 +5040,7 @@ "box_prefixed_key%0#1 (copy)" ] }, - "799": { + "870": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4812,7 +5055,7 @@ "maybe_exists%0#0" ] }, - "800": { + "871": { "op": "bury 1", "stack_out": [ "role_address#0", @@ -4820,7 +5063,7 @@ "maybe_exists%0#0" ] }, - "802": { + "873": { "error": "Invalid account role address", "op": "assert // Invalid account role address", "stack_out": [ @@ -4828,7 +5071,7 @@ "box_prefixed_key%0#1" ] }, - "803": { + "874": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -4841,7 +5084,7 @@ "aggregate%box_get%1#0" ] }, - "804": { + "875": { "op": "pop", "defined_out": [ "role_address#0", @@ -4852,11 +5095,11 @@ "tmp%3#0" ] }, - "805": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" + "876": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "808": { - "block": "rbac_get_role_config_switch_case_0@2", + "879": { + "block": "rbac_get_role_validity_switch_case_0@2", "stack_in": [ "role_address#0" ], @@ -4869,10 +5112,10 @@ "tmp%3#0" ] }, - "826": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" + "897": { + "op": "b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9" }, - "829": { + "900": { "subroutine": "modules.rbac.RbacModule._role_is_active", "params": { "role_map#0": "bytes", @@ -4882,13 +5125,13 @@ "stack_in": [], "op": "proto 2 1" }, - "832": { + "903": { "op": "pushbytes \"\"", "stack_out": [ "awst_tmp%0#0" ] }, - "834": { + "905": { "op": "frame_dig -2", "defined_out": [ "role_map#0 (copy)" @@ -4898,7 +5141,7 @@ "role_map#0 (copy)" ] }, - "836": { + "907": { "op": "frame_dig -1", "defined_out": [ "role_address#0 (copy)", @@ -4910,7 +5153,7 @@ "role_address#0 (copy)" ] }, - "838": { + "909": { "op": "concat", "defined_out": [ "box_prefixed_key%0#1" @@ -4920,7 +5163,7 @@ "box_prefixed_key%0#1" ] }, - "839": { + "910": { "op": "dup", "defined_out": [ "box_prefixed_key%0#1" @@ -4931,7 +5174,7 @@ "box_prefixed_key%0#1" ] }, - "840": { + "911": { "op": "box_len", "defined_out": [ "_%0#0", @@ -4945,7 +5188,7 @@ "maybe_exists%0#0" ] }, - "841": { + "912": { "op": "bury 1", "stack_out": [ "awst_tmp%0#0", @@ -4953,14 +5196,14 @@ "maybe_exists%0#0" ] }, - "843": { + "914": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "846": { + "917": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -4968,7 +5211,7 @@ "box_prefixed_key%0#1" ] }, - "848": { + "919": { "op": "box_get", "defined_out": [ "aggregate%box_get%0#0", @@ -4982,7 +5225,7 @@ "aggregate%box_get%1#0" ] }, - "849": { + "920": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -4991,7 +5234,7 @@ "aggregate%box_get%0#0" ] }, - "850": { + "921": { "op": "intc_1 // 0", "stack_out": [ "awst_tmp%0#0", @@ -5000,7 +5243,7 @@ "0" ] }, - "851": { + "922": { "op": "extract_uint64", "defined_out": [ "box_prefixed_key%0#1", @@ -5012,10 +5255,10 @@ "values%0#0" ] }, - "852": { + "923": { "op": "global LatestTimestamp" }, - "854": { + "925": { "op": "dup", "defined_out": [ "awst_tmp%0#0", @@ -5030,7 +5273,7 @@ "awst_tmp%0#0" ] }, - "855": { + "926": { "op": "frame_bury 0", "defined_out": [ "awst_tmp%0#0", @@ -5044,7 +5287,7 @@ "awst_tmp%0#0" ] }, - "857": { + "928": { "op": "<=", "defined_out": [ "awst_tmp%0#0", @@ -5057,14 +5300,14 @@ "tmp%1#0" ] }, - "858": { + "929": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "861": { + "932": { "op": "frame_dig 1", "stack_out": [ "awst_tmp%0#0", @@ -5072,7 +5315,7 @@ "box_prefixed_key%0#1" ] }, - "863": { + "934": { "op": "box_get", "defined_out": [ "aggregate%box_get%2#0", @@ -5087,7 +5330,7 @@ "aggregate%box_get%3#0" ] }, - "864": { + "935": { "error": "check BoxMap entry exists", "op": "assert // check BoxMap entry exists", "stack_out": [ @@ -5096,7 +5339,7 @@ "aggregate%box_get%2#0" ] }, - "865": { + "936": { "op": "pushint 8", "defined_out": [ "8", @@ -5111,7 +5354,7 @@ "8" ] }, - "867": { + "938": { "op": "extract_uint64", "defined_out": [ "awst_tmp%0#0", @@ -5124,7 +5367,7 @@ "values%1#0" ] }, - "868": { + "939": { "op": "frame_dig 0", "stack_out": [ "awst_tmp%0#0", @@ -5133,7 +5376,7 @@ "awst_tmp%0#0" ] }, - "870": { + "941": { "op": ">=", "defined_out": [ "awst_tmp%0#0", @@ -5146,14 +5389,14 @@ "tmp%2#0" ] }, - "871": { + "942": { "op": "bz _role_is_active_bool_false@4", "stack_out": [ "awst_tmp%0#0", "box_prefixed_key%0#1" ] }, - "874": { + "945": { "op": "intc_0 // 1", "defined_out": [ "and_result%0#0", @@ -5166,7 +5409,7 @@ "and_result%0#0" ] }, - "875": { + "946": { "block": "_role_is_active_bool_merge@5", "stack_in": [ "awst_tmp%0#0", @@ -5178,11 +5421,11 @@ "and_result%0#0" ] }, - "877": { + "948": { "retsub": true, "op": "retsub" }, - "878": { + "949": { "block": "_role_is_active_bool_false@4", "stack_in": [ "awst_tmp%0#0", @@ -5198,13 +5441,13 @@ "and_result%0#0" ] }, - "879": { + "950": { "op": "b _role_is_active_bool_merge@5" }, - "882": { - "subroutine": "modules.rbac.RbacModule.assert_caller_is_arranger", + "953": { + "subroutine": "modules.rbac.RbacModule._assert_caller_is_arranger", "params": {}, - "block": "assert_caller_is_arranger", + "block": "_assert_caller_is_arranger", "stack_in": [], "op": "txn Sender", "defined_out": [ @@ -5214,7 +5457,7 @@ "role_address#0" ] }, - "884": { + "955": { "op": "intc_1 // 0", "defined_out": [ "0", @@ -5225,20 +5468,20 @@ "0" ] }, - "885": { - "op": "bytec_1 // 0x52323023", + "956": { + "op": "bytec_1 // 0x523a41525223", "defined_out": [ "0", - "0x52323023", + "0x523a41525223", "role_address#0" ], "stack_out": [ "role_address#0", "0", - "0x52323023" + "0x523a41525223" ] }, - "886": { + "957": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -5251,7 +5494,7 @@ "maybe_exists%0#0" ] }, - "887": { + "958": { "error": "check self.arranger exists", "op": "assert // check self.arranger exists", "stack_out": [ @@ -5259,7 +5502,7 @@ "maybe_value%0#0" ] }, - "888": { + "959": { "op": "==", "defined_out": [ "tmp%0#1" @@ -5268,19 +5511,19 @@ "tmp%0#1" ] }, - "889": { + "960": { "error": "Not authorized", "op": "assert // Not authorized", "stack_out": [] }, - "890": { + "961": { "retsub": true, "op": "retsub" }, - "891": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", + "962": { + "subroutine": "modules.rbac.RbacModule._assert_is_not_contract_defaulted", "params": {}, - "block": "assert_is_not_asset_defaulted", + "block": "_assert_is_not_contract_defaulted", "stack_in": [], "op": "intc_1 // 0", "defined_out": [ @@ -5290,18 +5533,18 @@ "0" ] }, - "892": { - "op": "bytec 9 // \"asset_defaulted\"", + "963": { + "op": "bytec 7 // \"defaulted\"", "defined_out": [ - "\"asset_defaulted\"", + "\"defaulted\"", "0" ], "stack_out": [ "0", - "\"asset_defaulted\"" + "\"defaulted\"" ] }, - "894": { + "965": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -5312,14 +5555,14 @@ "maybe_exists%0#0" ] }, - "895": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", + "966": { + "error": "check self.defaulted exists", + "op": "assert // check self.defaulted exists", "stack_out": [ "maybe_value%0#0" ] }, - "896": { + "967": { "op": "!", "defined_out": [ "tmp%0#0" @@ -5328,16 +5571,16 @@ "tmp%0#0" ] }, - "897": { + "968": { "error": "Defaulted", "op": "assert // Defaulted", "stack_out": [] }, - "898": { + "969": { "retsub": true, "op": "retsub" }, - "899": { + "970": { "subroutine": "modules.rbac.RbacModule._assert_valid_role", "params": { "role_id#0": "uint64" @@ -5346,7 +5589,7 @@ "stack_in": [], "op": "proto 1 0" }, - "902": { + "973": { "op": "frame_dig -1", "defined_out": [ "role_id#0 (copy)" @@ -5355,7 +5598,7 @@ "role_id#0 (copy)" ] }, - "904": { + "975": { "op": "intc_3 // 20", "defined_out": [ "20", @@ -5366,7 +5609,7 @@ "20" ] }, - "905": { + "976": { "op": "==", "defined_out": [ "tmp%0#0" @@ -5375,17 +5618,47 @@ "tmp%0#0" ] }, - "906": { - "op": "bnz _assert_valid_role_bool_true@6", + "977": { + "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "909": { + "980": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "911": { + "982": { + "op": "pushint 25", + "defined_out": [ + "25", + "role_id#0 (copy)" + ], + "stack_out": [ + "role_id#0 (copy)", + "25" + ] + }, + "984": { + "op": "==", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "985": { + "op": "bnz _assert_valid_role_bool_true@7", + "stack_out": [] + }, + "988": { + "op": "frame_dig -1", + "stack_out": [ + "role_id#0 (copy)" + ] + }, + "990": { "op": "pushint 40", "defined_out": [ "40", @@ -5396,26 +5669,26 @@ "40" ] }, - "913": { + "992": { "op": "==", "defined_out": [ - "tmp%1#0" + "tmp%2#0" ], "stack_out": [ - "tmp%1#0" + "tmp%2#0" ] }, - "914": { - "op": "bnz _assert_valid_role_bool_true@6", + "993": { + "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "917": { + "996": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "919": { + "998": { "op": "pushint 50", "defined_out": [ "50", @@ -5426,26 +5699,26 @@ "50" ] }, - "921": { + "1000": { "op": "==", "defined_out": [ - "tmp%2#0" + "tmp%3#0" ], "stack_out": [ - "tmp%2#0" + "tmp%3#0" ] }, - "922": { - "op": "bnz _assert_valid_role_bool_true@6", + "1001": { + "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "925": { + "1004": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "927": { + "1006": { "op": "pushint 60", "defined_out": [ "60", @@ -5456,26 +5729,26 @@ "60" ] }, - "929": { + "1008": { "op": "==", "defined_out": [ - "tmp%3#0" + "tmp%4#0" ], "stack_out": [ - "tmp%3#0" + "tmp%4#0" ] }, - "930": { - "op": "bnz _assert_valid_role_bool_true@6", + "1009": { + "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "933": { + "1012": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "935": { + "1014": { "op": "pushint 70", "defined_out": [ "70", @@ -5486,26 +5759,26 @@ "70" ] }, - "937": { + "1016": { "op": "==", "defined_out": [ - "tmp%4#0" + "tmp%5#0" ], "stack_out": [ - "tmp%4#0" + "tmp%5#0" ] }, - "938": { - "op": "bnz _assert_valid_role_bool_true@6", + "1017": { + "op": "bnz _assert_valid_role_bool_true@7", "stack_out": [] }, - "941": { + "1020": { "op": "frame_dig -1", "stack_out": [ "role_id#0 (copy)" ] }, - "943": { + "1022": { "op": "pushint 80", "defined_out": [ "80", @@ -5516,21 +5789,21 @@ "80" ] }, - "945": { + "1024": { "op": "==", "defined_out": [ - "tmp%5#0" + "tmp%6#0" ], "stack_out": [ - "tmp%5#0" + "tmp%6#0" ] }, - "946": { - "op": "bz _assert_valid_role_bool_false@7", + "1025": { + "op": "bz _assert_valid_role_bool_false@8", "stack_out": [] }, - "949": { - "block": "_assert_valid_role_bool_true@6", + "1028": { + "block": "_assert_valid_role_bool_true@7", "stack_in": [], "op": "intc_0 // 1", "defined_out": [ @@ -5540,9 +5813,9 @@ "or_result%0#0" ] }, - "950": { + "1029": { "error": "Invalid role identifier", - "block": "_assert_valid_role_bool_merge@8", + "block": "_assert_valid_role_bool_merge@9", "stack_in": [ "or_result%0#0" ], @@ -5550,12 +5823,12 @@ "defined_out": [], "stack_out": [] }, - "951": { + "1030": { "retsub": true, "op": "retsub" }, - "952": { - "block": "_assert_valid_role_bool_false@7", + "1031": { + "block": "_assert_valid_role_bool_false@8", "stack_in": [], "op": "intc_1 // 0", "defined_out": [ @@ -5565,8 +5838,8 @@ "or_result%0#0" ] }, - "953": { - "op": "b _assert_valid_role_bool_merge@8" + "1032": { + "op": "b _assert_valid_role_bool_merge@9" } } } \ No newline at end of file diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal index f54d8717..42cbdf4f 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.approval.teal @@ -4,29 +4,30 @@ // algopy.arc4.ARC4Contract.approval_program() -> uint64: main: intcblock 1 0 32 20 - bytecblock 0x151f7c75 0x52323023 0x52373023 0x52343023 0x52353023 0x52363023 0x52383023 0x52323523 "asset_suspended" "asset_defaulted" + bytecblock 0x151f7c75 0x523a41525223 0x523a54525323 0x523a41555423 0x523a4d4e4723 0x523a50594423 0x523a4d4f4323 "defaulted" 0x523a4f504423 "contract_suspended" txn ApplicationID bnz main_after_if_else@2 - // modules/rbac.py:30-31 + // modules/rbac.py:28-29 // # RBAC Roles // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec_1 // 0x52323023 + bytec_1 // 0x523a41525223 global ZeroAddress app_global_put - // modules/rbac.py:32 + // modules/rbac.py:30 // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 7 // 0x52323523 + bytec 8 // 0x523a4f504423 global ZeroAddress app_global_put // modules/rbac.py:47-48 - // # D-ASA Governance - // self.asset_suspended = False - bytec 8 // "asset_suspended" + // # Contract Governance + // self.contract_suspended = False + bytec 9 // "contract_suspended" intc_1 // 0 app_global_put - // modules/rbac.py:49 - // self.asset_defaulted = False - bytec 9 // "asset_defaulted" + // modules/rbac.py:50-51 + // # Contract Performance + // self.defaulted = False + bytec 7 // "defaulted" intc_1 // 0 app_global_put @@ -34,18 +35,36 @@ main_after_if_else@2: // smart_contracts/mock_module_rbac/contract.py:6 // class MockRbacModule(RbacModule): txn NumAppArgs - bz main_create@17 + bz main_create@20 + pushbytes 0x914f04eb // method "contract_update()void" + txna ApplicationArgs 0 + match main_contract_update_route@5 + +main_switch_case_next@6: + // smart_contracts/mock_module_rbac/contract.py:6 + // class MockRbacModule(RbacModule): txn OnCompletion ! assert txn ApplicationID assert - pushbytess 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,byte[])uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_config(uint8,address)(uint64,uint64)" + pushbytess 0x82f71b2d 0xef04f5d3 0xdf343550 0x3dbe80bd 0x1e3e48e7 0x39241fa3 0x010c8299 0x7406acd2 0x1a72a2ee // method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,(uint64,uint64))uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_contract_suspension(bool)uint64", method "rbac_contract_default(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_validity(uint8,address)(uint64,uint64)" txna ApplicationArgs 0 - match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config + match rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_contract_suspension rbac_contract_default rbac_get_arranger rbac_get_address_roles rbac_get_role_validity err -main_create@17: +main_contract_update_route@5: + // modules/rbac.py:150 + // @arc4.abimethod(allow_actions=["UpdateApplication"]) + txn OnCompletion + pushint 4 // UpdateApplication + == + txn ApplicationID + && + assert + b contract_update + +main_create@20: // smart_contracts/mock_module_rbac/contract.py:14 // @arc4.baremethod(create="require") txn OnCompletion @@ -56,7 +75,7 @@ main_create@17: assert // smart_contracts/mock_module_rbac/contract.py:16 // self.arranger.value = Txn.sender - bytec_1 // 0x52323023 + bytec_1 // 0x523a41525223 txn Sender app_global_put // smart_contracts/mock_module_rbac/contract.py:14 @@ -65,9 +84,23 @@ main_create@17: return +// modules.rbac.RbacModule.contract_update[routing]() -> void: +contract_update: + // modules/rbac.py:161-164 + // # The reference implementation grants the update permissions to the Arranger. + // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they + // # might introduce breaking changes. + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:150 + // @arc4.abimethod(allow_actions=["UpdateApplication"]) + intc_0 // 1 + return + + // modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: rbac_rotate_arranger: - // modules/rbac.py:147 + // modules/rbac.py:166 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -75,18 +108,18 @@ rbac_rotate_arranger: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:158 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:159 + // modules/rbac.py:180 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:181 // self.arranger.value = new_arranger - bytec_1 // 0x52323023 + bytec_1 // 0x523a41525223 swap app_global_put - // modules/rbac.py:160 + // modules/rbac.py:182 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:147 + // modules/rbac.py:166 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -99,7 +132,7 @@ rbac_rotate_arranger: // modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: rbac_set_op_daemon: - // modules/rbac.py:162 + // modules/rbac.py:184 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -107,18 +140,18 @@ rbac_set_op_daemon: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:173 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:174 + // modules/rbac.py:198 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:199 // self.op_daemon.value = address - bytec 7 // 0x52323523 + bytec 8 // 0x523a4f504423 swap app_global_put - // modules/rbac.py:175 + // modules/rbac.py:200 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:162 + // modules/rbac.py:184 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -131,7 +164,7 @@ rbac_set_op_daemon: // modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: rbac_assign_role: - // modules/rbac.py:177 + // modules/rbac.py:202 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -148,43 +181,38 @@ rbac_assign_role: assert // invalid number of bytes for arc4.static_array txna ApplicationArgs 3 dup - intc_1 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 + cover 2 len + pushint 16 == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/rbac.py:199 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:200 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:201 + assert // invalid number of bytes for smart_contracts.abi_types.RoleValidity + // modules/rbac.py:224 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:225 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/rbac.py:226 // self._assert_valid_role(role_id.as_uint64()) btoi dupn 2 callsub _assert_valid_role - // modules/rbac.py:101 - // if role_id == UInt64(cst.ROLE_ARRANGER): + // modules/rbac.py:104 + // if role_id == UInt64(enums.ROLE_ARRANGER): intc_3 // 20 == bz rbac_assign_role_after_if_else@3 - // modules/rbac.py:102 + // modules/rbac.py:105 // self.arranger.value = role_address - bytec_1 // 0x52323023 + bytec_1 // 0x523a41525223 dig 3 app_global_put -rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14: - // modules/rbac.py:203 +rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14: + // modules/rbac.py:228 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:177 + // modules/rbac.py:202 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -195,15 +223,15 @@ rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14: return rbac_assign_role_after_if_else@3: - // modules/rbac.py:105 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): + // modules/rbac.py:108 + // if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): dup pushint 40 == bz rbac_assign_role_after_if_else@5 - // modules/rbac.py:106 + // modules/rbac.py:109 // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec_3 // 0x52343023 + bytec 4 // 0x523a4d4e4723 dig 3 concat dup @@ -211,24 +239,24 @@ rbac_assign_role_after_if_else@3: bury 1 ! assert // Invalid account role address - // modules/rbac.py:107 - // self.account_manager[role_address] = typ.RoleConfig.from_bytes(config) + // modules/rbac.py:110 + // self.account_manager[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 + // modules/rbac.py:227 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 rbac_assign_role_after_if_else@5: - // modules/rbac.py:109 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): + // modules/rbac.py:112 + // if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): dup pushint 50 == bz rbac_assign_role_after_if_else@7 - // modules/rbac.py:110 + // modules/rbac.py:113 // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 4 // 0x52353023 + bytec 5 // 0x523a50594423 dig 3 concat dup @@ -236,24 +264,24 @@ rbac_assign_role_after_if_else@5: bury 1 ! assert // Invalid account role address - // modules/rbac.py:111 - // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes(config) + // modules/rbac.py:114 + // self.primary_dealer[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 + // modules/rbac.py:227 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 rbac_assign_role_after_if_else@7: - // modules/rbac.py:113 - // if role_id == UInt64(cst.ROLE_TRUSTEE): + // modules/rbac.py:116 + // if role_id == UInt64(enums.ROLE_TRUSTEE): dup pushint 60 == bz rbac_assign_role_after_if_else@9 - // modules/rbac.py:114 + // modules/rbac.py:117 // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 5 // 0x52363023 + bytec_2 // 0x523a54525323 dig 3 concat dup @@ -261,24 +289,24 @@ rbac_assign_role_after_if_else@7: bury 1 ! assert // Invalid account role address - // modules/rbac.py:115 - // self.trustee[role_address] = typ.RoleConfig.from_bytes(config) + // modules/rbac.py:118 + // self.trustee[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 + // modules/rbac.py:227 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 rbac_assign_role_after_if_else@9: - // modules/rbac.py:117 - // if role_id == UInt64(cst.ROLE_AUTHORITY): + // modules/rbac.py:120 + // if role_id == UInt64(enums.ROLE_AUTHORITY): dup pushint 70 == bz rbac_assign_role_after_if_else@11 - // modules/rbac.py:118 + // modules/rbac.py:121 // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec_2 // 0x52373023 + bytec_3 // 0x523a41555423 dig 3 concat dup @@ -286,24 +314,24 @@ rbac_assign_role_after_if_else@9: bury 1 ! assert // Invalid account role address - // modules/rbac.py:119 - // self.authority[role_address] = typ.RoleConfig.from_bytes(config) + // modules/rbac.py:122 + // self.authority[role_address] = validity.copy() dig 2 box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 + // modules/rbac.py:227 + // self._set_role(role_id.as_uint64(), role_address, validity) + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 rbac_assign_role_after_if_else@11: - // modules/rbac.py:121 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): + // modules/rbac.py:124 + // if role_id == UInt64(enums.ROLE_OBSERVER): dup pushint 80 == - bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - // modules/rbac.py:122 - // assert role_address not in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 6 // 0x52383023 + bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 + // modules/rbac.py:125 + // assert role_address not in self.observer, err.INVALID_ROLE_ADDRESS + bytec 6 // 0x523a4d4f4323 dig 3 concat dup @@ -311,16 +339,16 @@ rbac_assign_role_after_if_else@11: bury 1 ! assert // Invalid account role address - // modules/rbac.py:123 - // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes(config) + // modules/rbac.py:126 + // self.observer[role_address] = validity.copy() dig 2 box_put - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 + b rbac_assign_role_after_inlined_modules.rbac.RbacModule._set_role@14 // modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: rbac_revoke_role: - // modules/rbac.py:205 + // modules/rbac.py:230 // @arc4.abimethod txna ApplicationArgs 1 dup @@ -335,47 +363,47 @@ rbac_revoke_role: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:224 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:225 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:226 + // modules/rbac.py:249 + // self._assert_caller_is_arranger() + callsub _assert_caller_is_arranger + // modules/rbac.py:250 + // self._assert_is_not_contract_defaulted() + callsub _assert_is_not_contract_defaulted + // modules/rbac.py:251 // self._assert_valid_role(role_id.as_uint64()) btoi dupn 2 callsub _assert_valid_role - // modules/rbac.py:126 - // assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE + // modules/rbac.py:129 + // assert role_id != UInt64(enums.ROLE_ARRANGER), err.INVALID_ROLE dup intc_3 // 20 != assert // Invalid role identifier - // modules/rbac.py:127 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): + // modules/rbac.py:130 + // if role_id == UInt64(enums.ROLE_ACCOUNT_MANAGER): pushint 40 == bz rbac_revoke_role_after_if_else@3 - // modules/rbac.py:128 + // modules/rbac.py:131 // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec_3 // 0x52343023 + bytec 4 // 0x523a4d4e4723 dig 2 concat dup box_len bury 1 assert // Invalid account role address - // modules/rbac.py:129 + // modules/rbac.py:132 // del self.account_manager[role_address] box_del pop rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:228 + // modules/rbac.py:253 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:205 + // modules/rbac.py:230 // @arc4.abimethod itob bytec_0 // 0x151f7c75 @@ -386,104 +414,104 @@ rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: return rbac_revoke_role_after_if_else@3: - // modules/rbac.py:131 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): + // modules/rbac.py:134 + // if role_id == UInt64(enums.ROLE_PRIMARY_DEALER): dup pushint 50 == bz rbac_revoke_role_after_if_else@5 - // modules/rbac.py:132 + // modules/rbac.py:135 // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 4 // 0x52353023 + bytec 5 // 0x523a50594423 dig 2 concat dup box_len bury 1 assert // Invalid account role address - // modules/rbac.py:133 + // modules/rbac.py:136 // del self.primary_dealer[role_address] box_del pop - // modules/rbac.py:227 + // modules/rbac.py:252 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 rbac_revoke_role_after_if_else@5: - // modules/rbac.py:135 - // if role_id == UInt64(cst.ROLE_TRUSTEE): + // modules/rbac.py:138 + // if role_id == UInt64(enums.ROLE_TRUSTEE): dup pushint 60 == bz rbac_revoke_role_after_if_else@7 - // modules/rbac.py:136 + // modules/rbac.py:139 // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 5 // 0x52363023 + bytec_2 // 0x523a54525323 dig 2 concat dup box_len bury 1 assert // Invalid account role address - // modules/rbac.py:137 + // modules/rbac.py:140 // del self.trustee[role_address] box_del pop - // modules/rbac.py:227 + // modules/rbac.py:252 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 rbac_revoke_role_after_if_else@7: - // modules/rbac.py:139 - // if role_id == UInt64(cst.ROLE_AUTHORITY): + // modules/rbac.py:142 + // if role_id == UInt64(enums.ROLE_AUTHORITY): dup pushint 70 == bz rbac_revoke_role_after_if_else@9 - // modules/rbac.py:140 + // modules/rbac.py:143 // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec_2 // 0x52373023 + bytec_3 // 0x523a41555423 dig 2 concat dup box_len bury 1 assert // Invalid account role address - // modules/rbac.py:141 + // modules/rbac.py:144 // del self.authority[role_address] box_del pop - // modules/rbac.py:227 + // modules/rbac.py:252 // self._delete_role(role_id.as_uint64(), role_address) b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 rbac_revoke_role_after_if_else@9: - // modules/rbac.py:143 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): + // modules/rbac.py:146 + // if role_id == UInt64(enums.ROLE_OBSERVER): dup pushint 80 == bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - // modules/rbac.py:144 - // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 6 // 0x52383023 + // modules/rbac.py:147 + // assert role_address in self.observer, err.INVALID_ROLE_ADDRESS + bytec 6 // 0x523a4d4f4323 dig 2 concat dup box_len bury 1 assert // Invalid account role address - // modules/rbac.py:145 - // del self.interest_oracle[role_address] + // modules/rbac.py:148 + // del self.observer[role_address] box_del pop b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 -// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: -rbac_gov_asset_suspension: - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test +// modules.rbac.RbacModule.rbac_contract_suspension[routing]() -> void: +rbac_contract_suspension: + // modules/rbac.py:255 + // @arc4.abimethod txna ApplicationArgs 1 dup len @@ -492,22 +520,59 @@ rbac_gov_asset_suspension: assert // invalid number of bytes for arc4.bool intc_1 // 0 getbit - // modules/rbac.py:77 + // modules/rbac.py:79 // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec_2 // 0x52373023 + bytec_3 // 0x523a41555423 txn Sender callsub _role_is_active assert // Not authorized - // modules/rbac.py:246 - // self.asset_suspended = suspended - bytec 8 // "asset_suspended" + // modules/rbac.py:271 + // self.contract_suspended = suspended + bytec 9 // "contract_suspended" swap app_global_put - // modules/rbac.py:247 + // modules/rbac.py:272 // return Global.latest_timestamp global LatestTimestamp - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test + // modules/rbac.py:255 + // @arc4.abimethod + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + + +// modules.rbac.RbacModule.rbac_contract_default[routing]() -> void: +rbac_contract_default: + // modules/rbac.py:274 + // @arc4.abimethod + txna ApplicationArgs 1 + dup + len + intc_0 // 1 + == + assert // invalid number of bytes for arc4.bool + intc_1 // 0 + getbit + // modules/rbac.py:76 + // assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED + bytec_2 // 0x523a54525323 + txn Sender + callsub _role_is_active + assert // Not authorized + // modules/rbac.py:287 + // self.defaulted = defaulted + bytec 7 // "defaulted" + swap + app_global_put + // modules/rbac.py:288 + // return Global.latest_timestamp + global LatestTimestamp + // modules/rbac.py:274 + // @arc4.abimethod itob bytec_0 // 0x151f7c75 swap @@ -519,13 +584,13 @@ rbac_gov_asset_suspension: // modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: rbac_get_arranger: - // modules/rbac.py:257 + // modules/rbac.py:301 // return self.arranger.value intc_1 // 0 - bytec_1 // 0x52323023 + bytec_1 // 0x523a41525223 app_global_get_ex assert // check self.arranger exists - // modules/rbac.py:249 + // modules/rbac.py:290 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -537,7 +602,7 @@ rbac_get_arranger: // modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: rbac_get_address_roles: - // modules/rbac.py:259 + // modules/rbac.py:303 // @arc4.abimethod(readonly=True) txna ApplicationArgs 1 dup @@ -545,32 +610,32 @@ rbac_get_address_roles: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:273 + // modules/rbac.py:321 // self._role_is_active(self.account_manager, address), - bytec_3 // 0x52343023 + bytec 4 // 0x523a4d4e4723 dig 1 callsub _role_is_active - // modules/rbac.py:274 + // modules/rbac.py:322 // self._role_is_active(self.primary_dealer, address), - bytec 4 // 0x52353023 + bytec 5 // 0x523a50594423 dig 2 callsub _role_is_active - // modules/rbac.py:275 + // modules/rbac.py:323 // self._role_is_active(self.trustee, address), - bytec 5 // 0x52363023 + bytec_2 // 0x523a54525323 dig 3 callsub _role_is_active - // modules/rbac.py:276 + // modules/rbac.py:324 // self._role_is_active(self.authority, address), - bytec_2 // 0x52373023 + bytec_3 // 0x523a41555423 dig 4 callsub _role_is_active - // modules/rbac.py:277 - // self._role_is_active(self.interest_oracle, address), - bytec 6 // 0x52383023 + // modules/rbac.py:325 + // self._role_is_active(self.observer, address), + bytec 6 // 0x523a4d4f4323 uncover 5 callsub _role_is_active - // modules/rbac.py:259 + // modules/rbac.py:303 // @arc4.abimethod(readonly=True) pushbytes 0x00 intc_1 // 0 @@ -596,9 +661,9 @@ rbac_get_address_roles: return -// modules.rbac.RbacModule.rbac_get_role_config[routing]() -> void: -rbac_get_role_config: - // modules/rbac.py:280 +// modules.rbac.RbacModule.rbac_get_role_validity[routing]() -> void: +rbac_get_role_validity: + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) txna ApplicationArgs 1 dup @@ -613,81 +678,81 @@ rbac_get_role_config: intc_2 // 32 == assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:294 + // modules/rbac.py:346 // role = role_id.as_uint64() btoi - // modules/rbac.py:295 + // modules/rbac.py:347 // self._assert_valid_role(role) dup callsub _assert_valid_role - // modules/rbac.py:297 - // case UInt64(cst.ROLE_ARRANGER): + // modules/rbac.py:349 + // case UInt64(enums.ROLE_ARRANGER): intc_3 // 20 - // modules/rbac.py:301 - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): + // modules/rbac.py:353 + // case UInt64(enums.ROLE_ACCOUNT_MANAGER): pushints 40 50 60 70 80 - // modules/rbac.py:296-327 + // modules/rbac.py:348-379 // match role: - // case UInt64(cst.ROLE_ARRANGER): - // return typ.RoleConfig( + // case UInt64(enums.ROLE_ARRANGER): + // return typ.RoleValidity( // role_validity_start=UInt64(0), role_validity_end=UInt64(0) // ) - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): + // case UInt64(enums.ROLE_ACCOUNT_MANAGER): // assert self._has_role( // self.account_manager, role_address // ), err.INVALID_ROLE_ADDRESS // return self.account_manager[role_address] - // case UInt64(cst.ROLE_PRIMARY_DEALER): + // case UInt64(enums.ROLE_PRIMARY_DEALER): // assert self._has_role( // self.primary_dealer, role_address // ), err.INVALID_ROLE_ADDRESS // return self.primary_dealer[role_address] - // case UInt64(cst.ROLE_TRUSTEE): + // case UInt64(enums.ROLE_TRUSTEE): // assert self._has_role( // self.trustee, role_address // ), err.INVALID_ROLE_ADDRESS // return self.trustee[role_address] - // case UInt64(cst.ROLE_AUTHORITY): + // case UInt64(enums.ROLE_AUTHORITY): // assert self._has_role( // self.authority, role_address // ), err.INVALID_ROLE_ADDRESS // return self.authority[role_address] - // case UInt64(cst.ROLE_INTEREST_ORACLE): + // case UInt64(enums.ROLE_OBSERVER): // assert self._has_role( - // self.interest_oracle, role_address + // self.observer, role_address // ), err.INVALID_ROLE_ADDRESS - // return self.interest_oracle[role_address] + // return self.observer[role_address] // case _: // op.err(err.INVALID_ROLE) uncover 6 - match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7 - // modules/rbac.py:327 + match rbac_get_role_validity_switch_case_0@2 rbac_get_role_validity_switch_case_1@3 rbac_get_role_validity_switch_case_2@4 rbac_get_role_validity_switch_case_3@5 rbac_get_role_validity_switch_case_4@6 rbac_get_role_validity_switch_case_5@7 + // modules/rbac.py:379 // op.err(err.INVALID_ROLE) err // Invalid role identifier -rbac_get_role_config_switch_case_5@7: - // modules/rbac.py:323 - // self.interest_oracle, role_address - bytec 6 // 0x52383023 - // modules/rbac.py:55 +rbac_get_role_validity_switch_case_5@7: + // modules/rbac.py:375 + // self.observer, role_address + bytec 6 // 0x523a4d4f4323 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:322-324 + // modules/rbac.py:374-376 // assert self._has_role( - // self.interest_oracle, role_address + // self.observer, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:325 - // return self.interest_oracle[role_address] + // modules/rbac.py:377 + // return self.observer[role_address] box_get pop -rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9: - // modules/rbac.py:280 +rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9: + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) bytec_0 // 0x151f7c75 swap @@ -696,120 +761,120 @@ rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@ intc_0 // 1 return -rbac_get_role_config_switch_case_4@6: - // modules/rbac.py:318 +rbac_get_role_validity_switch_case_4@6: + // modules/rbac.py:370 // self.authority, role_address - bytec_2 // 0x52373023 - // modules/rbac.py:55 + bytec_3 // 0x523a41555423 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:317-319 + // modules/rbac.py:369-371 // assert self._has_role( // self.authority, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:320 + // modules/rbac.py:372 // return self.authority[role_address] box_get pop - // modules/rbac.py:280 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 -rbac_get_role_config_switch_case_3@5: - // modules/rbac.py:313 +rbac_get_role_validity_switch_case_3@5: + // modules/rbac.py:365 // self.trustee, role_address - bytec 5 // 0x52363023 - // modules/rbac.py:55 + bytec_2 // 0x523a54525323 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:312-314 + // modules/rbac.py:364-366 // assert self._has_role( // self.trustee, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:315 + // modules/rbac.py:367 // return self.trustee[role_address] box_get pop - // modules/rbac.py:280 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 -rbac_get_role_config_switch_case_2@4: - // modules/rbac.py:308 +rbac_get_role_validity_switch_case_2@4: + // modules/rbac.py:360 // self.primary_dealer, role_address - bytec 4 // 0x52353023 - // modules/rbac.py:55 + bytec 5 // 0x523a50594423 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:307-309 + // modules/rbac.py:359-361 // assert self._has_role( // self.primary_dealer, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:310 + // modules/rbac.py:362 // return self.primary_dealer[role_address] box_get pop - // modules/rbac.py:280 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 -rbac_get_role_config_switch_case_1@3: - // modules/rbac.py:303 +rbac_get_role_validity_switch_case_1@3: + // modules/rbac.py:355 // self.account_manager, role_address - bytec_3 // 0x52343023 - // modules/rbac.py:55 + bytec 4 // 0x523a4d4e4723 + // modules/rbac.py:57 // return role_address in role_map dig 1 concat dup box_len bury 1 - // modules/rbac.py:302-304 + // modules/rbac.py:354-356 // assert self._has_role( // self.account_manager, role_address // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // modules/rbac.py:305 + // modules/rbac.py:357 // return self.account_manager[role_address] box_get pop - // modules/rbac.py:280 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 -rbac_get_role_config_switch_case_0@2: - // modules/rbac.py:298-300 - // return typ.RoleConfig( +rbac_get_role_validity_switch_case_0@2: + // modules/rbac.py:350-352 + // return typ.RoleValidity( // role_validity_start=UInt64(0), role_validity_end=UInt64(0) // ) pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:280 + // modules/rbac.py:328 // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 + b rbac_get_role_validity_after_inlined_modules.rbac.RbacModule.rbac_get_role_validity@9 // modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: _role_is_active: - // modules/rbac.py:57 + // modules/rbac.py:59 // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: proto 2 1 pushbytes "" - // modules/rbac.py:55 + // modules/rbac.py:57 // return role_address in role_map frame_dig -2 frame_dig -1 @@ -817,47 +882,47 @@ _role_is_active: dup box_len bury 1 - // modules/rbac.py:58-62 + // modules/rbac.py:60-64 // return self._has_role(role_map, role_address) and ( // role_map[role_address].role_validity_start // <= Global.latest_timestamp // <= role_map[role_address].role_validity_end // ) bz _role_is_active_bool_false@4 - // modules/rbac.py:59 + // modules/rbac.py:61 // role_map[role_address].role_validity_start frame_dig 1 box_get assert // check BoxMap entry exists intc_1 // 0 extract_uint64 - // modules/rbac.py:60 + // modules/rbac.py:62 // <= Global.latest_timestamp global LatestTimestamp dup frame_bury 0 - // modules/rbac.py:59-60 + // modules/rbac.py:61-62 // role_map[role_address].role_validity_start // <= Global.latest_timestamp <= - // modules/rbac.py:59-61 + // modules/rbac.py:61-63 // role_map[role_address].role_validity_start // <= Global.latest_timestamp // <= role_map[role_address].role_validity_end bz _role_is_active_bool_false@4 - // modules/rbac.py:61 + // modules/rbac.py:63 // <= role_map[role_address].role_validity_end frame_dig 1 box_get assert // check BoxMap entry exists pushint 8 extract_uint64 - // modules/rbac.py:60-61 + // modules/rbac.py:62-63 // <= Global.latest_timestamp // <= role_map[role_address].role_validity_end frame_dig 0 >= - // modules/rbac.py:59-61 + // modules/rbac.py:61-63 // role_map[role_address].role_validity_start // <= Global.latest_timestamp // <= role_map[role_address].role_validity_end @@ -865,7 +930,7 @@ _role_is_active: intc_0 // 1 _role_is_active_bool_merge@5: - // modules/rbac.py:58-62 + // modules/rbac.py:60-64 // return self._has_role(role_map, role_address) and ( // role_map[role_address].role_validity_start // <= Global.latest_timestamp @@ -879,32 +944,32 @@ _role_is_active_bool_false@4: b _role_is_active_bool_merge@5 -// modules.rbac.RbacModule.assert_caller_is_arranger() -> void: -assert_caller_is_arranger: - // modules/rbac.py:65 +// modules.rbac.RbacModule._assert_caller_is_arranger() -> void: +_assert_caller_is_arranger: + // modules/rbac.py:67 // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED txn Sender - // modules/rbac.py:52 + // modules/rbac.py:54 // return role_address == self.arranger.value intc_1 // 0 - bytec_1 // 0x52323023 + bytec_1 // 0x523a41525223 app_global_get_ex assert // check self.arranger exists == - // modules/rbac.py:65 + // modules/rbac.py:67 // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED assert // Not authorized retsub -// modules.rbac.RbacModule.assert_is_not_asset_defaulted() -> void: -assert_is_not_asset_defaulted: - // modules/rbac.py:83 - // assert not self.asset_defaulted, err.DEFAULTED +// modules.rbac.RbacModule._assert_is_not_contract_defaulted() -> void: +_assert_is_not_contract_defaulted: + // modules/rbac.py:85 + // assert not self.defaulted, err.DEFAULTED intc_1 // 0 - bytec 9 // "asset_defaulted" + bytec 7 // "defaulted" app_global_get_ex - assert // check self.asset_defaulted exists + assert // check self.defaulted exists ! assert // Defaulted retsub @@ -912,125 +977,149 @@ assert_is_not_asset_defaulted: // modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: _assert_valid_role: - // modules/rbac.py:88 + // modules/rbac.py:90 // def _assert_valid_role(self, role_id: UInt64) -> None: proto 1 0 - // modules/rbac.py:89-96 + // modules/rbac.py:91-99 // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), // ), err.INVALID_ROLE frame_dig -1 - // modules/rbac.py:90 - // UInt64(cst.ROLE_ARRANGER), + // modules/rbac.py:92 + // UInt64(enums.ROLE_ARRANGER), intc_3 // 20 - // modules/rbac.py:89-96 + // modules/rbac.py:91-99 // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), // ), err.INVALID_ROLE == - bnz _assert_valid_role_bool_true@6 + bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:91 - // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // modules/rbac.py:93 + // UInt64(enums.ROLE_OP_DAEMON), + pushint 25 + // modules/rbac.py:91-99 + // assert role_id in ( + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), + // ), err.INVALID_ROLE + == + bnz _assert_valid_role_bool_true@7 + frame_dig -1 + // modules/rbac.py:94 + // UInt64(enums.ROLE_ACCOUNT_MANAGER), pushint 40 - // modules/rbac.py:89-96 + // modules/rbac.py:91-99 // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), // ), err.INVALID_ROLE == - bnz _assert_valid_role_bool_true@6 + bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:92 - // UInt64(cst.ROLE_PRIMARY_DEALER), + // modules/rbac.py:95 + // UInt64(enums.ROLE_PRIMARY_DEALER), pushint 50 - // modules/rbac.py:89-96 + // modules/rbac.py:91-99 // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), // ), err.INVALID_ROLE == - bnz _assert_valid_role_bool_true@6 + bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:93 - // UInt64(cst.ROLE_TRUSTEE), + // modules/rbac.py:96 + // UInt64(enums.ROLE_TRUSTEE), pushint 60 - // modules/rbac.py:89-96 + // modules/rbac.py:91-99 // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), // ), err.INVALID_ROLE == - bnz _assert_valid_role_bool_true@6 + bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:94 - // UInt64(cst.ROLE_AUTHORITY), + // modules/rbac.py:97 + // UInt64(enums.ROLE_AUTHORITY), pushint 70 - // modules/rbac.py:89-96 + // modules/rbac.py:91-99 // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), // ), err.INVALID_ROLE == - bnz _assert_valid_role_bool_true@6 + bnz _assert_valid_role_bool_true@7 frame_dig -1 - // modules/rbac.py:95 - // UInt64(cst.ROLE_INTEREST_ORACLE), + // modules/rbac.py:98 + // UInt64(enums.ROLE_OBSERVER), pushint 80 - // modules/rbac.py:89-96 + // modules/rbac.py:91-99 // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), // ), err.INVALID_ROLE == - bz _assert_valid_role_bool_false@7 + bz _assert_valid_role_bool_false@8 -_assert_valid_role_bool_true@6: +_assert_valid_role_bool_true@7: intc_0 // 1 -_assert_valid_role_bool_merge@8: - // modules/rbac.py:89-96 +_assert_valid_role_bool_merge@9: + // modules/rbac.py:91-99 // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), + // UInt64(enums.ROLE_ARRANGER), + // UInt64(enums.ROLE_OP_DAEMON), + // UInt64(enums.ROLE_ACCOUNT_MANAGER), + // UInt64(enums.ROLE_PRIMARY_DEALER), + // UInt64(enums.ROLE_TRUSTEE), + // UInt64(enums.ROLE_AUTHORITY), + // UInt64(enums.ROLE_OBSERVER), // ), err.INVALID_ROLE assert // Invalid role identifier retsub -_assert_valid_role_bool_false@7: +_assert_valid_role_bool_false@8: intc_1 // 0 - b _assert_valid_role_bool_merge@8 + b _assert_valid_role_bool_merge@9 diff --git a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json index 2bb07a28..98108694 100644 --- a/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json +++ b/smart_contracts/artifacts/mock_module_rbac/MockRbacModule.arc56.json @@ -1,7 +1,7 @@ { "name": "MockRbacModule", "structs": { - "RoleConfig": [ + "RoleValidity": [ { "name": "role_validity_start", "type": "uint64" @@ -13,18 +13,36 @@ ] }, "methods": [ + { + "name": "contract_update", + "args": [], + "returns": { + "type": "void", + "desc": "None." + }, + "actions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "readonly": false, + "desc": "Update D-ASA application.", + "events": [], + "recommendations": {} + }, { "name": "rbac_rotate_arranger", "args": [ { "type": "address", "name": "new_arranger", - "desc": "New Arranger address" + "desc": "New arranger address." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the role assignment" + "desc": "UNIX timestamp of the role assignment." }, "actions": { "create": [], @@ -33,7 +51,7 @@ ] }, "readonly": false, - "desc": "Rotate the Arranger address", + "desc": "Rotate the arranger address.", "events": [], "recommendations": {} }, @@ -43,12 +61,12 @@ { "type": "address", "name": "address", - "desc": "Operation Daemon address" + "desc": "Operation daemon address." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the role assignment" + "desc": "UNIX timestamp of the role assignment." }, "actions": { "create": [], @@ -57,7 +75,7 @@ ] }, "readonly": false, - "desc": "Non-Normative: Set the Operation Daemon address", + "desc": "Non-normative helper to set the operation daemon address.", "events": [], "recommendations": {} }, @@ -67,22 +85,23 @@ { "type": "uint8", "name": "role_id", - "desc": "Role Identifier" + "desc": "Role identifier." }, { "type": "address", "name": "role_address", - "desc": "Account Role Address" + "desc": "Account role address." }, { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" + "type": "(uint64,uint64)", + "struct": "RoleValidity", + "name": "validity", + "desc": "Inclusive validity interval for the assignment." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the role assignment" + "desc": "UNIX timestamp of the role assignment." }, "actions": { "create": [], @@ -91,7 +110,7 @@ ] }, "readonly": false, - "desc": "Assign a role to an address", + "desc": "Assign a role to an address.", "events": [], "recommendations": {} }, @@ -101,17 +120,17 @@ { "type": "uint8", "name": "role_id", - "desc": "Role Identifier" + "desc": "Role identifier." }, { "type": "address", "name": "role_address", - "desc": "Account Role Address" + "desc": "Account role address." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the role revocation" + "desc": "UNIX timestamp of the role revocation." }, "actions": { "create": [], @@ -120,22 +139,45 @@ ] }, "readonly": false, - "desc": "Revoke a role from an address", + "desc": "Revoke a role from an address.", "events": [], "recommendations": {} }, { - "name": "rbac_gov_asset_suspension", + "name": "rbac_contract_suspension", "args": [ { "type": "bool", "name": "suspended", - "desc": "Suspension status" + "desc": "Suspension status to apply." } ], "returns": { "type": "uint64", - "desc": "Timestamp of the set asset suspension status" + "desc": "UNIX timestamp of the suspension update." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set the asset-wide suspension status.", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_contract_default", + "args": [ + { + "type": "bool", + "name": "defaulted", + "desc": "Default status" + } + ], + "returns": { + "type": "uint64" }, "actions": { "create": [], @@ -144,7 +186,7 @@ ] }, "readonly": false, - "desc": "Set asset suspension status", + "desc": "Set D-ASA default status", "events": [], "recommendations": {} }, @@ -153,7 +195,7 @@ "args": [], "returns": { "type": "address", - "desc": "Arranger address" + "desc": "Current arranger address." }, "actions": { "create": [], @@ -162,7 +204,7 @@ ] }, "readonly": true, - "desc": "Get Arranger address", + "desc": "Get the arranger address.", "events": [], "recommendations": {} }, @@ -172,12 +214,12 @@ { "type": "address", "name": "address", - "desc": "Address to get roles for" + "desc": "Address to query." } ], "returns": { "type": "(bool,bool,bool,bool,bool)", - "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)" + "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer." }, "actions": { "create": [], @@ -186,28 +228,28 @@ ] }, "readonly": true, - "desc": "Non-normative - Get roles assigned to an address", + "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "recommendations": {} }, { - "name": "rbac_get_role_config", + "name": "rbac_get_role_validity", "args": [ { "type": "uint8", "name": "role_id", - "desc": "Role Identifier" + "desc": "Role identifier." }, { "type": "address", "name": "role_address", - "desc": "Account Role Address" + "desc": "Account role address." } ], "returns": { "type": "(uint64,uint64)", - "struct": "RoleConfig", - "desc": "Role configuration" + "struct": "RoleValidity", + "desc": "Stored role validity interval." }, "actions": { "create": [], @@ -216,7 +258,7 @@ ] }, "readonly": true, - "desc": "Get role configuration", + "desc": "Get the stored validity interval for a role assignment.", "events": [], "recommendations": {} } @@ -243,22 +285,22 @@ "arranger": { "keyType": "AVMBytes", "valueType": "address", - "key": "UjIwIw==" + "key": "UjpBUlIj" }, "op_daemon": { "keyType": "AVMBytes", "valueType": "address", - "key": "UjI1Iw==" + "key": "UjpPUEQj" }, - "asset_suspended": { + "contract_suspended": { "keyType": "AVMString", "valueType": "AVMUint64", - "key": "YXNzZXRfc3VzcGVuZGVk" + "key": "Y29udHJhY3Rfc3VzcGVuZGVk" }, - "asset_defaulted": { + "defaulted": { "keyType": "AVMString", "valueType": "AVMUint64", - "key": "YXNzZXRfZGVmYXVsdGVk" + "key": "ZGVmYXVsdGVk" } }, "local": {}, @@ -270,28 +312,28 @@ "box": { "account_manager": { "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjQwIw==" + "valueType": "RoleValidity", + "prefix": "UjpNTkcj" }, "primary_dealer": { "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjUwIw==" + "valueType": "RoleValidity", + "prefix": "UjpQWUQj" }, "trustee": { "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjYwIw==" + "valueType": "RoleValidity", + "prefix": "UjpUUlMj" }, "authority": { "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjcwIw==" + "valueType": "RoleValidity", + "prefix": "UjpBVVQj" }, - "interest_oracle": { + "observer": { "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjgwIw==" + "valueType": "RoleValidity", + "prefix": "UjpNT0Mj" } } } @@ -307,101 +349,97 @@ "sourceInfo": [ { "pc": [ - 897 + 968 ], "errorMessage": "Defaulted" }, { "pc": [ - 322, - 346, - 370, - 393, - 417, - 472, - 500, - 522, - 543, - 565, - 741, - 758, - 773, - 788, - 802 + 364, + 388, + 411, + 434, + 458, + 514, + 542, + 563, + 584, + 606, + 812, + 829, + 843, + 858, + 873 ], "errorMessage": "Invalid account role address" }, { "pc": [ - 457, - 731, - 950 + 498, + 802, + 1029 ], "errorMessage": "Invalid role identifier" }, { "pc": [ - 587, - 889 + 628, + 658, + 960 ], "errorMessage": "Not authorized" }, { "pc": [ - 849, - 864 + 920, + 935 ], "errorMessage": "check BoxMap entry exists" }, { "pc": [ - 604, - 887 + 675, + 958 ], "errorMessage": "check self.arranger exists" }, { "pc": [ - 895 - ], - "errorMessage": "check self.asset_defaulted exists" - }, - { - "pc": [ - 263 + 966 ], - "errorMessage": "invalid array length header" + "errorMessage": "check self.defaulted exists" }, { "pc": [ - 578 + 619, + 649 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ - 271 + 248, + 271, + 305, + 482, + 689, + 772 ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" + "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ - 200, - 223, - 257, - 441, - 618, - 701 + 295, + 472, + 762 ], - "errorMessage": "invalid number of bytes for arc4.static_array" + "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [ - 247, - 431, - 691 + 316 ], - "errorMessage": "invalid number of bytes for arc4.uint8" + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity" } ], "pcOffsetMethod": "none" @@ -412,11 +450,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzIzMDIzIDB4NTIzNzMwMjMgMHg1MjM0MzAyMyAweDUyMzUzMDIzIDB4NTIzNjMwMjMgMHg1MjM4MzAyMyAweDUyMzIzNTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAtMzEKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMgogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDcgLy8gMHg1MjMyMzUyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIEQtQVNBIEdvdmVybmFuY2UKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA5IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMTcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCByYmFjX3JvdGF0ZV9hcnJhbmdlciByYmFjX3NldF9vcF9kYWVtb24gcmJhY19hc3NpZ25fcm9sZSByYmFjX3Jldm9rZV9yb2xlIHJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX2NvbmZpZwogICAgZXJyCgptYWluX2NyZWF0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3NAogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA3IC8vIDB4NTIzMjM1MjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDEKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMzUzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOQogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMzgzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjQKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgaW50Y18zIC8vIDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQxCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMzgzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGRlbCBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTcKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjczCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyA0IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjM2MzAyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGFkZHJlc3MpLAogICAgYnl0ZWMgNiAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV9jb25maWc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk0CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTcKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk2LTMyNwogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNwogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDYgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIwCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzCiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNSAvLyAweDUyMzYzMDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEyLTMxNAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE1CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA0IC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMi0zMDQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk4LTMwMAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3JvbGVfaXNfYWN0aXZlKHJvbGVfbWFwOiBieXRlcywgcm9sZV9hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogpfcm9sZV9pc19hY3RpdmU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIGRlZiBfcm9sZV9pc19hY3RpdmUoc2VsZiwgcm9sZV9tYXA6IHR5cC5SYmFjUm9sZSwgcm9sZV9hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTkKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjAKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANwoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDg6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA4Cg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E0ZDRmNDMyMyAiZGVmYXVsdGVkIiAweDUyM2E0ZjUwNDQyMyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgOCAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIENvbnRyYWN0IEdvdmVybmFuY2UKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDkgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMjAKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3RfZGVmYXVsdChib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfY29udHJhY3RfZGVmYXVsdCByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKbWFpbl9jcmVhdGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MS0xNjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDUKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUxCiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIGludGNfMyAvLyAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBkZWwgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzkKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzEKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA5IC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDEKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIyCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ2CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NwogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUzCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0OC0zNzkKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3OQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NQogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjktMzcxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3MgogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NQogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjQtMzY2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjcKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYwCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQtMzU2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYyLTYzCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEtNjMKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMCAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTY0CiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjcKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU0CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CyAEAQAgFCYKBBUffHUEUjIwIwRSNzAjBFI0MCMEUjUwIwRSNjAjBFI4MCMEUjI1Iw9hc3NldF9zdXNwZW5kZWQPYXNzZXRfZGVmYXVsdGVkMRhAABEpMgNnJwcyA2cnCCNnJwkjZzEbQQBHMRkURDEYRIIIBIL3Gy0E7wT10wQDuDMpBD2+gL0E31ToLAQBDIKZBHQGrNIEw+SylzYaAI4IAA8AJgA+APYBiQGnAbEB+gAxGRQxGBQQRCkxAGciQzYaAUkVJBJEiAKmKUxnMgcWKExQsCJDNhoBSRUkEkSIAo8nB0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSSNZgQIISwEVEkRXAgBMiAJbiAJhF0cCiAJjJRJBAA0pSwNnMgcWKExQsCJDSYEoEkEAECtLA1BJvUUBFERLAr9C/+BJgTISQQARJwRLA1BJvUUBFERLAr9C/8hJgTwSQQARJwVLA1BJvUUBFERLAr9C/7BJgUYSQQAQKksDUEm9RQEUREsCv0L/mUmBUBJB/5InBksDUEm9RQEUREsCv0L/gTYaAUkVIhJENhoCSU4CFSQSRIgBtYgBuxdHAogBvUklE0SBKBJBABQrSwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBEsCUEm9RQFEvEhC/+FJgTwSQQAPJwVLAlBJvUUBRLxIQv/LSYFGEkEADipLAlBJvUUBRLxIQv+2SYFQEkH/rycGSwJQSb1FAUS8SEL/oDYaAUkVIhJEI1MqMQCIAPJEJwhMZzIHFihMULAiQyMpZUQoTFCwIkM2GgFJFSQSRCtLAYgAzCcESwKIAMUnBUsDiAC+KksEiAC4JwZPBYgAsYABACNPBlQiTwVUgQJPBFSBA08DVIEETwJUKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJEF0mIAMAlgwUoMjxGUE8GjgYATQA/ADAAIQATAAEAJwZLAVBJvUUBRL5IKExQsCJDKksBUEm9RQFEvkhC/+wnBUsBUEm9RQFEvkhC/90nBEsBUEm9RQFEvkhC/84rSwFQSb1FAUS+SEL/wIAQAAAAAAAAAAAAAAAAAAAAAEL/q4oCAYAAi/6L/1BJvUUBQQAgiwG+RCNbMgdJjAAOQQARiwG+RIEIW4sAD0EABCKMAIkjQv/5MQAjKWVEEkSJIycJZUQURImKAQCL/yUSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyJEiSNC//o=", + "approval": "CyAEAQAgFCYKBBUffHUGUjpBUlIjBlI6VFJTIwZSOkFVVCMGUjpNTkcjBlI6UFlEIwZSOk1PQyMJZGVmYXVsdGVkBlI6T1BEIxJjb250cmFjdF9zdXNwZW5kZWQxGEAAESkyA2cnCDIDZycJI2cnByNnMRtBAGeABJFPBOs2GgCOAQBOMRkURDEYRIIJBIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQ5JB+jBAEMgpkEdAas0gQacqLuNhoAjgkAIAA3AE8BAAGTAbEBzwHZAiIAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAsoiQzYaAUkVJBJEiAK9KUxnMgcWKExQsCJDNhoBSRUkEkSIAqYnCExnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAnmIAn8XRwKIAoElEkEADSlLA2cyBxYoTFCwIkNJgSgSQQARJwRLA1BJvUUBFERLAr9C/99JgTISQQARJwVLA1BJvUUBFERLAr9C/8dJgTwSQQAQKksDUEm9RQEUREsCv0L/sEmBRhJBABArSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAHTiAHZF0cCiAHbSSUTRIEoEkEAFScESwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBUsCUEm9RQFEvEhC/+FJgTwSQQAOKksCUEm9RQFEvEhC/8xJgUYSQQAOK0sCUEm9RQFEvEhC/7dJgVASQf+wJwZLAlBJvUUBRLxIQv+hNhoBSRUiEkQjUysxAIgBEEQnCUxnMgcWKExQsCJDNhoBSRUiEkQjUyoxAIgA8kQnB0xnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEJwRLAYgAyycFSwKIAMQqSwOIAL4rSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD4ALwAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMrSwFQSb1FAUS+SEL/7CpLAVBJvUUBRL5IQv/eJwVLAVBJvUUBRL5IQv/PJwRLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwdlRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", "clear": "C4EBQw==" }, "compilerInfo": { diff --git a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_avm_client.py b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_avm_client.py new file mode 100644 index 00000000..e2b93855 --- /dev/null +++ b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_avm_client.py @@ -0,0 +1,108 @@ +# This file is auto-generated, do not modify +# flake8: noqa +# fmt: off +import typing + +import algopy + +class RoleValidity(algopy.arc4.Struct): + role_validity_start: algopy.arc4.UIntN[typing.Literal[64]] + role_validity_end: algopy.arc4.UIntN[typing.Literal[64]] + +class MockRbacModule(algopy.arc4.ARC4Client, typing.Protocol): + """ + + RBAC Module for testing + + """ + @algopy.arc4.abimethod(allow_actions=['UpdateApplication']) + def contract_update( + self, + ) -> None: + """ + Update D-ASA application. + """ + + @algopy.arc4.abimethod + def rbac_rotate_arranger( + self, + new_arranger: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Rotate the arranger address. + """ + + @algopy.arc4.abimethod + def rbac_set_op_daemon( + self, + address: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Non-normative helper to set the operation daemon address. + """ + + @algopy.arc4.abimethod + def rbac_assign_role( + self, + role_id: algopy.arc4.UIntN[typing.Literal[8]], + role_address: algopy.arc4.Address, + validity: RoleValidity, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Assign a role to an address. + """ + + @algopy.arc4.abimethod + def rbac_revoke_role( + self, + role_id: algopy.arc4.UIntN[typing.Literal[8]], + role_address: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Revoke a role from an address. + """ + + @algopy.arc4.abimethod + def rbac_contract_suspension( + self, + suspended: algopy.arc4.Bool, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Set the asset-wide suspension status. + """ + + @algopy.arc4.abimethod + def rbac_contract_default( + self, + defaulted: algopy.arc4.Bool, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Set D-ASA default status + """ + + @algopy.arc4.abimethod(readonly=True) + def rbac_get_arranger( + self, + ) -> algopy.arc4.Address: + """ + Get the arranger address. + """ + + @algopy.arc4.abimethod(readonly=True) + def rbac_get_address_roles( + self, + address: algopy.arc4.Address, + ) -> algopy.arc4.Tuple[algopy.arc4.Bool, algopy.arc4.Bool, algopy.arc4.Bool, algopy.arc4.Bool, algopy.arc4.Bool]: + """ + Non-normative helper to get the active roles assigned to an address. + """ + + @algopy.arc4.abimethod(readonly=True) + def rbac_get_role_validity( + self, + role_id: algopy.arc4.UIntN[typing.Literal[8]], + role_address: algopy.arc4.Address, + ) -> RoleValidity: + """ + Get the stored validity interval for a role assignment. + """ diff --git a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py index 6e6b1228..77744888 100644 --- a/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py +++ b/smart_contracts/artifacts/mock_module_rbac/mock_rbac_module_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_config", "returns": {"type": "(uint64,uint64)", "desc": "Role configuration", "struct": "RoleConfig"}, "desc": "Get role configuration", "events": [], "readonly": true, "recommendations": {}}], "name": "MockRbacModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjI1Iw==", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 2}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYKBBUffHUEUjIwIwRSNzAjBFI0MCMEUjUwIwRSNjAjBFI4MCMEUjI1Iw9hc3NldF9zdXNwZW5kZWQPYXNzZXRfZGVmYXVsdGVkMRhAABEpMgNnJwcyA2cnCCNnJwkjZzEbQQBHMRkURDEYRIIIBIL3Gy0E7wT10wQDuDMpBD2+gL0E31ToLAQBDIKZBHQGrNIEw+SylzYaAI4IAA8AJgA+APYBiQGnAbEB+gAxGRQxGBQQRCkxAGciQzYaAUkVJBJEiAKmKUxnMgcWKExQsCJDNhoBSRUkEkSIAo8nB0xnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSSNZgQIISwEVEkRXAgBMiAJbiAJhF0cCiAJjJRJBAA0pSwNnMgcWKExQsCJDSYEoEkEAECtLA1BJvUUBFERLAr9C/+BJgTISQQARJwRLA1BJvUUBFERLAr9C/8hJgTwSQQARJwVLA1BJvUUBFERLAr9C/7BJgUYSQQAQKksDUEm9RQEUREsCv0L/mUmBUBJB/5InBksDUEm9RQEUREsCv0L/gTYaAUkVIhJENhoCSU4CFSQSRIgBtYgBuxdHAogBvUklE0SBKBJBABQrSwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBEsCUEm9RQFEvEhC/+FJgTwSQQAPJwVLAlBJvUUBRLxIQv/LSYFGEkEADipLAlBJvUUBRLxIQv+2SYFQEkH/rycGSwJQSb1FAUS8SEL/oDYaAUkVIhJEI1MqMQCIAPJEJwhMZzIHFihMULAiQyMpZUQoTFCwIkM2GgFJFSQSRCtLAYgAzCcESwKIAMUnBUsDiAC+KksEiAC4JwZPBYgAsYABACNPBlQiTwVUgQJPBFSBA08DVIEETwJUKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJEF0mIAMAlgwUoMjxGUE8GjgYATQA/ADAAIQATAAEAJwZLAVBJvUUBRL5IKExQsCJDKksBUEm9RQFEvkhC/+wnBUsBUEm9RQFEvkhC/90nBEsBUEm9RQFEvkhC/84rSwFQSb1FAUS+SEL/wIAQAAAAAAAAAAAAAAAAAAAAAEL/q4oCAYAAi/6L/1BJvUUBQQAgiwG+RCNbMgdJjAAOQQARiwG+RIEIW4sAD0EABCKMAIkjQv/5MQAjKWVEEkSJIycJZUQURImKAQCL/yUSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyJEiSNC//o=", "clear": "C4EBQw=="}, "desc": "\n RBAC Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzIzMDIzIDB4NTIzNzMwMjMgMHg1MjM0MzAyMyAweDUyMzUzMDIzIDB4NTIzNjMwMjMgMHg1MjM4MzAyMyAweDUyMzIzNTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAtMzEKICAgIC8vICMgUkJBQyBSb2xlcwogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMgogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDcgLy8gMHg1MjMyMzUyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIEQtQVNBIEdvdmVybmFuY2UKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA5IC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMTcKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCByYmFjX3JvdGF0ZV9hcnJhbmdlciByYmFjX3NldF9vcF9kYWVtb24gcmJhY19hc3NpZ25fcm9sZSByYmFjX3Jldm9rZV9yb2xlIHJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb24gcmJhY19nZXRfYXJyYW5nZXIgcmJhY19nZXRfYWRkcmVzc19yb2xlcyByYmFjX2dldF9yb2xlX2NvbmZpZwogICAgZXJyCgptYWluX2NyZWF0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6MTYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcm90YXRlX2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yb3RhdGVfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE1OQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3MwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3NAogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA3IC8vIDB4NTIzMjM1MjMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfYXNzaWduX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2Fzc2lnbl9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDEKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXBuIDIKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTAxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBpbnRjXzMgLy8gMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA3CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNCAvLyAweDUyMzUzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTEKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOQogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMzgzMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3Jldm9rZV9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19yZXZva2Vfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjQKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjUKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksIGVyci5JTlZBTElEX1JPTEUKICAgIGR1cAogICAgaW50Y18zIC8vIDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI5CiAgICAvLyBkZWwgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMwogICAgLy8gZGVsIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzNgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQxCiAgICAvLyBkZWwgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNiAvLyAweDUyMzgzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDUKICAgIC8vIGRlbCBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kICAjIFRPRE86IFVwZGF0ZSBzcGVjcyBhbmQgYWRkIHRlc3QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDggLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ3CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCAgIyBUT0RPOiBVcGRhdGUgc3BlY3MgYW5kIGFkZCB0ZXN0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTcKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hZGRyZXNzX3JvbGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYWRkcmVzc19yb2xlczoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjczCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgYWRkcmVzcyksCiAgICBieXRlY18zIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyA0IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjM2MzAyMwogICAgZGlnIDMKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc2CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgYWRkcmVzcyksCiAgICBieXRlY18yIC8vIDB4NTIzNzMwMjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGFkZHJlc3MpLAogICAgYnl0ZWMgNiAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfcm9sZV9jb25maWc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk0CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTcKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk2LTMyNwogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICAgICAgICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDIgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDUgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNwogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzVANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjMKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDYgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjM3MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIwCiAgICAvLyByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8zQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEzCiAgICAvLyBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNSAvLyAweDUyMzYzMDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEyLTMxNAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzE1CiAgICAvLyByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwOAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA0IC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjM0MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMi0zMDQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8wQDI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk4LTMwMAogICAgLy8gcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3JvbGVfaXNfYWN0aXZlKHJvbGVfbWFwOiBieXRlcywgcm9sZV9hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogpfcm9sZV9pc19hY3RpdmU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIGRlZiBfcm9sZV9pc19hY3RpdmUoc2VsZiwgcm9sZV9tYXA6IHR5cC5SYmFjUm9sZSwgcm9sZV9hZGRyZXNzOiBBY2NvdW50KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OC02MgogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTkKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjAKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTktNjEKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18wIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgOSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MwogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANwoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDg6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA4Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [897], "errorMessage": "Defaulted"}, {"pc": [322, 346, 370, 393, 417, 472, 500, 522, 543, 565, 741, 758, 773, 788, 802], "errorMessage": "Invalid account role address"}, {"pc": [457, 731, 950], "errorMessage": "Invalid role identifier"}, {"pc": [587, 889], "errorMessage": "Not authorized"}, {"pc": [849, 864], "errorMessage": "check BoxMap entry exists"}, {"pc": [604, 887], "errorMessage": "check self.arranger exists"}, {"pc": [895], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [263], "errorMessage": "invalid array length header"}, {"pc": [578], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [271], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [200, 223, 257, 441, 618, 701], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [247, 431, 691], "errorMessage": "invalid number of bytes for arc4.uint8"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": ["NoOp"]}, "methods": [{"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "rbac_contract_default", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "MockRbacModule", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "contract_suspended": {"key": "Y29udHJhY3Rfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 2}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "CyAEAQAgFCYKBBUffHUGUjpBUlIjBlI6VFJTIwZSOkFVVCMGUjpNTkcjBlI6UFlEIwZSOk1PQyMJZGVmYXVsdGVkBlI6T1BEIxJjb250cmFjdF9zdXNwZW5kZWQxGEAAESkyA2cnCDIDZycJI2cnByNnMRtBAGeABJFPBOs2GgCOAQBOMRkURDEYRIIJBIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQ5JB+jBAEMgpkEdAas0gQacqLuNhoAjgkAIAA3AE8BAAGTAbEBzwHZAiIAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAsoiQzYaAUkVJBJEiAK9KUxnMgcWKExQsCJDNhoBSRUkEkSIAqYnCExnMgcWKExQsCJDNhoBSRUiEkQ2GgJJTgIVJBJENhoDSU4CFYEQEkSIAnmIAn8XRwKIAoElEkEADSlLA2cyBxYoTFCwIkNJgSgSQQARJwRLA1BJvUUBFERLAr9C/99JgTISQQARJwVLA1BJvUUBFERLAr9C/8dJgTwSQQAQKksDUEm9RQEUREsCv0L/sEmBRhJBABArSwNQSb1FARRESwK/Qv+ZSYFQEkH/kicGSwNQSb1FARRESwK/Qv+BNhoBSRUiEkQ2GgJJTgIVJBJEiAHTiAHZF0cCiAHbSSUTRIEoEkEAFScESwJQSb1FAUS8SDIHFihMULAiQ0mBMhJBAA8nBUsCUEm9RQFEvEhC/+FJgTwSQQAOKksCUEm9RQFEvEhC/8xJgUYSQQAOK0sCUEm9RQFEvEhC/7dJgVASQf+wJwZLAlBJvUUBRLxIQv+hNhoBSRUiEkQjUysxAIgBEEQnCUxnMgcWKExQsCJDNhoBSRUiEkQjUyoxAIgA8kQnB0xnMgcWKExQsCJDIyllRChMULAiQzYaAUkVJBJEJwRLAYgAyycFSwKIAMQqSwOIAL4rSwSIALgnBk8FiACxgAEAI08GVCJPBVSBAk8EVIEDTwNUgQRPAlQoTFCwIkM2GgFJFSISRDYaAklOAhUkEkQXSYgAwCWDBSgyPEZQTwaOBgBNAD4ALwAhABMAAQAnBksBUEm9RQFEvkgoTFCwIkMrSwFQSb1FAUS+SEL/7CpLAVBJvUUBRL5IQv/eJwVLAVBJvUUBRL5IQv/PJwRLAVBJvUUBRL5IQv/AgBAAAAAAAAAAAAAAAAAAAAAAQv+rigIBgACL/ov/UEm9RQFBACCLAb5EI1syB0mMAA5BABGLAb5EgQhbiwAPQQAEIowAiSNC//kxACMpZUQSRIkjJwdlRBREiYoBAIv/JRJAADCL/4EZEkAAKIv/gSgSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", "clear": "C4EBQw=="}, "desc": "\n RBAC Module for testing\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgMjAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E0ZDRmNDMyMyAiZGVmYXVsdGVkIiAweDUyM2E0ZjUwNDQyMyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgOCAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIENvbnRyYWN0IEdvdmVybmFuY2UKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDkgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMjAKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3RfZGVmYXVsdChib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfY29udHJhY3RfZGVmYXVsdCByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKbWFpbl9jcmVhdGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MS0xNjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODIKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTgKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDUKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjNhNDE1MjUyMjMKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgNSAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE0CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExOAogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjQ5CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUxCiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIGludGNfMyAvLyAyMAogICAgIT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBkZWwgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzkKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzEKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA5IC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjg3CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDEKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIyCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ2CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NwogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDkKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgaW50Y18zIC8vIDIwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzUzCiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0OC0zNzkKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA2CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzVANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3OQogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NQogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjktMzcxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3MgogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NQogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjQtMzY2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjcKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYwCiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTQtMzU2CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiB0eXAuUm9sZVZhbGlkaXR5KAogICAgLy8gICAgIHJvbGVfdmFsaWRpdHlfc3RhcnQ9VUludDY0KDApLCByb2xlX3ZhbGlkaXR5X2VuZD1VSW50NjQoMCkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYyLTYzCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEtNjMKICAgIC8vIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMCAvLyAxCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTY0CiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjcKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU0CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTIKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIGludGNfMyAvLyAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzAgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [968], "errorMessage": "Defaulted"}, {"pc": [364, 388, 411, 434, 458, 514, 542, 563, 584, 606, 812, 829, 843, 858, 873], "errorMessage": "Invalid account role address"}, {"pc": [498, 802, 1029], "errorMessage": "Invalid role identifier"}, {"pc": [628, 658, 960], "errorMessage": "Not authorized"}, {"pc": [920, 935], "errorMessage": "check BoxMap entry exists"}, {"pc": [675, 958], "errorMessage": "check self.arranger exists"}, {"pc": [966], "errorMessage": "check self.defaulted exists"}, {"pc": [619, 649], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [248, 271, 305, 482, 689, 772], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [295, 472, 762], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [316], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: object | None = None) -> list[object] | None: @@ -65,8 +65,8 @@ def _init_dataclass(cls: type, data: dict) -> object: return cls(**field_values) @dataclasses.dataclass(frozen=True) -class RoleConfig: - """Struct for RoleConfig""" +class RoleValidity: + """Struct for RoleValidity""" role_validity_start: int role_validity_end: int @@ -94,11 +94,11 @@ class RbacAssignRoleArgs: """Dataclass for rbac_assign_role arguments""" role_id: int role_address: str - config: bytes | str + validity: RoleValidity @property def abi_method_signature(self) -> str: - return "rbac_assign_role(uint8,address,byte[])uint64" + return "rbac_assign_role(uint8,address,(uint64,uint64))uint64" @dataclasses.dataclass(frozen=True, kw_only=True) class RbacRevokeRoleArgs: @@ -111,13 +111,22 @@ def abi_method_signature(self) -> str: return "rbac_revoke_role(uint8,address)uint64" @dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGovAssetSuspensionArgs: - """Dataclass for rbac_gov_asset_suspension arguments""" +class RbacContractSuspensionArgs: + """Dataclass for rbac_contract_suspension arguments""" suspended: bool @property def abi_method_signature(self) -> str: - return "rbac_gov_asset_suspension(bool)uint64" + return "rbac_contract_suspension(bool)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacContractDefaultArgs: + """Dataclass for rbac_contract_default arguments""" + defaulted: bool + + @property + def abi_method_signature(self) -> str: + return "rbac_contract_default(bool)uint64" @dataclasses.dataclass(frozen=True, kw_only=True) class RbacGetAddressRolesArgs: @@ -129,20 +138,42 @@ def abi_method_signature(self) -> str: return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" @dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetRoleConfigArgs: - """Dataclass for rbac_get_role_config arguments""" +class RbacGetRoleValidityArgs: + """Dataclass for rbac_get_role_validity arguments""" role_id: int role_address: str @property def abi_method_signature(self) -> str: - return "rbac_get_role_config(uint8,address)(uint64,uint64)" + return "rbac_get_role_validity(uint8,address)(uint64,uint64)" + + +class _MockRbacModuleUpdate: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppUpdateMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() + return self.app_client.params.update(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_update()void", + })) class MockRbacModuleParams: def __init__(self, app_client: algokit_utils.AppClient): self.app_client = app_client + @property + def update(self) -> "_MockRbacModuleUpdate": + return _MockRbacModuleUpdate(self.app_client) + def rbac_rotate_arranger( self, args: tuple[str] | RbacRotateArrangerArgs, @@ -171,14 +202,14 @@ def rbac_set_op_daemon( def rbac_assign_role( self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.AppCallMethodCallParams: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", "args": method_args, })) @@ -195,16 +226,29 @@ def rbac_revoke_role( "args": method_args, })) - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractSuspensionArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.AppCallMethodCallParams: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", + "method": "rbac_contract_suspension(bool)uint64", + "args": method_args, + })) + + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", "args": method_args, })) @@ -232,16 +276,16 @@ def rbac_get_address_roles( "args": method_args, })) - def rbac_get_role_config( + def rbac_get_role_validity( self, - args: tuple[int, str] | RbacGetRoleConfigArgs, + args: tuple[int, str] | RbacGetRoleValidityArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.AppCallMethodCallParams: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", "args": method_args, })) @@ -256,10 +300,32 @@ def clear_state( ) +class _MockRbacModuleUpdateTransaction: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() + return self.app_client.create_transaction.update(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_update()void", + })) + + class MockRbacModuleCreateTransactionParams: def __init__(self, app_client: algokit_utils.AppClient): self.app_client = app_client + @property + def update(self) -> "_MockRbacModuleUpdateTransaction": + return _MockRbacModuleUpdateTransaction(self.app_client) + def rbac_rotate_arranger( self, args: tuple[str] | RbacRotateArrangerArgs, @@ -288,14 +354,14 @@ def rbac_set_op_daemon( def rbac_assign_role( self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.BuiltTransactions: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", "args": method_args, })) @@ -312,16 +378,29 @@ def rbac_revoke_role( "args": method_args, })) - def rbac_gov_asset_suspension( + def rbac_contract_suspension( + self, + args: tuple[bool] | RbacContractSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_suspension(bool)uint64", + "args": method_args, + })) + + def rbac_contract_default( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractDefaultArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.BuiltTransactions: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", + "method": "rbac_contract_default(bool)uint64", "args": method_args, })) @@ -349,16 +428,16 @@ def rbac_get_address_roles( "args": method_args, })) - def rbac_get_role_config( + def rbac_get_role_validity( self, - args: tuple[int, str] | RbacGetRoleConfigArgs, + args: tuple[int, str] | RbacGetRoleValidityArgs, params: algokit_utils.CommonAppCallParams | None = None ) -> algokit_utils.BuiltTransactions: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", "args": method_args, })) @@ -373,10 +452,35 @@ def clear_state( ) +class _MockRbacModuleUpdateSend: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.SendAppTransactionResult[None]: + + params = params or algokit_utils.CommonAppCallParams() + compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() + response = self.app_client.send.update(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_update()void", + }), send_params=send_params, compilation_params=compilation_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppUpdateTransactionResult[None], parsed_response) + + class MockRbacModuleSend: def __init__(self, app_client: algokit_utils.AppClient): self.app_client = app_client + @property + def update(self) -> "_MockRbacModuleUpdateSend": + return _MockRbacModuleUpdateSend(self.app_client) + def rbac_rotate_arranger( self, args: tuple[str] | RbacRotateArrangerArgs, @@ -411,7 +515,7 @@ def rbac_set_op_daemon( def rbac_assign_role( self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, params: algokit_utils.CommonAppCallParams | None = None, send_params: algokit_utils.SendParams | None = None ) -> algokit_utils.SendAppTransactionResult[int]: @@ -419,7 +523,7 @@ def rbac_assign_role( params = params or algokit_utils.CommonAppCallParams() response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", "args": method_args, }), send_params=send_params) parsed_response = response @@ -441,9 +545,25 @@ def rbac_revoke_role( parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - def rbac_gov_asset_suspension( + def rbac_contract_suspension( + self, + args: tuple[bool] | RbacContractSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_suspension(bool)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_contract_default( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractDefaultArgs, params: algokit_utils.CommonAppCallParams | None = None, send_params: algokit_utils.SendParams | None = None ) -> algokit_utils.SendAppTransactionResult[int]: @@ -451,7 +571,7 @@ def rbac_gov_asset_suspension( params = params or algokit_utils.CommonAppCallParams() response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", + "method": "rbac_contract_default(bool)uint64", "args": method_args, }), send_params=send_params) parsed_response = response @@ -487,21 +607,21 @@ def rbac_get_address_roles( parsed_response = response return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) - def rbac_get_role_config( + def rbac_get_role_validity( self, - args: tuple[int, str] | RbacGetRoleConfigArgs, + args: tuple[int, str] | RbacGetRoleValidityArgs, params: algokit_utils.CommonAppCallParams | None = None, send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[RoleConfig]: + ) -> algokit_utils.SendAppTransactionResult[RoleValidity]: method_args = _parse_abi_args(args) params = params or algokit_utils.CommonAppCallParams() response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", "args": method_args, }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleConfig, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[RoleConfig], parsed_response) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleValidity, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[RoleValidity], parsed_response) def clear_state( self, @@ -518,8 +638,8 @@ class GlobalStateValue(typing.TypedDict): """Shape of global_state state key values""" arranger: str op_daemon: str - asset_suspended: int - asset_defaulted: int + contract_suspended: int + defaulted: int class MockRbacModuleState: """Methods to access state for the current MockRbacModule app""" @@ -581,17 +701,17 @@ def op_daemon(self) -> str: return typing.cast(str, value) @property - def asset_suspended(self) -> int: - """Get the current value of the asset_suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_suspended") + def contract_suspended(self) -> int: + """Get the current value of the contract_suspended key in global_state state""" + value = self.app_client.state.global_state.get_value("contract_suspended") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore return typing.cast(int, value) @property - def asset_defaulted(self) -> int: - """Get the current value of the asset_defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_defaulted") + def defaulted(self) -> int: + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore return typing.cast(int, value) @@ -602,7 +722,7 @@ def __init__(self, app_client: algokit_utils.AppClient): # Pre-generated mapping of value types to their struct classes self._struct_classes: dict[str, typing.Type[typing.Any]] = { - "RoleConfig": RoleConfig + "RoleValidity": RoleValidity } def get_all(self) -> dict[str, typing.Any]: @@ -622,48 +742,48 @@ def get_all(self) -> dict[str, typing.Any]: return converted @property - def account_manager(self) -> "_MapState[str, RoleConfig]": + def account_manager(self) -> "_MapState[str, RoleValidity]": """Get values from the account_manager map in box state""" return _MapState( self.app_client.state.box, "account_manager", - self._struct_classes.get("RoleConfig") + self._struct_classes.get("RoleValidity") ) @property - def primary_dealer(self) -> "_MapState[str, RoleConfig]": + def primary_dealer(self) -> "_MapState[str, RoleValidity]": """Get values from the primary_dealer map in box state""" return _MapState( self.app_client.state.box, "primary_dealer", - self._struct_classes.get("RoleConfig") + self._struct_classes.get("RoleValidity") ) @property - def trustee(self) -> "_MapState[str, RoleConfig]": + def trustee(self) -> "_MapState[str, RoleValidity]": """Get values from the trustee map in box state""" return _MapState( self.app_client.state.box, "trustee", - self._struct_classes.get("RoleConfig") + self._struct_classes.get("RoleValidity") ) @property - def authority(self) -> "_MapState[str, RoleConfig]": + def authority(self) -> "_MapState[str, RoleValidity]": """Get values from the authority map in box state""" return _MapState( self.app_client.state.box, "authority", - self._struct_classes.get("RoleConfig") + self._struct_classes.get("RoleValidity") ) @property - def interest_oracle(self) -> "_MapState[str, RoleConfig]": - """Get values from the interest_oracle map in box state""" + def observer(self) -> "_MapState[str, RoleValidity]": + """Get values from the observer map in box state""" return _MapState( self.app_client.state.box, - "interest_oracle", - self._struct_classes.get("RoleConfig") + "observer", + self._struct_classes.get("RoleValidity") ) _KeyType = typing.TypeVar("_KeyType") @@ -859,7 +979,7 @@ def decode_return_value( @typing.overload def decode_return_value( self, - method: typing.Literal["rbac_assign_role(uint8,address,byte[])uint64"], + method: typing.Literal["rbac_assign_role(uint8,address,(uint64,uint64))uint64"], return_value: algokit_utils.ABIReturn | None ) -> int | None: ... @typing.overload @@ -871,7 +991,13 @@ def decode_return_value( @typing.overload def decode_return_value( self, - method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], + method: typing.Literal["rbac_contract_suspension(bool)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_contract_default(bool)uint64"], return_value: algokit_utils.ABIReturn | None ) -> int | None: ... @typing.overload @@ -889,9 +1015,15 @@ def decode_return_value( @typing.overload def decode_return_value( self, - method: typing.Literal["rbac_get_role_config(uint8,address)(uint64,uint64)"], + method: typing.Literal["rbac_get_role_validity(uint8,address)(uint64,uint64)"], + return_value: algokit_utils.ABIReturn | None + ) -> RoleValidity | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_update()void"], return_value: algokit_utils.ABIReturn | None - ) -> RoleConfig | None: ... + ) -> None: ... @typing.overload def decode_return_value( self, @@ -903,7 +1035,7 @@ def decode_return_value( self, method: str, return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None | RoleConfig | int | str | tuple[bool, bool, bool, bool, bool]: + ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None | RoleValidity | int | str | tuple[bool, bool, bool, bool, bool]: """Decode ABI return value for the given method.""" if return_value is None: return None @@ -930,7 +1062,28 @@ class MockRbacModuleBareCallCreateParams(algokit_utils.AppClientBareCallCreatePa def to_algokit_utils_params(self) -> algokit_utils.AppClientBareCallCreateParams: return algokit_utils.AppClientBareCallCreateParams(**self.__dict__) -class MockRbacModuleFactory(algokit_utils.TypedAppFactoryProtocol[MockRbacModuleBareCallCreateParams, None, None]): +@dataclasses.dataclass(frozen=True) +class MockRbacModuleMethodCallUpdateParams( + algokit_utils.BaseAppClientMethodCallParams[ + typing.Any, + str | None, + ] +): + """Parameters for calling MockRbacModule contract using ABI""" + on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None + method: str | None = None + + def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallParams: + method_args = _parse_abi_args(self.args) + return algokit_utils.AppClientMethodCallParams( + **{ + **self.__dict__, + "method": self.method or getattr(self.args, "abi_method_signature", None), + "args": method_args, + } + ) + +class MockRbacModuleFactory(algokit_utils.TypedAppFactoryProtocol[MockRbacModuleBareCallCreateParams, MockRbacModuleMethodCallUpdateParams, None]): """Factory for deploying and managing MockRbacModuleClient smart contracts""" def __init__( @@ -976,7 +1129,7 @@ def deploy( on_update: algokit_utils.OnUpdate | None = None, on_schema_break: algokit_utils.OnSchemaBreak | None = None, create_params: MockRbacModuleBareCallCreateParams | None = None, - update_params: None = None, + update_params: MockRbacModuleMethodCallUpdateParams | None = None, delete_params: None = None, existing_deployments: algokit_utils.ApplicationLookup | None = None, ignore_cache: bool = False, @@ -989,7 +1142,7 @@ def deploy( on_update=on_update, on_schema_break=on_schema_break, create_params=create_params.to_algokit_utils_params() if create_params else None, - update_params=update_params, + update_params=update_params.to_algokit_utils_params() if update_params else None, delete_params=delete_params, existing_deployments=existing_deployments, ignore_cache=ignore_cache, @@ -1116,18 +1269,18 @@ def rbac_set_op_daemon( def rbac_assign_role( self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, *, params: algokit_utils.CommonAppCallCreateParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_assign_role(uint8,address,byte[])uint64 ABI method""" + """Creates a new instance using the rbac_assign_role(uint8,address,(uint64,uint64))uint64 ABI method""" params = params or algokit_utils.CommonAppCallCreateParams() return self.app_factory.params.create( algokit_utils.AppFactoryCreateMethodCallParams( **{ **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", "args": _parse_abi_args(args), } ), @@ -1154,20 +1307,40 @@ def rbac_revoke_role( compilation_params=compilation_params ) - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, + args: tuple[bool] | RbacContractSuspensionArgs, *, params: algokit_utils.CommonAppCallCreateParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" + """Creates a new instance using the rbac_contract_suspension(bool)uint64 ABI method""" params = params or algokit_utils.CommonAppCallCreateParams() return self.app_factory.params.create( algokit_utils.AppFactoryCreateMethodCallParams( **{ **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", + "method": "rbac_contract_suspension(bool)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_contract_default(bool)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", "args": _parse_abi_args(args), } ), @@ -1213,26 +1386,45 @@ def rbac_get_address_roles( compilation_params=compilation_params ) - def rbac_get_role_config( + def rbac_get_role_validity( self, - args: tuple[int, str] | RbacGetRoleConfigArgs, + args: tuple[int, str] | RbacGetRoleValidityArgs, *, params: algokit_utils.CommonAppCallCreateParams | None = None, compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_role_config(uint8,address)(uint64,uint64) ABI method""" + """Creates a new instance using the rbac_get_role_validity(uint8,address)(uint64,uint64) ABI method""" params = params or algokit_utils.CommonAppCallCreateParams() return self.app_factory.params.create( algokit_utils.AppFactoryCreateMethodCallParams( **{ **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", "args": _parse_abi_args(args), } ), compilation_params=compilation_params ) + def contract_update( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_update()void ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_update()void", + "args": None, + } + ), + compilation_params=compilation_params + ) + class MockRbacModuleFactoryUpdateParams: """Parameters for 'update' operations of MockRbacModule contract""" @@ -1326,6 +1518,29 @@ def bare( return MockRbacModuleClient(result[0]), result[1] +class _MockRbacModuleUpdateComposer: + def __init__(self, composer: "MockRbacModuleComposer"): + self.composer = composer + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "MockRbacModuleComposer": + self.composer._composer.add_app_update_method_call( + self.composer.client.params.update.contract_update( + + params=params, + compilation_params=compilation_params + ) + ) + self.composer._result_mappers.append( + lambda v: self.composer.client.decode_return_value( + "contract_update()void", v + ) + ) + return self.composer + + class MockRbacModuleComposer: """Composer for creating transaction groups for MockRbacModule contract calls""" @@ -1334,10 +1549,15 @@ def __init__(self, client: "MockRbacModuleClient"): self._composer = client.algorand.new_group() self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] + @property + def update(self) -> "_MockRbacModuleUpdateComposer": + return _MockRbacModuleUpdateComposer(self) + def rbac_rotate_arranger( self, args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "MockRbacModuleComposer": self._composer.add_app_call_method_call( self.client.params.rbac_rotate_arranger( @@ -1355,7 +1575,8 @@ def rbac_rotate_arranger( def rbac_set_op_daemon( self, args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "MockRbacModuleComposer": self._composer.add_app_call_method_call( self.client.params.rbac_set_op_daemon( @@ -1372,8 +1593,9 @@ def rbac_set_op_daemon( def rbac_assign_role( self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "MockRbacModuleComposer": self._composer.add_app_call_method_call( self.client.params.rbac_assign_role( @@ -1383,7 +1605,7 @@ def rbac_assign_role( ) self._result_mappers.append( lambda v: self.client.decode_return_value( - "rbac_assign_role(uint8,address,byte[])uint64", v + "rbac_assign_role(uint8,address,(uint64,uint64))uint64", v ) ) return self @@ -1391,7 +1613,8 @@ def rbac_assign_role( def rbac_revoke_role( self, args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "MockRbacModuleComposer": self._composer.add_app_call_method_call( self.client.params.rbac_revoke_role( @@ -1406,27 +1629,48 @@ def rbac_revoke_role( ) return self - def rbac_gov_asset_suspension( + def rbac_contract_suspension( self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None + args: tuple[bool] | RbacContractSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "MockRbacModuleComposer": self._composer.add_app_call_method_call( - self.client.params.rbac_gov_asset_suspension( + self.client.params.rbac_contract_suspension( args=args, params=params, ) ) self._result_mappers.append( lambda v: self.client.decode_return_value( - "rbac_gov_asset_suspension(bool)uint64", v + "rbac_contract_suspension(bool)uint64", v + ) + ) + return self + + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "MockRbacModuleComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_contract_default( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_contract_default(bool)uint64", v ) ) return self def rbac_get_arranger( self, - params: algokit_utils.CommonAppCallParams | None = None + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "MockRbacModuleComposer": self._composer.add_app_call_method_call( self.client.params.rbac_get_arranger( @@ -1444,7 +1688,8 @@ def rbac_get_arranger( def rbac_get_address_roles( self, args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "MockRbacModuleComposer": self._composer.add_app_call_method_call( self.client.params.rbac_get_address_roles( @@ -1459,20 +1704,21 @@ def rbac_get_address_roles( ) return self - def rbac_get_role_config( + def rbac_get_role_validity( self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None ) -> "MockRbacModuleComposer": self._composer.add_app_call_method_call( - self.client.params.rbac_get_role_config( + self.client.params.rbac_get_role_validity( args=args, params=params, ) ) self._result_mappers.append( lambda v: self.client.decode_return_value( - "rbac_get_role_config(uint8,address)(uint64,uint64)", v + "rbac_get_role_validity(uint8,address)(uint64,uint64)", v ) ) return self diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.puya.map b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.puya.map deleted file mode 100644 index 6424533d..00000000 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.puya.map +++ /dev/null @@ -1,35014 +0,0 @@ -{ - "version": 3, - "sources": [ - "../../../modules/accounting.py", - "../../../modules/actus/pbn.py", - "../../../modules/core_financial/common.py", - "../../../modules/core_financial/coupon.py", - "../../../modules/payment_agent/common.py", - "../../../modules/payment_agent/coupon.py", - "../../../modules/rbac.py", - "../../../modules/transfer_agent/coupon.py", - "../../perpetual_bond/contract.py" - ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AM8BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAgBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AN9BA;;AAAmB;AAAnB;AACA;;AAAyB;AAAzB;AACA;;AAAkB;AAAlB;AACA;AAAc;AAAd;AEUA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAA0B;AAA1B;AACA;;AAAqB;AAArB;AACA;;AAAqB;AAArB;AAIA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AC5BA;;AAAyB;AAAzB;AAyTA;;AAAqB;AAArB;AKlTO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAnBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;ANwQK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;;;ADvPA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;ACmMG;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AA5KmB;;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAKI;;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;;AAHjB;;;;;;AAAA;AAwKO;;AAAA;;AAAA;AAAA;AAAP;AACA;;AAAA;;AAAA;AACmB;;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAAA;;AAAA;AAGiC;AAAA;AArK1B;;;AAAA;AAEH;;;AAFG;AAAA;;;;AAAP;AAMA;;AAAA;;AAAA;AAmK0B;;AAAA;AAAA;;AA/JnB;AAAA;;AAAA;AAAA;AAAf;;;AACY;;AAAA;AAGJ;;AAAA;;AAAA;AAGO;;AAAA;AAAA;AAAP;AAGA;;AAAA;;AAAA;ADlF+C;;AAArB;AAAtB;;AAAA;AADJ;ACiPA;;AAAA;;;AD5OA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;;;AAAA;AAAzC;;AAAA;AAAA;;;AAGqB;AAArB;AAAA;AAAA;AACA;;AAAqB;AAArB;AEuTO;;AAAuB;AAAvB;AAAP;AACyB;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEzB;AAAA;AACO;AAAP;AAGA;;AAAA;;AAAA;;AAAA;AAAA;AACqB;;AAAA;;;;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;ADpFA;AAAc;;AAAd;ADzOH;AAAA;;;;;AAyDA;;;AAAA;AAAA;AAAA;;AAAA;AAAA;AKT+B;;AAAsB;;AAA3C;;;AAAP;AL2BA;;;AACA;;;AACc;;;AACP;;;AAAP;AAGqB;AAArB;;AAAA;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;AEwUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBO;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;;AADJ;AHtZ0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AG2ZO;AAAA;;;AAAa;;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAJ;;;;AAAP;AAG8B;;AAAA;AAAA;;AAAA;;;AAAA;;AAEX;AAAnB;;AACY;AAAZ;;AACc;AAAd;;AAGc;;;AAAA;AAAA;;AACd;AAAA;;AAAA;;;AACG;;;AAAX;;;AAC+B;;AAAA;AAAA;;;AACA;;AAAA;;AAAA;;AAAA;;;AAAA;;AAGP;AAAA;AAAA;AAAA;;AACE;AAAA;AAAA;;AAKG;;AAAA;AAAA;;AAAA;AAAA;AAHd;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AA7CV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;AAsDA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AHxb6B;AAAnB;;AAAA;AAAA;AAAA;;AAAP;AGwcI;;;AACE;AAAA;;AAAA;AAAA;AADF;AAEG;;AAFH;AAIG;AAEO;AAFP;AAAA;AApBV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AH9bU;AAAA;AAAA;AAAA;AAAe;;AAAf;AGgeO;;;AAAA;;;;;AAxIc;;AAAA;AAAc;AAAd;AAArB;;;AAAA;;AA0IgB;AAAA;;;AAAA;;AACX;AAAZ;;AACc;AAAd;;AACG;;;AAAX;;;AAC+B;;AAAA;;;AACP;AAAA;AAAA;AAAA;;AACE;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAGG;;AAAA;AAAA;;AAAA;AAAA;AAJd;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAlBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAS0E;;;;;;AA4BxD;;AH5fR;AAAA;AAAA;AAAA;AAAe;;AAAf;AG6ff;;;AAC2B;;AAAA;AAAA;AAAA;;AAAA;AAVtB;AAAA;;AAAA;AAAA;AAAA;AAAA;AE/eA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ALLU;AAAA;AAAA;AAAA;AAAe;;AAAf;AGcP;AACA;;;AACA;;;AHV0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AGaQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACR;AAEc;;;AACS;AAAA;AAAA;AAAA;;AAAA;AAChB;AAAA;;AAAA;AAAP;AAEO;;;AAAP;AA2WI;;;AAxCsB;AAAA;;AAAA;AAAA;AAAnB;AAAyC;;AAAzC;ACzWJ;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AAQA;;AAAA;AAAA;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;ACgChB;;;AD3B6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;ACgCa;;AAAA;AAAA;AAAA;;;AD1Bb;AAIQ;;;;;;;;;;;;AAJR;;;;;;AAAA;AD4BA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAA8C;AAA9C;AAAA;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AE/CoB;;AAGP;;AAEO;AAAA;;AAAA;AAAA;AACE;AAAA;;AAAA;AACA;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AARlB;;AAAA;AAAA;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;;;AAAA;AAAA;;AAAA;AAAA;AASqB;;AATrB;AAUoB;AAVpB;AAAA;AAAA;;;;;;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;AAuDc;;AAFP;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AAtCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCwB;AAAjB;;;;;;;;;;;;;;;;;;;AEvDP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;APgBU;AAAA;AAAA;AAAA;AAAe;;AAAf;AEgIH;;;AACI;AAAA;;AAAA;AAAA;AAAsC;;AAAtC;AADJ;;;AAGQ;AAAA;;AAAA;AAAA;AAAJ;;;AACG;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADH;;;;AAJR;AAmBO;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AF9I0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AEiJA;;AAAA;;;AACA;;AAAA;;;AAaO;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAP;AFjIoB;;;AAAA;;AACjB;AAAA;AAAA;AAAA;AAAX;;;AANY;;AAAA;AAAA;AAAA;;AAAA;AAAmC;;AAAA;AAAA;AAAA;;AAAA;AAAnC;AAAA;;;AACI;;AAAA;AAAA;AAAA;;AAAA;AAAqC;;AAAA;AAAA;AAAA;;AAAA;AAArC;AADJ;;;;AADJ;AOVoB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AJuBN;;;AACd;;AAAA;AAAA;;AAAA;;AAAA;;;AACO;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;;AAAA;;AHDS;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;AAAP;AACA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AApBG;AAAA;AAAA;AAAA;AAAX;;;AACuD;AAA3C;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAsBJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AOvBO;;AAAA;AAAA;;AAAA;AA5CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AP0DO;;AAAA;AAAA;;AAAA;;AAAA;AACsC;;AAAA;AAAA;AAAA;;;AAAtC;;AAAA;AAAA;;;;;;;;AEuMP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AASG;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAVH;AAAA;AAYA;;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAQG;;;AACA;;AAAA;AAAA;AATH;AAAA;;AAWA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAqBG;;;AF3RO;AAAA;AAAA;AAAA;AAAe;;AAAf;AE4RA;AAAP;AACA;;;AAEA;AAAA;AACyC;AAAtC;AAAX;;;AACY;AAAA;;;AAAA;;AAGA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;;AAAA;;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAIA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AACgC;;AAAA;AAAA;AAA7B;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAIA;;AAAA;AAAA;AAI8B;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAF3B;AAAA;AAAA;AAAA;AAAA;AA5CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AIzQ+B;;AAAc;;AAAnC;;;AAAP;AJsRA;;AAAA;AAAA;AACO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AF1UU;AAAA;AAAA;AAAA;AAAe;;AAAf;AEwHH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AIzE4B;;AAAqB;;AAA1C;;;AAAP;ANxC0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AEgWA;;;AACA;;;AACA;;AAAA;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAkC;AAAA;;AAAA;AAAA;AAAlC;;AAAA;AAAP;AAEA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAC2C;AAAA;;AAAA;AAAA;AAA3C;AAAA;;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AApCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AAgDiB;AACX;;AAA0B;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA1B;AAAA;;;AAAA;AAAA;;;AACe;;AAAd;;AAED;AAAA;;AAAA;AAAA;AAAX;;;AAC0B;;AAAd;;AAGsB;AAAA;;AAAA;AAAA;AACF;AAAA;;AAAA;AAAA;AF/WjB;AAAA;;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAAA;AEkX6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACU;AAAA;;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AACO;AAAA;;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AACD;AAAA;;AAAA;AAAA;AAEqB;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACpB;AAAA;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACE;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAfT;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CiB;;AF3ZP;AAAA;AAAA;AAAA;AAAe;;AAAf;AE4Zf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAVrB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAsBQ;AAAA;;AAAA;AAAA;AAAoC;AAAA;;AAAA;AAAA;AADlC;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBuC;AAAA;;AAAA;AAAA;AATvC;AAAA;AAAA;AAAA;AAAA;AAAA;AFvWA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AMjB+B;;AAAgB;;AAArC;;;AAAP;AN9C0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmFA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AMjD+B;;AAAsB;;AAA3C;;;AAAP;ANxCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+GA;AAAP;AACA;;;AACA;;;AAC8B;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAIU;AAFsB;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAhC;AAOO;;AAlCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AMrF+B;;AAAsB;;AAA3C;;;AAAP;ANuGA;;;AA5I0B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+Ie;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACf;;AACA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAhIR;;;AACY;AAAc;;AAAd;AAiIiB;;AAzBxB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBU;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AA3K0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA6KA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL6B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+LO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AM5DA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AAqGG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxEM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA+FJ;;;AA7FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA2FJ;;;AAzFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAuFJ;;;AArFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAmFJ;;;AAjFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAkFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAmGG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1EM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA8FJ;;;AA5FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA0FJ;;;AAxFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAsFJ;;;AApFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAqFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzJ+B;;AAAgB;;AAArC;;;AAAP;AAyKA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA5QL;;AAAA;AAAA;AAAA;AAAA;;AA2QC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAvQL;;AAAA;AAAA;AAAA;AAAA;;AAsQC;AAGO;AAAA;AAxClB;;;AAiCe;;AAlQL;;AAAA;AAAA;AAAA;AAAA;;AAiQC;AAGO;AAAA;AAnClB;;;AA4Be;;AA7PL;;AAAA;AAAA;AAAA;AAAA;;AA4PC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAxPL;;AAAA;AAAA;AAAA;AAAA;;AAuPC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AHuED;;;AACkB;AACD;;AAAA;AACG;AAAA;AAAA;AAAA;AAAb;AAAX;;;AACwC;AAAA;AAAA;AAAA;AAAb;;AAAA;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAArC;AAAA;;AAElB;AAEJ;;;AACW;AAAA;AAAA;AAAA;AAA8B;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAArB;AAAP;AAgBJ;;;;;;AAEJ;;AAAA;;;AACkC;AAAA;AAAA;AAAA;AAGF;;AAAA;AAAA;AAAA;;AACR;AAAA;;AAAA;AAAA;AACb;AAAA;;AAAA;AAAA;AAAX;;;AD9Ne;;AAAe;;AAAf;AAAA;;AAAe;;AAAf;ACiOA;;AAAA;AAAA;AAAA;AAAA;AAAP;;AAAA;AAxBkB;AAAlB;;AACR;;AAAA;;;AAC8B;;AAAA;;;AAAA;;;;;;;AA2B1B;;;AACW;AAAA;AAAA;AAAA;AAAA;;;AAA4B;;AAA0B;AAAA;AAAA;AAAA;AAA1B;AAA5B;;;;AAAP;;AAAA;AAEJ;;;AAII;;AAAA;;AAAA;;;AACmB;;AAAA;;;AACK;AAAA;AAAA;AACR;AAAA;AAAA;AAEZ;;AAAA;;AAAA;;;AACE;AAAA;;AAAA;AAAA;AADF;AAAA;;AAAA;AAGI;;AAAA;;AAAA;AAHJ;AADJ;AAzXJ;;;AACW;AAAA;;AAAA;AAAA;AAA0B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAA1B;AAAP;AAEJ;;;AAIQ;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;;AD2EJ;;;;;;;AAEQ;;AAAA;;;AAAA;;;;AAAA;AACE;;AADF;AADJ;AAIkB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAnB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKqB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AACkB;AAAN;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;;AACF;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;AAApB;AAAA;AAAP;;;;;;;;;;;;;AFzFZ;;;AACe;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAEJ;;;AACmB;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAR;;AAAA;AAAP;AAEJ;;;AAEyB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADd;;AAAA;AAAA;;;AAAP;AMiBJ;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.approval_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "intcblock 0 1 32 8 10000 200 86400" - }, - "14": { - "op": "bytecblock 0x151f7c75 0x52333023 \"status\" \"issuance_date\" \"circulating_units\" \"interest_rate\" 0x52323023 \"unit_value\" \"primary_distribution_opening_date\" \"secondary_market_closure_date\" \"maturity_date\" 0x52373023 0x52343023 \"total_units\" \"settlement_asset_id\" \"day_count_convention\" \"secondary_market_opening_date\" \"coupon_period\" 0x52383023 0x52363023 0x52353023 0x52323523 \"asset_suspended\" \"asset_defaulted\" \"denomination_asset_id\" \"metadata\" \"principal_discount\" \"primary_distribution_closure_date\" \"paid_coupon_units\" 0x74696d65506572696f6473 0x00 \"total_coupons\" 0x74696d654576656e7473 0x0000 0x068101" - }, - "480": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "482": { - "op": "bnz main_after_if_else@2", - "stack_out": [] - }, - "485": { - "op": "bytec 6 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "487": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323023", - "tmp%0#3" - ], - "stack_out": [ - "0x52323023", - "tmp%0#3" - ] - }, - "489": { - "op": "app_global_put", - "stack_out": [] - }, - "490": { - "op": "bytec 21 // 0x52323523", - "defined_out": [ - "0x52323523" - ], - "stack_out": [ - "0x52323523" - ] - }, - "492": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323523", - "tmp%1#3" - ], - "stack_out": [ - "0x52323523", - "tmp%1#3" - ] - }, - "494": { - "op": "app_global_put", - "stack_out": [] - }, - "495": { - "op": "bytec 22 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"" - ], - "stack_out": [ - "\"asset_suspended\"" - ] - }, - "497": { - "op": "intc_0 // 0", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "\"asset_suspended\"", - "0" - ] - }, - "498": { - "op": "app_global_put", - "stack_out": [] - }, - "499": { - "op": "bytec 23 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"" - ], - "stack_out": [ - "\"asset_defaulted\"" - ] - }, - "501": { - "op": "intc_0 // 0", - "stack_out": [ - "\"asset_defaulted\"", - "0" - ] - }, - "502": { - "op": "app_global_put", - "stack_out": [] - }, - "503": { - "op": "bytec 13 // \"total_units\"", - "defined_out": [ - "\"total_units\"" - ], - "stack_out": [ - "\"total_units\"" - ] - }, - "505": { - "op": "intc_0 // 0", - "stack_out": [ - "\"total_units\"", - "0" - ] - }, - "506": { - "op": "app_global_put", - "stack_out": [] - }, - "507": { - "op": "bytec 4 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"" - ], - "stack_out": [ - "\"circulating_units\"" - ] - }, - "509": { - "op": "intc_0 // 0", - "stack_out": [ - "\"circulating_units\"", - "0" - ] - }, - "510": { - "op": "app_global_put", - "stack_out": [] - }, - "511": { - "op": "bytec 7 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"" - ], - "stack_out": [ - "\"unit_value\"" - ] - }, - "513": { - "op": "intc_0 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "514": { - "op": "app_global_put", - "stack_out": [] - }, - "515": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "\"status\"" - ] - }, - "516": { - "op": "intc_0 // 0", - "stack_out": [ - "\"status\"", - "0" - ] - }, - "517": { - "op": "app_global_put", - "stack_out": [] - }, - "518": { - "op": "bytec 24 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"" - ], - "stack_out": [ - "\"denomination_asset_id\"" - ] - }, - "520": { - "op": "intc_0 // 0", - "stack_out": [ - "\"denomination_asset_id\"", - "0" - ] - }, - "521": { - "op": "app_global_put", - "stack_out": [] - }, - "522": { - "op": "bytec 14 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"" - ], - "stack_out": [ - "\"settlement_asset_id\"" - ] - }, - "524": { - "op": "intc_0 // 0", - "stack_out": [ - "\"settlement_asset_id\"", - "0" - ] - }, - "525": { - "op": "app_global_put", - "stack_out": [] - }, - "526": { - "op": "bytec 7 // \"unit_value\"", - "stack_out": [ - "\"unit_value\"" - ] - }, - "528": { - "op": "intc_0 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "529": { - "op": "app_global_put", - "stack_out": [] - }, - "530": { - "op": "bytec 15 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "\"day_count_convention\"" - ] - }, - "532": { - "op": "intc_0 // 0", - "stack_out": [ - "\"day_count_convention\"", - "0" - ] - }, - "533": { - "op": "app_global_put", - "stack_out": [] - }, - "534": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"" - ], - "stack_out": [ - "\"metadata\"" - ] - }, - "536": { - "op": "pushbytes 0x", - "defined_out": [ - "\"metadata\"", - "0x" - ], - "stack_out": [ - "\"metadata\"", - "0x" - ] - }, - "538": { - "op": "app_global_put", - "stack_out": [] - }, - "539": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"" - ], - "stack_out": [ - "\"principal_discount\"" - ] - }, - "541": { - "op": "intc_0 // 0", - "stack_out": [ - "\"principal_discount\"", - "0" - ] - }, - "542": { - "op": "app_global_put", - "stack_out": [] - }, - "543": { - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"" - ], - "stack_out": [ - "\"interest_rate\"" - ] - }, - "545": { - "op": "intc_0 // 0", - "stack_out": [ - "\"interest_rate\"", - "0" - ] - }, - "546": { - "op": "app_global_put", - "stack_out": [] - }, - "547": { - "op": "bytec 31 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"" - ], - "stack_out": [ - "\"total_coupons\"" - ] - }, - "549": { - "op": "intc_0 // 0", - "stack_out": [ - "\"total_coupons\"", - "0" - ] - }, - "550": { - "op": "app_global_put", - "stack_out": [] - }, - "551": { - "op": "bytec 8 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"" - ], - "stack_out": [ - "\"primary_distribution_opening_date\"" - ] - }, - "553": { - "op": "intc_0 // 0", - "stack_out": [ - "\"primary_distribution_opening_date\"", - "0" - ] - }, - "554": { - "op": "app_global_put", - "stack_out": [] - }, - "555": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"" - ], - "stack_out": [ - "\"primary_distribution_closure_date\"" - ] - }, - "557": { - "op": "intc_0 // 0", - "stack_out": [ - "\"primary_distribution_closure_date\"", - "0" - ] - }, - "558": { - "op": "app_global_put", - "stack_out": [] - }, - "559": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"" - ], - "stack_out": [ - "\"issuance_date\"" - ] - }, - "560": { - "op": "intc_0 // 0", - "stack_out": [ - "\"issuance_date\"", - "0" - ] - }, - "561": { - "op": "app_global_put", - "stack_out": [] - }, - "562": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"" - ], - "stack_out": [ - "\"secondary_market_opening_date\"" - ] - }, - "564": { - "op": "intc_0 // 0", - "stack_out": [ - "\"secondary_market_opening_date\"", - "0" - ] - }, - "565": { - "op": "app_global_put", - "stack_out": [] - }, - "566": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"" - ], - "stack_out": [ - "\"secondary_market_closure_date\"" - ] - }, - "568": { - "op": "intc_0 // 0", - "stack_out": [ - "\"secondary_market_closure_date\"", - "0" - ] - }, - "569": { - "op": "app_global_put", - "stack_out": [] - }, - "570": { - "op": "bytec 10 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"" - ], - "stack_out": [ - "\"maturity_date\"" - ] - }, - "572": { - "op": "intc_0 // 0", - "stack_out": [ - "\"maturity_date\"", - "0" - ] - }, - "573": { - "op": "app_global_put", - "stack_out": [] - }, - "574": { - "op": "bytec 28 // \"paid_coupon_units\"", - "defined_out": [ - "\"paid_coupon_units\"" - ], - "stack_out": [ - "\"paid_coupon_units\"" - ] - }, - "576": { - "op": "intc_0 // 0", - "stack_out": [ - "\"paid_coupon_units\"", - "0" - ] - }, - "577": { - "op": "app_global_put", - "stack_out": [] - }, - "578": { - "op": "bytec 17 // \"coupon_period\"", - "defined_out": [ - "\"coupon_period\"" - ], - "stack_out": [ - "\"coupon_period\"" - ] - }, - "580": { - "op": "intc_0 // 0", - "stack_out": [ - "\"coupon_period\"", - "0" - ] - }, - "581": { - "op": "app_global_put", - "stack_out": [] - }, - "582": { - "op": "txn GlobalNumByteSlice", - "defined_out": [ - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2" - ] - }, - "584": { - "op": "pushint 3", - "defined_out": [ - "3", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "3" - ] - }, - "586": { - "op": "==", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "tmp%1#2" - ] - }, - "587": { - "error": "Wrong Global Bytes allocation", - "op": "assert // Wrong Global Bytes allocation", - "stack_out": [] - }, - "588": { - "op": "txn GlobalNumUint", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "590": { - "op": "pushint 20", - "defined_out": [ - "20", - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1", - "20" - ] - }, - "592": { - "op": "==", - "defined_out": [ - "tmp%3#1" - ], - "stack_out": [ - "tmp%3#1" - ] - }, - "593": { - "error": "Wrong Global UInts allocation", - "op": "assert // Wrong Global UInts allocation", - "stack_out": [] - }, - "594": { - "op": "txn LocalNumByteSlice", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "596": { - "op": "!", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "597": { - "error": "Wrong Local Bytes allocation", - "op": "assert // Wrong Local Bytes allocation", - "stack_out": [] - }, - "598": { - "op": "txn LocalNumUint", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "600": { - "op": "!", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "601": { - "error": "Wrong Local UInts allocation", - "op": "assert // Wrong Local UInts allocation", - "stack_out": [] - }, - "602": { - "block": "main_after_if_else@2", - "stack_in": [], - "op": "pushbytes 0x25dba95b // method \"asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\"", - "defined_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ], - "stack_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ] - }, - "608": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%0#1" - ], - "stack_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%0#1" - ] - }, - "611": { - "op": "match main_asset_update_route@4", - "stack_out": [] - }, - "615": { - "block": "main_switch_case_next@5", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "617": { - "op": "!", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "618": { - "op": "assert", - "stack_out": [] - }, - "619": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "621": { - "op": "bz main_create_NoOp@36", - "stack_out": [] - }, - "624": { - "op": "pushbytess 0x89474134 0x9316298d 0x44363d49 0x67db4f20 0xf6a96c8d 0x229b706f 0x8cf14b51 0x4fd6a3cc 0x1d6fc255 0x25e9997f 0x6c85e3ee 0x402dba47 0xfad2173e 0x08efea35 0xe4a5ab54 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method \"asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"update_interest_rate(uint16)uint64\", method \"get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))\", method \"get_payment_amount(address)(uint64,uint64)\", method \"get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)\", method \"get_time_periods()(uint64,uint64)[]\", method \"pay_coupon(address,byte[])(uint64,uint64,byte[])\", method \"asset_transfer(address,address,uint64)uint64\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"set_default_status(bool)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)\", method \"account_gov_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_close(address)(uint64,uint64)\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_info(address)(address,uint64,uint64,uint64,bool)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,byte[])uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_config(uint8,address)(uint64,uint64)\"", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_time_events()uint64[])", - "Method(get_time_periods()(uint64,uint64)[])", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(primary_distribution(address,uint64)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_default_status(bool)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(update_interest_rate(uint16)uint64)" - ], - "stack_out": [ - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(update_interest_rate(uint16)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(get_time_periods()(uint64,uint64)[])", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(set_default_status(bool)uint64)", - "Method(primary_distribution(address,uint64)uint64)", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_time_events()uint64[])", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))" - ] - }, - "766": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_time_events()uint64[])", - "Method(get_time_periods()(uint64,uint64)[])", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(primary_distribution(address,uint64)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_default_status(bool)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(update_interest_rate(uint16)uint64)", - "tmp%10#0" - ], - "stack_out": [ - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(update_interest_rate(uint16)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool))", - "Method(get_time_periods()(uint64,uint64)[])", - "Method(pay_coupon(address,byte[])(uint64,uint64,byte[]))", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(set_default_status(bool)uint64)", - "Method(primary_distribution(address,uint64)uint64)", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_time_events()uint64[])", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "tmp%10#0" - ] - }, - "769": { - "op": "match asset_config update_interest_rate get_account_units_current_value get_payment_amount get_coupons_status get_time_periods pay_coupon asset_transfer set_secondary_time_events set_default_status primary_distribution get_asset_info get_time_events get_secondary_market_schedule get_asset_metadata account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config", - "stack_out": [] - }, - "827": { - "op": "err" - }, - "828": { - "block": "main_create_NoOp@36", - "stack_in": [], - "op": "pushbytes 0x3f0efc6c // method \"asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\"", - "defined_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ], - "stack_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ] - }, - "834": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%11#0" - ], - "stack_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%11#0" - ] - }, - "837": { - "op": "match asset_create", - "stack_out": [] - }, - "841": { - "op": "err" - }, - "842": { - "block": "main_asset_update_route@4", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1" - ] - }, - "844": { - "op": "pushint 4 // UpdateApplication", - "defined_out": [ - "UpdateApplication", - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1", - "UpdateApplication" - ] - }, - "846": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "847": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%2#0", - "tmp%3#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%3#0" - ] - }, - "849": { - "op": "&&", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "850": { - "op": "assert", - "stack_out": [] - }, - "851": { - "op": "b asset_update" - }, - "854": { - "subroutine": "modules.actus.pbn.PBNCoreMixin.asset_config[routing]", - "params": {}, - "block": "asset_config", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "interest_rate#2" - ] - }, - "856": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0" - ] - }, - "859": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "860": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "len%0#0" - ] - }, - "861": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "len%0#0", - "8" - ] - }, - "862": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#2", - "tmp%0#0", - "eq%0#0" - ] - }, - "863": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "tmp%0#0" - ] - }, - "864": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0" - ] - }, - "865": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "denomination_asset_id#0", - "tmp%2#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0" - ] - }, - "868": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "869": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "len%1#0" - ] - }, - "870": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "871": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%1#0", - "tmp%2#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "872": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "tmp%2#0" - ] - }, - "873": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0" - ] - }, - "874": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ] - }, - "877": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ] - }, - "878": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%2#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "len%2#0" - ] - }, - "879": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "len%2#0", - "8" - ] - }, - "880": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%2#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "eq%2#0" - ] - }, - "881": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ] - }, - "882": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0" - ] - }, - "883": { - "op": "txna ApplicationArgs 4", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0" - ] - }, - "886": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ] - }, - "887": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%3#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "len%3#0" - ] - }, - "888": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "len%3#0", - "8" - ] - }, - "889": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%3#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "eq%3#0" - ] - }, - "890": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0" - ] - }, - "891": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0" - ] - }, - "892": { - "op": "txna ApplicationArgs 5", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0" - ] - }, - "895": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ] - }, - "896": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%4#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "len%4#0" - ] - }, - "897": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "len%4#0", - "8" - ] - }, - "898": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%4#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "eq%4#0" - ] - }, - "899": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0" - ] - }, - "900": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0" - ] - }, - "901": { - "op": "txna ApplicationArgs 6", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "904": { - "op": "dup", - "defined_out": [ - "day_count_convention#0", - "day_count_convention#0 (copy)", - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "day_count_convention#0 (copy)" - ] - }, - "905": { - "op": "len", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "len%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%5#0" - ] - }, - "906": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "day_count_convention#0", - "denomination_asset_id#0", - "len%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%5#0", - "1" - ] - }, - "907": { - "op": "==", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "eq%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%5#0" - ] - }, - "908": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "909": { - "op": "txna ApplicationArgs 7" - }, - "912": { - "op": "dup", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "interest_rate#0", - "interest_rate#0" - ] - }, - "913": { - "op": "cover 7", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "interest_rate#0" - ] - }, - "915": { - "op": "len", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%6#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%6#0" - ] - }, - "916": { - "op": "pushint 2", - "defined_out": [ - "2", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%6#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%6#0", - "2" - ] - }, - "918": { - "op": "==", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "eq%6#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%6#0" - ] - }, - "919": { - "error": "invalid number of bytes for arc4.uint16", - "op": "assert // invalid number of bytes for arc4.uint16", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "920": { - "op": "txna ApplicationArgs 8", - "defined_out": [ - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0" - ] - }, - "923": { - "op": "dup", - "defined_out": [ - "coupon_rates#0", - "coupon_rates#0 (copy)", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0 (copy)" - ] - }, - "924": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0 (copy)", - "0" - ] - }, - "925": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0" - ] - }, - "926": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0" - ] - }, - "927": { - "op": "cover 8", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0" - ] - }, - "929": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "931": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%0#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "mul%0#0" - ] - }, - "932": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "mul%0#0", - "2" - ] - }, - "934": { - "op": "+", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "add%0#0" - ] - }, - "935": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%0#0", - "coupon_rates#0" - ] - }, - "936": { - "op": "len", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%7#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%0#0", - "len%7#0" - ] - }, - "937": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%7#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%7#0" - ] - }, - "938": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "939": { - "op": "txna ApplicationArgs 9" - }, - "942": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0" - ] - }, - "943": { - "op": "cover 7", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0" - ] - }, - "945": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "946": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0 (copy)", - "0" - ] - }, - "947": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0" - ] - }, - "948": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%1#0" - ] - }, - "949": { - "op": "cover 8", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0" - ] - }, - "951": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0", - "8" - ] - }, - "952": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%1#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "mul%1#0" - ] - }, - "953": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "mul%1#0", - "2" - ] - }, - "955": { - "op": "+", - "defined_out": [ - "add%1#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "add%1#0" - ] - }, - "956": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%1#0", - "time_events#0" - ] - }, - "957": { - "op": "len", - "defined_out": [ - "add%1#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%8#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%1#0", - "len%8#0" - ] - }, - "958": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%8#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%8#0" - ] - }, - "959": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "960": { - "op": "txna ApplicationArgs 10" - }, - "963": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0" - ] - }, - "964": { - "op": "cover 7", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0" - ] - }, - "966": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0", - "time_periods#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0 (copy)" - ] - }, - "967": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0 (copy)", - "0" - ] - }, - "968": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0" - ] - }, - "969": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0", - "aggregate%array_length%2#0" - ] - }, - "970": { - "op": "cover 8", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0" - ] - }, - "972": { - "op": "pushint 16", - "defined_out": [ - "16", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0", - "16" - ] - }, - "974": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%2#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "mul%2#0" - ] - }, - "975": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "mul%2#0", - "2" - ] - }, - "977": { - "op": "+", - "defined_out": [ - "add%2#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "add%2#0" - ] - }, - "978": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%2#0", - "time_periods#0" - ] - }, - "979": { - "op": "len", - "defined_out": [ - "add%2#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%9#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%2#0", - "len%9#0" - ] - }, - "980": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%9#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%9#0" - ] - }, - "981": { - "error": "invalid number of bytes for arc4.dynamic_array>", - "op": "assert // invalid number of bytes for arc4.dynamic_array>", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "982": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "985": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "0" - ] - }, - "986": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "0", - "\"status\"" - ] - }, - "987": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "988": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "maybe_value%0#0" - ] - }, - "989": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0", - "tmp%0#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%0#1" - ] - }, - "990": { - "error": "D-ASA already configured", - "op": "assert // D-ASA already configured", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "991": { - "op": "dig 5", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "denomination_asset_id#0 (copy)", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "denomination_asset_id#0 (copy)" - ] - }, - "993": { - "op": "asset_params_get AssetCreator", - "defined_out": [ - "_creator#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "exists#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "_creator#0", - "exists#0" - ] - }, - "995": { - "op": "bury 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "exists#0" - ] - }, - "997": { - "error": "Denomination asset is not properly set", - "op": "assert // Denomination asset is not properly set", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "998": { - "op": "bytec 24 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"denomination_asset_id\"" - ] - }, - "1000": { - "op": "dig 6", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"denomination_asset_id\"", - "denomination_asset_id#0 (copy)" - ] - }, - "1002": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1003": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "settlement_asset_id#0 (copy)", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "settlement_asset_id#0 (copy)" - ] - }, - "1005": { - "op": "uncover 6", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "settlement_asset_id#0 (copy)", - "denomination_asset_id#0" - ] - }, - "1007": { - "op": "==", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%0#1" - ] - }, - "1008": { - "error": "Different settlement asset not supported, must be equal to denomination asset", - "op": "assert // Different settlement asset not supported, must be equal to denomination asset", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1009": { - "op": "bytec 14 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"settlement_asset_id\"" - ] - }, - "1011": { - "op": "dig 5", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"settlement_asset_id\"", - "settlement_asset_id#0 (copy)" - ] - }, - "1013": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1014": { - "op": "itxn_begin" - }, - "1015": { - "op": "global MinTxnFee", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1017": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "1019": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "0" - ] - }, - "1020": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "1022": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1024": { - "op": "uncover 5", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "settlement_asset_id#0" - ] - }, - "1026": { - "op": "itxn_field XferAsset", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1028": { - "op": "pushint 4 // axfer", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "axfer", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "1030": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1032": { - "op": "itxn_field Fee", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1034": { - "op": "itxn_submit" - }, - "1035": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal#0 (copy)", - "principal_discount#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0 (copy)" - ] - }, - "1037": { - "op": "dig 2", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "minimum_denomination#0 (copy)", - "principal#0", - "principal#0 (copy)", - "principal_discount#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0 (copy)", - "minimum_denomination#0 (copy)" - ] - }, - "1039": { - "op": "%", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "time_periods#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%1#0" - ] - }, - "1040": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "time_periods#0", - "tmp%2#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%2#1" - ] - }, - "1041": { - "error": "Minimum denomination is not a divisor of principal", - "op": "assert // Minimum denomination is not a divisor of principal", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1042": { - "op": "bytec 7 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"unit_value\"" - ] - }, - "1044": { - "op": "dig 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"unit_value\"", - "minimum_denomination#0 (copy)" - ] - }, - "1046": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "1047": { - "op": "uncover 3", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0" - ] - }, - "1049": { - "op": "uncover 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "principal#0", - "minimum_denomination#0" - ] - }, - "1051": { - "op": "/", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "time_periods#0", - "tmp%3#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "tmp%3#0" - ] - }, - "1052": { - "op": "bytec 13 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "time_periods#0", - "tmp%3#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "tmp%3#0", - "\"total_units\"" - ] - }, - "1054": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "\"total_units\"", - "tmp%3#0" - ] - }, - "1055": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0" - ] - }, - "1056": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "\"principal_discount\"" - ] - }, - "1058": { - "op": "uncover 2", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "\"principal_discount\"", - "principal_discount#0" - ] - }, - "1060": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#0" - ] - }, - "1061": { - "op": "btoi", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1062": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2" - ] - }, - "1063": { - "op": "bz asset_config_bool_true@3", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1066": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2" - ] - }, - "1067": { - "op": "pushint 255", - "defined_out": [ - "255", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2", - "255" - ] - }, - "1070": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_periods#0", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#1" - ] - }, - "1071": { - "op": "bz asset_config_bool_false@4", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1074": { - "block": "asset_config_bool_true@3", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ] - }, - "1075": { - "error": "Invalid day-count convention ID", - "block": "asset_config_bool_merge@5", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ], - "op": "assert // Invalid day-count convention ID", - "defined_out": [], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1076": { - "op": "bytec 15 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"day_count_convention\"" - ] - }, - "1078": { - "op": "dig 1", - "defined_out": [ - "\"day_count_convention\"", - "day_count_convention#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"day_count_convention\"", - "day_count_convention#2" - ] - }, - "1080": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1081": { - "op": "dig 6", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0" - ] - }, - "1083": { - "op": "btoi", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2" - ] - }, - "1084": { - "op": "bury 8", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1086": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0" - ] - }, - "1087": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0", - "\"principal_discount\"" - ] - }, - "1089": { - "op": "app_global_get_ex", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1090": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "maybe_value%0#0" - ] - }, - "1091": { - "op": "bnz asset_config_after_if_else@7", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1094": { - "op": "dig 7", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2" - ] - }, - "1096": { - "error": "Interest rate is not properly defined", - "op": "assert // Interest rate is not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1097": { - "block": "asset_config_after_if_else@7", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"interest_rate\"" - ] - }, - "1099": { - "op": "dig 8", - "defined_out": [ - "\"interest_rate\"", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"interest_rate\"", - "interest_rate#2" - ] - }, - "1101": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1102": { - "op": "dig 5", - "defined_out": [ - "aggregate%array_length%0#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1104": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "1105": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "interest_rate#2", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "tmp%1#1" - ] - }, - "1106": { - "error": "Coupon rates are not properly defined", - "op": "assert // Coupon rates are not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1107": { - "op": "bytec 31 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "aggregate%array_length%0#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "\"total_coupons\"" - ] - }, - "1109": { - "op": "dig 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "\"total_coupons\"", - "aggregate%array_length%0#0 (copy)" - ] - }, - "1111": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1112": { - "op": "pushint 3", - "defined_out": [ - "3", - "aggregate%array_length%0#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "3" - ] - }, - "1114": { - "op": "+", - "defined_out": [ - "aggregate%array_length%0#0", - "interest_rate#2", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#0" - ] - }, - "1115": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#0", - "aggregate%array_length%1#0" - ] - }, - "1117": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "tmp%2#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%2#1" - ] - }, - "1118": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1119": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1121": { - "callsub": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "1124": { - "op": "bytec 32 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "1126": { - "op": "box_del", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "{box_del}" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "{box_del}" - ] - }, - "1127": { - "op": "pop", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1128": { - "op": "bytec 32 // 0x74696d654576656e7473", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "1130": { - "op": "dig 1", - "defined_out": [ - "0x74696d654576656e7473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473", - "time_events#0 (copy)" - ] - }, - "1132": { - "op": "box_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1133": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "1134": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "time_events#0 (copy)", - "2" - ] - }, - "1136": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "values%0#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "values%0#1" - ] - }, - "1137": { - "op": "bytec 8 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "values%0#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "values%0#1", - "\"primary_distribution_opening_date\"" - ] - }, - "1139": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "\"primary_distribution_opening_date\"", - "values%0#1" - ] - }, - "1140": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1141": { - "op": "dup", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "1142": { - "op": "pushint 10", - "defined_out": [ - "10", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "time_events#0 (copy)", - "10" - ] - }, - "1144": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "values%1#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "values%1#1" - ] - }, - "1145": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "values%1#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "values%1#1", - "\"primary_distribution_closure_date\"" - ] - }, - "1147": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "\"primary_distribution_closure_date\"", - "values%1#1" - ] - }, - "1148": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1149": { - "op": "pushint 18", - "defined_out": [ - "18", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "18" - ] - }, - "1151": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "values%2#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "values%2#0" - ] - }, - "1152": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0", - "values%2#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "values%2#0", - "\"issuance_date\"" - ] - }, - "1153": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"issuance_date\"", - "values%2#0" - ] - }, - "1154": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1155": { - "op": "bytec 10 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"maturity_date\"" - ] - }, - "1157": { - "op": "intc_0 // 0", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"maturity_date\"", - "0" - ] - }, - "1158": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1159": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%2#0" - ] - }, - "1161": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%2#0", - "1" - ] - }, - "1162": { - "op": "==", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#1" - ] - }, - "1163": { - "error": "Time periods are not properly defined", - "op": "assert // Time periods are not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1164": { - "op": "dig 2", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0" - ] - }, - "1166": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0", - "time_periods#0 (copy)" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "time_periods#0 (copy)" - ] - }, - "1167": { - "op": "extract 2 16", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "aggregate%encoded_element%3#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "aggregate%encoded_element%3#0" - ] - }, - "1170": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "aggregate%encoded_element%3#0", - "aggregate%encoded_element%3#0 (copy)", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "aggregate%encoded_element%3#0", - "aggregate%encoded_element%3#0 (copy)" - ] - }, - "1171": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "aggregate%encoded_element%3#0", - "aggregate%encoded_element%3#0 (copy)", - "0" - ] - }, - "1172": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "aggregate%encoded_element%3#0", - "coupon_period_duration#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "aggregate%encoded_element%3#0", - "coupon_period_duration#0" - ] - }, - "1173": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "coupon_period_duration#0", - "aggregate%encoded_element%3#0" - ] - }, - "1174": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "aggregate%encoded_element%3#0", - "coupon_period_duration#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "coupon_period_duration#0", - "aggregate%encoded_element%3#0", - "8" - ] - }, - "1175": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "coupon_period_duration#0", - "interest_rate#2", - "repetitions#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "coupon_period_duration#0", - "repetitions#0" - ] - }, - "1176": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "repetitions#0", - "coupon_period_duration#0" - ] - }, - "1177": { - "error": "Time period durations must be strictly greater than zero", - "op": "assert // Time period durations must be strictly greater than zero", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "repetitions#0" - ] - }, - "1178": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0", - "tmp%3#1" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "tmp%3#1" - ] - }, - "1179": { - "error": "Time period repetitions are not properly defined", - "op": "assert // Time period repetitions are not properly defined", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0" - ] - }, - "1180": { - "op": "bytec 29 // 0x74696d65506572696f6473", - "defined_out": [ - "0x74696d65506572696f6473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "0x74696d65506572696f6473" - ] - }, - "1182": { - "op": "box_del", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "{box_del}" - ] - }, - "1183": { - "op": "pop", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0" - ] - }, - "1184": { - "op": "bytec 29 // 0x74696d65506572696f6473", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_periods#0", - "0x74696d65506572696f6473" - ] - }, - "1186": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0x74696d65506572696f6473", - "time_periods#0" - ] - }, - "1187": { - "op": "box_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1188": { - "op": "bytec 29 // 0x74696d65506572696f6473", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0x74696d65506572696f6473" - ] - }, - "1190": { - "op": "pushints 2 16", - "defined_out": [ - "0x74696d65506572696f6473", - "16", - "2", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "0x74696d65506572696f6473", - "2", - "16" - ] - }, - "1194": { - "op": "box_extract", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "box%box_extract%0#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "box%box_extract%0#0" - ] - }, - "1195": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "box%box_extract%0#0", - "0" - ] - }, - "1196": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "aggregate%item0%1#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%item0%1#0" - ] - }, - "1197": { - "op": "bytec 17 // \"coupon_period\"", - "defined_out": [ - "\"coupon_period\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "aggregate%item0%1#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%item0%1#0", - "\"coupon_period\"" - ] - }, - "1199": { - "op": "swap", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"coupon_period\"", - "aggregate%item0%1#0" - ] - }, - "1200": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1201": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"status\"" - ] - }, - "1202": { - "op": "pushint 100", - "defined_out": [ - "\"status\"", - "100", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "interest_rate#2", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"status\"", - "100" - ] - }, - "1204": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1205": { - "op": "intc_1 // 1", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "1" - ] - }, - "1206": { - "op": "return", - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1207": { - "block": "asset_config_bool_false@4", - "stack_in": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "interest_rate#2", - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "time_periods#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ] - }, - "1208": { - "op": "b asset_config_bool_merge@5" - }, - "1211": { - "subroutine": "modules.actus.pbn.PBNCoreMixin.update_interest_rate[routing]", - "params": {}, - "block": "update_interest_rate", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0" - ] - }, - "1214": { - "op": "dup", - "defined_out": [ - "interest_rate#0", - "interest_rate#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "interest_rate#0 (copy)" - ] - }, - "1215": { - "op": "len", - "defined_out": [ - "interest_rate#0", - "len%0#0" - ], - "stack_out": [ - "interest_rate#0", - "len%0#0" - ] - }, - "1216": { - "op": "pushint 2", - "defined_out": [ - "2", - "interest_rate#0", - "len%0#0" - ], - "stack_out": [ - "interest_rate#0", - "len%0#0", - "2" - ] - }, - "1218": { - "op": "==", - "defined_out": [ - "eq%0#0", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "eq%0#0" - ] - }, - "1219": { - "error": "invalid number of bytes for arc4.uint16", - "op": "assert // invalid number of bytes for arc4.uint16", - "stack_out": [ - "interest_rate#0" - ] - }, - "1220": { - "op": "bytec 18 // 0x52383023", - "defined_out": [ - "0x52383023", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "0x52383023" - ] - }, - "1222": { - "op": "txn Sender", - "defined_out": [ - "0x52383023", - "interest_rate#0", - "tmp%0#0" - ], - "stack_out": [ - "interest_rate#0", - "0x52383023", - "tmp%0#0" - ] - }, - "1224": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "interest_rate#0", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#0", - "tmp%1#1" - ] - }, - "1227": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "interest_rate#0" - ] - }, - "1228": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "1231": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "1234": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "due_coupons#0", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "due_coupons#0" - ] - }, - "1237": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "op": "callsub all_due_coupons_paid", - "stack_out": [ - "interest_rate#0", - "tmp%1#1" - ] - }, - "1240": { - "error": "Pending due coupon payment", - "op": "assert // Pending due coupon payment", - "stack_out": [ - "interest_rate#0" - ] - }, - "1241": { - "op": "btoi", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "1242": { - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1", - "\"interest_rate\"" - ] - }, - "1244": { - "op": "swap", - "stack_out": [ - "\"interest_rate\"", - "tmp%2#1" - ] - }, - "1245": { - "op": "app_global_put", - "stack_out": [] - }, - "1246": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%3#1" - ], - "stack_out": [ - "tmp%3#1" - ] - }, - "1248": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "1249": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "1250": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "1251": { - "op": "concat", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "1252": { - "op": "log", - "stack_out": [] - }, - "1253": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "1254": { - "op": "return", - "stack_out": [] - }, - "1255": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_account_units_current_value[routing]", - "params": {}, - "block": "get_account_units_current_value", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "1256": { - "op": "pushbytes \"\"", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0" - ] - }, - "1258": { - "op": "dupn 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ] - }, - "1260": { - "op": "txna ApplicationArgs 1" - }, - "1263": { - "op": "dup", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "holding_address#0" - ] - }, - "1264": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "len%0#0" - ] - }, - "1265": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1266": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1267": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0" - ] - }, - "1268": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1271": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1272": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "1273": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "1274": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1275": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1276": { - "op": "btoi", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1277": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "1278": { - "op": "bytec 8 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "1280": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1281": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "1282": { - "op": "bz get_account_units_current_value_bool_false@4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1285": { - "op": "global LatestTimestamp", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "1287": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0" - ] - }, - "1288": { - "op": "bytec 8 // \"primary_distribution_opening_date\"", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "1290": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1291": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%1#0" - ] - }, - "1292": { - "op": ">=", - "defined_out": [ - "holding_address#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "1293": { - "op": "bz get_account_units_current_value_bool_false@4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1296": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1297": { - "error": "Primary distribution not yet executed", - "block": "get_account_units_current_value_bool_merge@5", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Primary distribution not yet executed", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1298": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x52333023" - ] - }, - "1299": { - "op": "dig 2", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x52333023", - "holding_address#0" - ] - }, - "1301": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1302": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1303": { - "op": "bury 9", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1305": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1306": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_exists%0#0" - ] - }, - "1308": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1309": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "units#0" - ] - }, - "1310": { - "op": "bz get_account_units_current_value_bool_false@8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1313": { - "op": "dig 7", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1315": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1316": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0" - ] - }, - "1317": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0", - "32" - ] - }, - "1318": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "values%0#0" - ] - }, - "1319": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "values%0#0", - "units#0" - ] - }, - "1321": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%4#1" - ] - }, - "1322": { - "op": "bz get_account_units_current_value_bool_false@8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1325": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ] - }, - "1326": { - "error": "Invalid amount of units for the account", - "block": "get_account_units_current_value_bool_merge@9", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ], - "op": "assert // Invalid amount of units for the account", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1327": { - "op": "dig 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1329": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1330": { - "op": "dig 2", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "holding_address#0 (copy)", - "units#0" - ] - }, - "1332": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "account_units_nominal_value#0" - ] - }, - "1335": { - "op": "bury 8", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1337": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "accrued_interest#0" - ] - }, - "1338": { - "op": "bury 7", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1340": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "numerator#0" - ] - }, - "1341": { - "op": "bury 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1343": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "denominator#0" - ] - }, - "1344": { - "op": "bury 6", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0" - ] - }, - "1346": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "due_coupons#0" - ] - }, - "1349": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "due_coupons#0", - "due_coupons#0" - ] - }, - "1350": { - "op": "bury 6", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "due_coupons#0" - ] - }, - "1352": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "holding_address#0" - ] - }, - "1353": { - "op": "dig 1", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "due_coupons#0 (copy)", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "holding_address#0", - "due_coupons#0 (copy)" - ] - }, - "1355": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "op": "callsub assert_no_pending_coupon_payment", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0" - ] - }, - "1358": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.is_accruing_interest", - "op": "callsub is_accruing_interest", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "tmp%7#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%7#0" - ] - }, - "1361": { - "op": "bz get_account_units_current_value_after_if_else@11", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1364": { - "op": "dig 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0" - ] - }, - "1366": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "due_coupons#0 (copy)" - ] - }, - "1367": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "day_count_factor#0" - ] - }, - "1370": { - "op": "dig 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "day_count_factor#0", - "holding_address#0" - ] - }, - "1372": { - "op": "dig 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "due_coupons#0", - "day_count_factor#0", - "holding_address#0", - "units#0" - ] - }, - "1374": { - "op": "uncover 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "holding_address#0", - "units#0", - "due_coupons#0" - ] - }, - "1376": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.accrued_interest_amount", - "op": "callsub accrued_interest_amount", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "accrued_interest#0" - ] - }, - "1379": { - "op": "bury 7", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1381": { - "op": "dup", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "1382": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "1383": { - "op": "extract_uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "numerator#0" - ] - }, - "1384": { - "op": "bury 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1386": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "account_units_nominal_value#0", - "accrued_interest#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "8" - ] - }, - "1387": { - "op": "extract_uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "denominator#0" - ] - }, - "1388": { - "op": "bury 5", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1390": { - "block": "get_account_units_current_value_after_if_else@11", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "dig 2", - "defined_out": [ - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "numerator#0" - ] - }, - "1392": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1393": { - "op": "dig 5", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0", - "denominator#0" - ] - }, - "1395": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1396": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0" - ] - }, - "1397": { - "op": "dig 7", - "defined_out": [ - "account_units_nominal_value#0", - "aggregate%head%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "account_units_nominal_value#0" - ] - }, - "1399": { - "op": "itob", - "defined_out": [ - "account_units_nominal_value#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1400": { - "op": "dig 7", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "accrued_interest#0" - ] - }, - "1402": { - "op": "itob", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1403": { - "op": "concat", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%head%3#0" - ] - }, - "1404": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%3#0", - "aggregate%head%1#0" - ] - }, - "1405": { - "op": "concat", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%4#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%4#0" - ] - }, - "1406": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "account_units_nominal_value#0", - "accrued_interest#0", - "aggregate%head%4#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%4#0", - "0x151f7c75" - ] - }, - "1407": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%head%4#0" - ] - }, - "1408": { - "op": "concat", - "defined_out": [ - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "numerator#0", - "tmp%5#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%5#0" - ] - }, - "1409": { - "op": "log", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1410": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "1" - ] - }, - "1411": { - "op": "return", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1412": { - "block": "get_account_units_current_value_bool_false@8", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%1#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ] - }, - "1413": { - "op": "b get_account_units_current_value_bool_merge@9" - }, - "1416": { - "block": "get_account_units_current_value_bool_false@4", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "due_coupons#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1417": { - "op": "b get_account_units_current_value_bool_merge@5" - }, - "1420": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_payment_amount[routing]", - "params": {}, - "block": "get_payment_amount", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "1423": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1424": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "1425": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1426": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "1427": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "1428": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "1429": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "1431": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "box_prefixed_key%0#0" - ] - }, - "1432": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "holding_address#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1433": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "maybe_exists%0#0" - ] - }, - "1435": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "holding_address#0" - ] - }, - "1436": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "1439": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "0" - ] - }, - "1440": { - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "0", - "\"interest_rate\"" - ] - }, - "1442": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1443": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "tmp%0#1", - "maybe_value%0#0" - ] - }, - "1444": { - "op": "*", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1" - ] - }, - "1445": { - "op": "intc 4 // 10000", - "defined_out": [ - "10000", - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1", - "10000" - ] - }, - "1447": { - "op": "/", - "defined_out": [ - "interest_amount#0" - ], - "stack_out": [ - "interest_amount#0" - ] - }, - "1448": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "1449": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0" - ] - }, - "1450": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1451": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0" - ] - }, - "1452": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "1453": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "1454": { - "op": "concat", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "1455": { - "op": "log", - "stack_out": [] - }, - "1456": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "1457": { - "op": "return", - "stack_out": [] - }, - "1458": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_coupons_status[routing]", - "params": {}, - "block": "get_coupons_status", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "all_due_coupons_paid#0" - ] - }, - "1460": { - "op": "dupn 4", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1462": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "0" - ] - }, - "1463": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "0", - "\"status\"" - ] - }, - "1464": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1465": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0" - ] - }, - "1466": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "100" - ] - }, - "1468": { - "op": "==", - "defined_out": [ - "tmp%0#3" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%0#3" - ] - }, - "1469": { - "op": "bz get_coupons_status_ternary_false@3", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1472": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1475": { - "op": "bury 3", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1477": { - "block": "get_coupons_status_ternary_merge@4", - "stack_in": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "op": "dig 2", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1479": { - "op": "dup", - "defined_out": [ - "due_coupons#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "due_coupons#0 (copy)" - ] - }, - "1480": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "due_coupons#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "due_coupons#0 (copy)", - "1" - ] - }, - "1481": { - "op": "+", - "defined_out": [ - "due_coupons#0", - "tmp%0#2" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "tmp%0#2" - ] - }, - "1482": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.coupon_due_date", - "op": "callsub coupon_due_date", - "defined_out": [ - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "next_coupon_due_date#0" - ] - }, - "1485": { - "op": "bury 3", - "defined_out": [ - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1487": { - "op": "dup", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "due_coupons#0 (copy)" - ] - }, - "1488": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "op": "callsub all_due_coupons_paid", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "all_due_coupons_paid#0" - ] - }, - "1491": { - "op": "bury 6", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1493": { - "op": "intc_0 // 0", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "numerator#0" - ] - }, - "1494": { - "op": "bury 2", - "defined_out": [ - "all_due_coupons_paid#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1496": { - "op": "intc_0 // 0", - "defined_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0", - "denominator#0" - ] - }, - "1497": { - "op": "bury 5", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1499": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.is_accruing_interest", - "op": "callsub is_accruing_interest", - "defined_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%3#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%3#0" - ] - }, - "1502": { - "op": "bz get_coupons_status_after_if_else@6", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1505": { - "op": "dig 2", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1507": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "all_due_coupons_paid#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "day_count_factor#0" - ] - }, - "1510": { - "op": "dup", - "defined_out": [ - "all_due_coupons_paid#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "1511": { - "op": "intc_0 // 0", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "1512": { - "op": "extract_uint64", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "day_count_factor#0", - "numerator#0" - ] - }, - "1513": { - "op": "bury 2", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "day_count_factor#0" - ] - }, - "1515": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "all_due_coupons_paid#0", - "day_count_factor#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "day_count_factor#0", - "8" - ] - }, - "1516": { - "op": "extract_uint64", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "denominator#0" - ] - }, - "1517": { - "op": "bury 4", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1519": { - "block": "get_coupons_status_after_if_else@6", - "stack_in": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "0" - ] - }, - "1520": { - "op": "bytec 31 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "0", - "\"total_coupons\"" - ] - }, - "1522": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1523": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0" - ] - }, - "1524": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "numerator#0" - ] - }, - "1526": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1527": { - "op": "dig 5", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "aggregate%val_as_bytes%0#0", - "denominator#0" - ] - }, - "1529": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1530": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "denominator#0", - "maybe_value%0#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "maybe_value%0#0", - "aggregate%head%1#0" - ] - }, - "1531": { - "op": "swap", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "maybe_value%0#0" - ] - }, - "1532": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1533": { - "op": "dig 4", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "due_coupons#0" - ] - }, - "1535": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1536": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "due_coupons#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%head%3#0" - ] - }, - "1537": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "next_coupon_due_date#0" - ] - }, - "1539": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%4#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "1540": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%head%4#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%1#0", - "aggregate%head%4#0" - ] - }, - "1541": { - "op": "swap", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%4#0", - "aggregate%head%1#0" - ] - }, - "1542": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%5#0" - ] - }, - "1543": { - "op": "bytec 30 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%5#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%5#0", - "0x00" - ] - }, - "1545": { - "op": "intc_0 // 0", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%5#0", - "0x00", - "0" - ] - }, - "1546": { - "op": "dig 7", - "defined_out": [ - "0", - "0x00", - "aggregate%head%5#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%5#0", - "0x00", - "0", - "all_due_coupons_paid#0" - ] - }, - "1548": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "aggregate%head%5#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%5#0", - "aggregate%encoded_bool%0#0" - ] - }, - "1549": { - "op": "concat", - "defined_out": [ - "aggregate%head%6#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%6#0" - ] - }, - "1550": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%6#0", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "aggregate%head%6#0", - "0x151f7c75" - ] - }, - "1551": { - "op": "swap", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "0x151f7c75", - "aggregate%head%6#0" - ] - }, - "1552": { - "op": "concat", - "defined_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%1#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "tmp%1#0" - ] - }, - "1553": { - "op": "log", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1554": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "1" - ] - }, - "1555": { - "op": "return", - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1556": { - "block": "get_coupons_status_ternary_false@3", - "stack_in": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0", - "due_coupons#0" - ] - }, - "1557": { - "op": "bury 3", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "all_due_coupons_paid#0", - "denominator#0", - "due_coupons#0", - "next_coupon_due_date#0", - "numerator#0" - ] - }, - "1559": { - "op": "b get_coupons_status_ternary_merge@4" - }, - "1562": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_time_periods[routing]", - "params": {}, - "block": "get_time_periods", - "stack_in": [], - "op": "bytec 33 // 0x0000" - }, - "1564": { - "op": "intc_0 // 0" - }, - "1565": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "0", - "\"status\"" - ] - }, - "1566": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1567": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "time_periods#0", - "maybe_value%0#0" - ] - }, - "1568": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "maybe_value%0#0", - "100" - ] - }, - "1570": { - "op": "==", - "defined_out": [ - "time_periods#0", - "tmp%0#2" - ], - "stack_out": [ - "time_periods#0", - "tmp%0#2" - ] - }, - "1571": { - "op": "bz get_time_periods_after_if_else@3", - "stack_out": [ - "time_periods#0" - ] - }, - "1574": { - "op": "bytec 29 // 0x74696d65506572696f6473", - "defined_out": [ - "0x74696d65506572696f6473", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "0x74696d65506572696f6473" - ] - }, - "1576": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%1#0", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "time_periods#0", - "aggregate%box_get%1#0" - ] - }, - "1577": { - "op": "swap", - "stack_out": [ - "time_periods#0", - "aggregate%box_get%1#0", - "time_periods#0" - ] - }, - "1578": { - "op": "bury 2", - "stack_out": [ - "time_periods#0", - "aggregate%box_get%1#0" - ] - }, - "1580": { - "error": "check self.time_periods exists", - "op": "assert // check self.time_periods exists", - "stack_out": [ - "time_periods#0" - ] - }, - "1581": { - "block": "get_time_periods_after_if_else@3", - "stack_in": [ - "time_periods#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "time_periods#0", - "0x151f7c75" - ] - }, - "1582": { - "op": "dig 1", - "defined_out": [ - "0x151f7c75", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "0x151f7c75", - "time_periods#0" - ] - }, - "1584": { - "op": "concat", - "defined_out": [ - "time_periods#0", - "tmp%1#0" - ], - "stack_out": [ - "time_periods#0", - "tmp%1#0" - ] - }, - "1585": { - "op": "log", - "stack_out": [ - "time_periods#0" - ] - }, - "1586": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "time_periods#0" - ], - "stack_out": [ - "time_periods#0", - "1" - ] - }, - "1587": { - "op": "return", - "stack_out": [ - "time_periods#0" - ] - }, - "1588": { - "subroutine": "modules.payment_agent.coupon.CouponPaymentAgentMixin.pay_coupon[routing]", - "params": {}, - "block": "pay_coupon", - "stack_in": [], - "op": "txna ApplicationArgs 1" - }, - "1591": { - "op": "dupn 2", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1593": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "len%0#0" - ] - }, - "1594": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1595": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1596": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "holding_address#0" - ] - }, - "1597": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1600": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1601": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)", - "0" - ] - }, - "1602": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0" - ] - }, - "1603": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "1605": { - "op": "+", - "defined_out": [ - "add%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "add%0#0" - ] - }, - "1606": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "add%0#0", - "tmp%2#0 (copy)" - ] - }, - "1608": { - "op": "len", - "defined_out": [ - "add%0#0", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "add%0#0", - "len%1#0" - ] - }, - "1609": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1610": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1611": { - "op": "extract 2 0", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "payment_info#0" - ] - }, - "1614": { - "op": "swap", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0" - ] - }, - "1615": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0" - ] - }, - "1616": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0", - "\"status\"" - ] - }, - "1617": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1618": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "maybe_value%0#0" - ] - }, - "1619": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "100" - ] - }, - "1621": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_info#0", - "tmp%0#9" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "tmp%0#9" - ] - }, - "1622": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0" - ] - }, - "1623": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "1626": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "1629": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0x52333023" - ] - }, - "1630": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "1632": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1633": { - "op": "dup", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "1634": { - "op": "cover 2", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1636": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1637": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%0#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1638": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "1640": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1641": { - "op": "dup", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1642": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1643": { - "op": "pop", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0" - ] - }, - "1644": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "32" - ] - }, - "1645": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "units#2" - ] - }, - "1646": { - "op": "dup", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "units#2", - "units#2" - ] - }, - "1647": { - "op": "cover 3", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "box_prefixed_key%0#3", - "units#2" - ] - }, - "1649": { - "error": "No D-ASA units", - "op": "assert // No D-ASA units", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1650": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "box_prefixed_key%0#3", - "due_coupons#0" - ] - }, - "1653": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "box_prefixed_key%0#3" - ] - }, - "1654": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "1655": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "aggregate%box_get%2#0" - ] - }, - "1656": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%2#0", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "aggregate%box_get%2#0", - "48" - ] - }, - "1658": { - "op": "extract_uint64", - "defined_out": [ - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "due_coupons#0", - "account_paid_coupons#0" - ] - }, - "1659": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "due_coupons#0" - ] - }, - "1660": { - "op": "dig 1", - "defined_out": [ - "account_paid_coupons#0", - "account_paid_coupons#0 (copy)", - "box_prefixed_key%0#3", - "due_coupons#0", - "holding_address#0", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "due_coupons#0", - "account_paid_coupons#0 (copy)" - ] - }, - "1662": { - "op": ">", - "defined_out": [ - "account_paid_coupons#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%3#3", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0", - "tmp%3#3" - ] - }, - "1663": { - "error": "No due coupon to pay", - "op": "assert // No due coupon to pay", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "account_paid_coupons#0" - ] - }, - "1664": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "op": "callsub all_due_coupons_paid", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%4#2", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0", - "tmp%4#2" - ] - }, - "1667": { - "error": "Pending due coupon payment", - "op": "assert // Pending due coupon payment", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "holding_address#0" - ] - }, - "1668": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "principal_amount#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "principal_amount#0" - ] - }, - "1671": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "principal_amount#0", - "0" - ] - }, - "1672": { - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "principal_amount#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "principal_amount#0", - "0", - "\"interest_rate\"" - ] - }, - "1674": { - "op": "app_global_get_ex", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "principal_amount#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1675": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "principal_amount#0", - "maybe_value%0#0" - ] - }, - "1676": { - "op": "*", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%0#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "tmp%0#1" - ] - }, - "1677": { - "op": "intc 4 // 10000", - "defined_out": [ - "10000", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%0#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "tmp%0#1", - "10000" - ] - }, - "1679": { - "op": "/", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1680": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0" - ] - }, - "1681": { - "op": "bytec 21 // 0x52323523", - "defined_out": [ - "0", - "0x52323523", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0", - "0x52323523" - ] - }, - "1683": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#5", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#5", - "maybe_exists%0#0" - ] - }, - "1684": { - "error": "check self.op_daemon exists", - "op": "assert // check self.op_daemon exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#5" - ] - }, - "1685": { - "op": "global ZeroAddress", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_value%0#5", - "payment_amount#1", - "payment_info#0", - "tmp%0#3", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#5", - "tmp%0#3" - ] - }, - "1687": { - "op": "!=", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%1#2", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#2" - ] - }, - "1688": { - "op": "bz pay_coupon_after_if_else@22", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1691": { - "op": "txn Sender", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%2#3", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#3" - ] - }, - "1693": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#3", - "0" - ] - }, - "1694": { - "op": "bytec 21 // 0x52323523", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#3", - "0", - "0x52323523" - ] - }, - "1696": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%1#1", - "maybe_value%1#1", - "payment_amount#1", - "payment_info#0", - "tmp%2#3", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#3", - "maybe_value%1#1", - "maybe_exists%1#1" - ] - }, - "1697": { - "error": "check self.op_daemon exists", - "op": "assert // check self.op_daemon exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#3", - "maybe_value%1#1" - ] - }, - "1698": { - "op": "==", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%3#3" - ] - }, - "1699": { - "op": "bnz pay_coupon_bool_true@19", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1702": { - "op": "txn Sender", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%4#3", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%4#3" - ] - }, - "1704": { - "op": "dig 5", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%4#3", - "holding_address#0" - ] - }, - "1706": { - "op": "==", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%5#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%5#1" - ] - }, - "1707": { - "op": "bnz pay_coupon_bool_true@19", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1710": { - "op": "txn Sender", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%6#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%6#0" - ] - }, - "1712": { - "op": "dig 3", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%6#0", - "box_prefixed_key%0#3" - ] - }, - "1714": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%6#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%6#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "1715": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%6#0", - "aggregate%box_get%4#0" - ] - }, - "1716": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%2#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%6#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%6#0", - "aggregate%extract%2#0" - ] - }, - "1719": { - "op": "==", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#1", - "payment_info#0", - "tmp%7#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%7#0" - ] - }, - "1720": { - "op": "bz pay_coupon_bool_false@20", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1723": { - "block": "pay_coupon_bool_true@19", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "or_result%0#0" - ] - }, - "1724": { - "error": "Not authorized", - "block": "pay_coupon_bool_merge@21", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "or_result%0#0" - ], - "op": "assert // Not authorized", - "defined_out": [], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1725": { - "block": "pay_coupon_after_if_else@22", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3" - ] - }, - "1727": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "1728": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%box_get%6#0" - ] - }, - "1729": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%3#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%extract%3#0" - ] - }, - "1732": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "aggregate%extract%3#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%extract%3#0", - "0" - ] - }, - "1733": { - "op": "bytec 14 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "aggregate%extract%3#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%extract%3#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "1735": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%extract%3#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%extract%3#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1736": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%extract%3#0", - "maybe_value%0#0" - ] - }, - "1737": { - "op": "asset_holding_get AssetBalance", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#2" - ] - }, - "1739": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#2" - ] - }, - "1741": { - "op": "bz pay_coupon_bool_false@27", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1744": { - "op": "dig 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3" - ] - }, - "1746": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "1747": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%box_get%8#0" - ] - }, - "1748": { - "op": "pushint 448", - "defined_out": [ - "448", - "aggregate%box_get%8#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%box_get%8#0", - "448" - ] - }, - "1751": { - "op": "getbit", - "defined_out": [ - "aggregate%get_bit%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%get_bit%0#0" - ] - }, - "1752": { - "op": "bnz pay_coupon_bool_false@27", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1755": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "and_result%0#0" - ] - }, - "1756": { - "block": "pay_coupon_bool_merge@28", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "and_result%0#0" - ], - "op": "bz pay_coupon_else_body@3", - "defined_out": [], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1759": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#3" - ] - }, - "1761": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#3", - "0" - ] - }, - "1762": { - "op": "bytec 14 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#3", - "0", - "\"settlement_asset_id\"" - ] - }, - "1764": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#3", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1765": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#3", - "maybe_value%0#0" - ] - }, - "1766": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "tmp%0#3" - ] - }, - "1767": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "tmp%0#3", - "maybe_value%0#0 (copy)" - ] - }, - "1769": { - "op": "asset_holding_get AssetBalance", - "defined_out": [ - "check%0#0", - "maybe_value%0#0", - "value%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#1", - "check%0#0" - ] - }, - "1771": { - "error": "account opted into asset", - "op": "assert // account opted into asset", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#1" - ] - }, - "1772": { - "op": "dig 2", - "defined_out": [ - "maybe_value%0#0", - "payment_amount#1", - "value%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#1", - "payment_amount#1" - ] - }, - "1774": { - "op": "dup", - "defined_out": [ - "maybe_value%0#0", - "payment_amount#1", - "payment_amount#1 (copy)", - "value%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#1", - "payment_amount#1 (copy)", - "payment_amount#1 (copy)" - ] - }, - "1775": { - "op": "cover 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "value%0#1", - "payment_amount#1 (copy)" - ] - }, - "1777": { - "op": ">=", - "defined_out": [ - "maybe_value%0#0", - "payment_amount#1", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "tmp%1#2" - ] - }, - "1778": { - "error": "Not enough funds for the payment", - "op": "assert // Not enough funds for the payment", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1" - ] - }, - "1779": { - "op": "dig 4", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "box_prefixed_key%0#3" - ] - }, - "1781": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%10#0", - "aggregate%box_get%11#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "aggregate%box_get%10#0", - "aggregate%box_get%11#0" - ] - }, - "1782": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "aggregate%box_get%10#0" - ] - }, - "1783": { - "op": "extract 0 32", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "receiver#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "receiver#0" - ] - }, - "1786": { - "op": "itxn_begin" - }, - "1787": { - "op": "global MinTxnFee", - "defined_out": [ - "box_prefixed_key%0#3", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "payment_amount#1", - "receiver#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "payment_amount#1", - "receiver#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1789": { - "op": "uncover 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "receiver#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "payment_amount#1" - ] - }, - "1791": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "receiver#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1793": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "receiver#0" - ] - }, - "1794": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1796": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ] - }, - "1797": { - "op": "itxn_field XferAsset", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1799": { - "op": "pushint 4 // axfer", - "defined_out": [ - "axfer", - "box_prefixed_key%0#3", - "inner_txn_params%0%%param_Fee_idx_0#0", - "payment_amount#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "1801": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1803": { - "op": "itxn_field Fee", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1805": { - "op": "itxn_submit" - }, - "1806": { - "block": "pay_coupon_after_if_else@4", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3" - ] - }, - "1808": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1809": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%12#0", - "aggregate%box_get%13#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%box_get%12#0", - "aggregate%box_get%13#0" - ] - }, - "1810": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%box_get%12#0" - ] - }, - "1811": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%12#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%box_get%12#0", - "48" - ] - }, - "1813": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "values%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "values%0#1" - ] - }, - "1814": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "box_prefixed_key%0#3", - "values%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "values%0#1", - "1" - ] - }, - "1815": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "1816": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "aggregate%val_as_bytes%0#0" - ] - }, - "1817": { - "op": "pushint 48" - }, - "1819": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "box_prefixed_key%0#3", - "48", - "aggregate%val_as_bytes%0#0" - ] - }, - "1820": { - "op": "box_replace", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1821": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0" - ] - }, - "1822": { - "op": "bytec 28 // \"paid_coupon_units\"", - "defined_out": [ - "\"paid_coupon_units\"", - "0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0", - "\"paid_coupon_units\"" - ] - }, - "1824": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1825": { - "error": "check self.paid_coupon_units exists", - "op": "assert // check self.paid_coupon_units exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0" - ] - }, - "1826": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "units#2" - ] - }, - "1828": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0" - ] - }, - "1829": { - "op": "bytec 28 // \"paid_coupon_units\"", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "\"paid_coupon_units\"" - ] - }, - "1831": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "\"paid_coupon_units\"", - "tmp%1#0" - ] - }, - "1832": { - "op": "app_global_put", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1833": { - "op": "global CurrentApplicationID", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1" - ] - }, - "1835": { - "op": "global LatestTimestamp", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0" - ] - }, - "1837": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "0" - ] - }, - "1838": { - "op": "bytec 24 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0", - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "0", - "\"denomination_asset_id\"" - ] - }, - "1840": { - "op": "app_global_get_ex", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1841": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0" - ] - }, - "1842": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#1", - "tmp%1#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "1843": { - "op": "asset_params_get AssetUnitName", - "defined_out": [ - "box_prefixed_key%0#3", - "check%0#0", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "check%0#0" - ] - }, - "1845": { - "error": "asset exists", - "op": "assert // asset exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0" - ] - }, - "1846": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "0" - ] - }, - "1847": { - "op": "bytec 4 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "0", - "\"circulating_units\"" - ] - }, - "1849": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_exists%2#0", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1850": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0" - ] - }, - "1851": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "1852": { - "op": "bytec 7 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0", - "\"unit_value\"" - ] - }, - "1854": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_exists%3#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1", - "tmp%1#0", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1855": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "1856": { - "op": "*", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%0#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2" - ] - }, - "1857": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "tmp%0#1" - ] - }, - "1859": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%1#0" - ] - }, - "1860": { - "op": "pushbytes 0x080037", - "defined_out": [ - "0x080037", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%1#0", - "0x080037" - ] - }, - "1865": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%1#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%2#0" - ] - }, - "1866": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%2#0", - "tmp%1#0" - ] - }, - "1868": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%2#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1869": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%3#0" - ] - }, - "1870": { - "op": "dig 4", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%3#0", - "payment_amount#1" - ] - }, - "1872": { - "op": "itob", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1873": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0" - ] - }, - "1874": { - "op": "dig 1", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "1876": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "maybe_value%0#0", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0" - ] - }, - "1877": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "maybe_value%0#0" - ] - }, - "1879": { - "op": "itob", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%4#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "1880": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0" - ] - }, - "1881": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0", - "value%0#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "value%0#0 (copy)" - ] - }, - "1883": { - "op": "len", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length%1#0" - ] - }, - "1884": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%2#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%as_bytes%2#0" - ] - }, - "1885": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "value%0#0", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0" - ] - }, - "1888": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "value%0#0" - ] - }, - "1890": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%encoded_value%1#0" - ] - }, - "1891": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0" - ] - }, - "1892": { - "op": "pushbytes 0x003b", - "defined_out": [ - "0x003b", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "0x003b" - ] - }, - "1896": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%2#2", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%2#2", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0" - ] - }, - "1897": { - "op": "uncover 3", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "tmp%2#2" - ] - }, - "1899": { - "op": "itob", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%5#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "1900": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0" - ] - }, - "1901": { - "op": "bytec 33 // 0x0000", - "defined_out": [ - "0x0000", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "0x0000" - ] - }, - "1903": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0" - ] - }, - "1904": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "0" - ] - }, - "1905": { - "op": "itob", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%6#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%6#0" - ] - }, - "1906": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0" - ] - }, - "1907": { - "op": "pushbytes 0x00024950", - "defined_out": [ - "0x00024950", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "0x00024950" - ] - }, - "1913": { - "op": "concat", - "defined_out": [ - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%concat%0#0" - ] - }, - "1914": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0" - ] - }, - "1915": { - "op": "concat", - "defined_out": [ - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0" - ] - }, - "1916": { - "op": "pushbytes 0x8c29904e // method \"Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)\"", - "defined_out": [ - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))" - ] - }, - "1922": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0" - ] - }, - "1923": { - "op": "concat", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "event%0#0", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "event%0#0" - ] - }, - "1924": { - "op": "log", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0" - ] - }, - "1925": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "tmp%3#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "tmp%3#1" - ] - }, - "1927": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "1928": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0" - ] - }, - "1929": { - "op": "dig 4", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0" - ] - }, - "1931": { - "op": "dup", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "payment_info#0 (copy)", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "payment_info#0 (copy)" - ] - }, - "1932": { - "op": "len", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length%2#0" - ] - }, - "1933": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%4#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%as_bytes%4#0" - ] - }, - "1934": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length_uint16%2#0" - ] - }, - "1937": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "payment_info#0" - ] - }, - "1938": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%11#0", - "aggregate%encoded_value%2#0" - ] - }, - "1939": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0" - ] - }, - "1940": { - "op": "pushbytes 0x0012", - "defined_out": [ - "0x0012", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "0x0012" - ] - }, - "1944": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%12#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%encoded_value%2#0", - "aggregate%head%12#0" - ] - }, - "1945": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%head%12#0", - "aggregate%encoded_value%2#0" - ] - }, - "1946": { - "op": "concat", - "defined_out": [ - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%concat%2#0" - ] - }, - "1947": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "aggregate%concat%2#0", - "0x151f7c75" - ] - }, - "1948": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "0x151f7c75", - "aggregate%concat%2#0" - ] - }, - "1949": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#1", - "payment_info#0", - "tmp%5#0", - "units#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "tmp%5#0" - ] - }, - "1950": { - "op": "log", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1951": { - "op": "intc_1 // 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "1" - ] - }, - "1952": { - "op": "return", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1953": { - "block": "pay_coupon_else_body@3", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "payment_amount#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "payment_amount#1" - ] - }, - "1954": { - "op": "bury 1", - "defined_out": [ - "payment_amount#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ] - }, - "1956": { - "op": "b pay_coupon_after_if_else@4" - }, - "1959": { - "block": "pay_coupon_bool_false@27", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "and_result%0#0" - ] - }, - "1960": { - "op": "b pay_coupon_bool_merge@28" - }, - "1963": { - "block": "pay_coupon_bool_false@20", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "units#2", - "payment_amount#1", - "or_result%0#0" - ] - }, - "1964": { - "op": "b pay_coupon_bool_merge@21" - }, - "1967": { - "subroutine": "modules.transfer_agent.coupon.CouponTransferAgentMixin.asset_transfer[routing]", - "params": {}, - "block": "asset_transfer", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0" - ] - }, - "1968": { - "op": "dupn 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ] - }, - "1970": { - "op": "pushbytes \"\"", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0" - ] - }, - "1972": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0" - ] - }, - "1973": { - "op": "txna ApplicationArgs 1" - }, - "1976": { - "op": "dup", - "defined_out": [ - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "sender_holding_address#0" - ] - }, - "1977": { - "op": "len", - "defined_out": [ - "len%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "len%0#0" - ] - }, - "1978": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "len%0#0", - "32" - ] - }, - "1979": { - "op": "==", - "defined_out": [ - "eq%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "eq%0#0" - ] - }, - "1980": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0" - ] - }, - "1981": { - "op": "txna ApplicationArgs 2" - }, - "1984": { - "op": "dup", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "receiver_holding_address#0" - ] - }, - "1985": { - "op": "len", - "defined_out": [ - "len%1#0", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "len%1#0" - ] - }, - "1986": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "len%1#0", - "32" - ] - }, - "1987": { - "op": "==", - "defined_out": [ - "eq%1#0", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "eq%1#0" - ] - }, - "1988": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0" - ] - }, - "1989": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0" - ] - }, - "1992": { - "op": "dup", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ] - }, - "1993": { - "op": "len", - "defined_out": [ - "len%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "len%2#0" - ] - }, - "1994": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "len%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "len%2#0", - "8" - ] - }, - "1995": { - "op": "==", - "defined_out": [ - "eq%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "eq%2#0" - ] - }, - "1996": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0" - ] - }, - "1997": { - "op": "btoi", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1998": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "1999": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"status\"" - ] - }, - "2000": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2001": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2002": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "100" - ] - }, - "2004": { - "op": "==", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%0#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#1" - ] - }, - "2005": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2008": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2009": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2011": { - "op": "app_global_get_ex", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2012": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2013": { - "op": "global LatestTimestamp", - "defined_out": [ - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "tmp%1#1" - ] - }, - "2015": { - "op": "<=", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%2#2", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%2#2" - ] - }, - "2016": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2019": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2020": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2022": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2023": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "2024": { - "op": "bz asset_transfer_bool_true@5", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2027": { - "op": "global LatestTimestamp", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1" - ] - }, - "2029": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "0" - ] - }, - "2030": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2032": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2033": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "maybe_value%2#0" - ] - }, - "2034": { - "op": "<", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%5#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%5#0" - ] - }, - "2035": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2038": { - "block": "asset_transfer_bool_true@5", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2039": { - "error": "Secondary market is closed", - "block": "asset_transfer_bool_merge@7", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Secondary market is closed", - "defined_out": [], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2040": { - "op": "txn Sender", - "defined_out": [ - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3" - ] - }, - "2042": { - "op": "dig 3", - "defined_out": [ - "sender_holding_address#0", - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3", - "sender_holding_address#0" - ] - }, - "2044": { - "op": "dup", - "defined_out": [ - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3", - "sender_holding_address#0 (copy)", - "sender_holding_address#0 (copy)" - ] - }, - "2045": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "tmp%0#3", - "sender_holding_address#0 (copy)" - ] - }, - "2047": { - "op": "==", - "defined_out": [ - "sender_holding_address#0", - "tmp%1#4" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "tmp%1#4" - ] - }, - "2048": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0" - ] - }, - "2049": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2052": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2055": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "0x52333023" - ] - }, - "2056": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "0x52333023", - "sender_holding_address#0 (copy)" - ] - }, - "2058": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "2059": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2" - ] - }, - "2060": { - "op": "bury 9", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "2062": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2063": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#2", - "maybe_exists%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2064": { - "op": "bury 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "maybe_exists%0#0" - ] - }, - "2066": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "2067": { - "op": "bytec_1 // 0x52333023", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023" - ] - }, - "2068": { - "op": "dig 4", - "defined_out": [ - "0x52333023", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023", - "receiver_holding_address#0" - ] - }, - "2070": { - "op": "dup", - "defined_out": [ - "0x52333023", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "receiver_holding_address#0 (copy)", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023", - "receiver_holding_address#0 (copy)", - "receiver_holding_address#0 (copy)" - ] - }, - "2071": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "0x52333023", - "receiver_holding_address#0 (copy)" - ] - }, - "2073": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2074": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "2075": { - "op": "bury 10", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2077": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2078": { - "op": "box_len", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2079": { - "op": "bury 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "2081": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2082": { - "op": "dig 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "sender_holding_address#0 (copy)" - ] - }, - "2084": { - "callsub": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "op": "callsub assert_is_not_account_suspended", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2087": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "receiver_holding_address#0 (copy)" - ] - }, - "2089": { - "callsub": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "op": "callsub assert_is_not_account_suspended", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "2092": { - "op": "uncover 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "sender_holding_address#0" - ] - }, - "2094": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "sender_holding_address#0", - "receiver_holding_address#0" - ] - }, - "2096": { - "op": "!=", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%0#1" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "2097": { - "error": "Sender and receiver must be different", - "op": "assert // Sender and receiver must be different", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ] - }, - "2098": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0" - ] - }, - "2100": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0", - "units#0 (copy)" - ] - }, - "2101": { - "error": "Transfer units must be greater than zero", - "op": "assert // Transfer units must be greater than zero", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0" - ] - }, - "2102": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2104": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2105": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0" - ] - }, - "2106": { - "op": "dup", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)" - ] - }, - "2107": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "32" - ] - }, - "2108": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%box_get%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "values%0#0" - ] - }, - "2109": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "values%0#0", - "units#0" - ] - }, - "2111": { - "op": ">=", - "defined_out": [ - "aggregate%box_get%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%2#2", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "tmp%2#2" - ] - }, - "2112": { - "error": "Insufficient sender units to transfer", - "op": "assert // Insufficient sender units to transfer", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0" - ] - }, - "2113": { - "op": "extract 40 8", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%extract%1#0" - ] - }, - "2116": { - "op": "bury 9", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2118": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "2119": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0" - ] - }, - "2120": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0", - "32" - ] - }, - "2121": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%1#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%1#0" - ] - }, - "2122": { - "op": "bz asset_transfer_else_body@9", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2125": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2127": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "2128": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0" - ] - }, - "2129": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%6#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0", - "40" - ] - }, - "2131": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0" - ] - }, - "2132": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "box_prefixed_key%0#3" - ] - }, - "2134": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "2135": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0" - ] - }, - "2136": { - "op": "pushint 40", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0", - "40" - ] - }, - "2138": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "values%1#0" - ] - }, - "2139": { - "op": "==", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#1" - ] - }, - "2140": { - "op": "bz asset_transfer_bool_false@20", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2143": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2145": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%10#0", - "aggregate%box_get%11#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0", - "aggregate%box_get%11#0" - ] - }, - "2146": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0" - ] - }, - "2147": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%10#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0", - "48" - ] - }, - "2149": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0" - ] - }, - "2150": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "box_prefixed_key%0#3" - ] - }, - "2152": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%12#0", - "aggregate%box_get%13#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0", - "aggregate%box_get%13#0" - ] - }, - "2153": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0" - ] - }, - "2154": { - "op": "pushint 48", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0", - "48" - ] - }, - "2156": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0", - "values%3#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "values%3#0" - ] - }, - "2157": { - "op": "==", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#4" - ] - }, - "2158": { - "op": "bz asset_transfer_bool_false@20", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2161": { - "op": "intc_1 // 1", - "defined_out": [ - "aggregate%extract%1#0", - "and_result%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2162": { - "error": "Sender and receiver units are not fungible", - "block": "asset_transfer_bool_merge@21", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Sender and receiver units are not fungible", - "defined_out": [], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2163": { - "block": "asset_transfer_after_if_else@10", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 6", - "defined_out": [ - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2165": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2166": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%16#0", - "aggregate%box_get%17#0", - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0", - "aggregate%box_get%17#0" - ] - }, - "2167": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0" - ] - }, - "2168": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%16#0", - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0", - "40" - ] - }, - "2170": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_unit_value#0" - ] - }, - "2171": { - "op": "bury 5", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2173": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons", - "op": "callsub count_due_coupons", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0" - ] - }, - "2176": { - "op": "dig 4", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0" - ] - }, - "2178": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0 (copy)", - "sender_holding_address#0 (copy)" - ] - }, - "2179": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "due_coupons#0", - "sender_holding_address#0 (copy)" - ] - }, - "2181": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "due_coupons#0 (copy)", - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "due_coupons#0", - "sender_holding_address#0 (copy)", - "due_coupons#0 (copy)" - ] - }, - "2183": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "op": "callsub assert_no_pending_coupon_payment", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "due_coupons#0" - ] - }, - "2186": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0" - ] - }, - "2187": { - "op": "dig 3", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "units#0" - ] - }, - "2189": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "due_coupons#0", - "sender_holding_address#0", - "units#0 (copy)", - "units#0 (copy)" - ] - }, - "2190": { - "op": "cover 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "due_coupons#0", - "sender_holding_address#0", - "units#0 (copy)" - ] - }, - "2192": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "sender_holding_address#0", - "units#0 (copy)", - "due_coupons#0" - ] - }, - "2194": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.accrued_interest_amount", - "op": "callsub accrued_interest_amount", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "accrued_interest#0" - ] - }, - "2197": { - "op": "bury 7", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0" - ] - }, - "2199": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2201": { - "op": "box_get", - "defined_out": [ - "accrued_interest#0", - "aggregate%box_get%18#0", - "aggregate%box_get%19#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0", - "aggregate%box_get%19#0" - ] - }, - "2202": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0" - ] - }, - "2203": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "accrued_interest#0", - "aggregate%box_get%18#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0", - "32" - ] - }, - "2204": { - "op": "extract_uint64", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0" - ] - }, - "2205": { - "op": "dup2", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "units#0 (copy)", - "values%0#0", - "values%0#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0", - "units#0 (copy)", - "values%0#0 (copy)" - ] - }, - "2206": { - "op": "<=", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "tmp%0#1", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0", - "tmp%0#1" - ] - }, - "2207": { - "error": "Insufficient sender units to transfer", - "op": "assert // Insufficient sender units to transfer", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0" - ] - }, - "2208": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "values%0#0", - "units#0" - ] - }, - "2209": { - "op": "-", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "tmp%1#1" - ] - }, - "2210": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0" - ] - }, - "2211": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2213": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2 (copy)", - "32" - ] - }, - "2214": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "32", - "aggregate%val_as_bytes%0#0" - ] - }, - "2216": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "2217": { - "op": "box_get", - "defined_out": [ - "accrued_interest#0", - "aggregate%box_get%22#0", - "aggregate%box_get%23#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0", - "aggregate%box_get%23#0" - ] - }, - "2218": { - "op": "pop", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0" - ] - }, - "2219": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0", - "32" - ] - }, - "2220": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0" - ] - }, - "2221": { - "op": "bnz asset_transfer_after_if_else@16", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2224": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "2225": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2226": { - "op": "dig 7", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2" - ] - }, - "2228": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2229": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "2231": { - "op": "pushint 40", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "40" - ] - }, - "2233": { - "op": "dig 2", - "defined_out": [ - "40", - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "40", - "aggregate%val_as_bytes%1#0 (copy)" - ] - }, - "2235": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0" - ] - }, - "2236": { - "op": "pushint 48" - }, - "2238": { - "op": "swap", - "defined_out": [ - "48", - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "48", - "aggregate%val_as_bytes%1#0" - ] - }, - "2239": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2240": { - "block": "asset_transfer_after_if_else@16", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 5", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2242": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2243": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%24#0", - "aggregate%box_get%25#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0", - "aggregate%box_get%25#0" - ] - }, - "2244": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0" - ] - }, - "2245": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%24#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0", - "32" - ] - }, - "2246": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0" - ] - }, - "2247": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0", - "units#0" - ] - }, - "2249": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "units#0", - "units#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0", - "units#0 (copy)", - "units#0 (copy)" - ] - }, - "2250": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "values%0#0", - "units#0 (copy)" - ] - }, - "2252": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#6", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "tmp%0#6" - ] - }, - "2253": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2254": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3" - ] - }, - "2256": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "32" - ] - }, - "2257": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "box_prefixed_key%0#3", - "32", - "aggregate%val_as_bytes%2#0" - ] - }, - "2259": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0" - ] - }, - "2260": { - "op": "dig 4", - "defined_out": [ - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "sender_unit_value#0" - ] - }, - "2262": { - "op": "*", - "defined_out": [ - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "2263": { - "op": "dig 5", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#1", - "accrued_interest#0" - ] - }, - "2265": { - "op": "+", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "2266": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2267": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "accrued_interest#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "2268": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "2269": { - "op": "concat", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%8#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%8#0" - ] - }, - "2270": { - "op": "log", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2271": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "1" - ] - }, - "2272": { - "op": "return", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2273": { - "block": "asset_transfer_bool_false@20", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2274": { - "op": "b asset_transfer_bool_merge@21" - }, - "2277": { - "block": "asset_transfer_else_body@9", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 5", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2279": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2280": { - "op": "pushint 40", - "defined_out": [ - "40", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "40" - ] - }, - "2282": { - "op": "dig 10", - "defined_out": [ - "40", - "aggregate%extract%1#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "40", - "aggregate%extract%1#0" - ] - }, - "2284": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2285": { - "op": "dig 7", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#2" - ] - }, - "2287": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%14#0", - "aggregate%box_get%15#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%14#0", - "aggregate%box_get%15#0" - ] - }, - "2288": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%14#0" - ] - }, - "2289": { - "op": "extract 48 8", - "defined_out": [ - "aggregate%extract%1#0", - "aggregate%extract%7#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%extract%7#0" - ] - }, - "2292": { - "op": "pushint 48" - }, - "2294": { - "op": "swap", - "defined_out": [ - "48", - "aggregate%extract%1#0", - "aggregate%extract%7#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "48", - "aggregate%extract%7#0" - ] - }, - "2295": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2296": { - "op": "b asset_transfer_after_if_else@10" - }, - "2299": { - "block": "asset_transfer_bool_false@6", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2300": { - "op": "b asset_transfer_bool_merge@7" - }, - "2303": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.asset_create[routing]", - "params": {}, - "block": "asset_create", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "arranger#0" - ], - "stack_out": [ - "arranger#0" - ] - }, - "2306": { - "op": "dup", - "defined_out": [ - "arranger#0", - "arranger#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "arranger#0 (copy)" - ] - }, - "2307": { - "op": "len", - "defined_out": [ - "arranger#0", - "len%0#0" - ], - "stack_out": [ - "arranger#0", - "len%0#0" - ] - }, - "2308": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "arranger#0", - "len%0#0" - ], - "stack_out": [ - "arranger#0", - "len%0#0", - "32" - ] - }, - "2309": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%0#0" - ], - "stack_out": [ - "arranger#0", - "eq%0#0" - ] - }, - "2310": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "arranger#0" - ] - }, - "2311": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "arranger#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0" - ] - }, - "2314": { - "op": "dup", - "defined_out": [ - "arranger#0", - "metadata#0", - "metadata#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "metadata#0 (copy)" - ] - }, - "2315": { - "op": "len", - "defined_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ] - }, - "2316": { - "op": "dig 1", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)" - ] - }, - "2318": { - "op": "pushint 38", - "defined_out": [ - "38", - "arranger#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "38" - ] - }, - "2320": { - "error": "invalid tuple encoding", - "op": "extract_uint16 // on error: invalid tuple encoding", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2321": { - "op": "dup", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)" - ] - }, - "2322": { - "op": "pushint 40", - "defined_out": [ - "40", - "arranger#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "40" - ] - }, - "2324": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%1#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "eq%1#0" - ] - }, - "2325": { - "error": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "op": "assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2326": { - "op": "dig 2", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "metadata#0 (copy)" - ] - }, - "2328": { - "op": "swap", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0" - ] - }, - "2329": { - "op": "dig 2", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0", - "tuple_len%0#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0", - "tuple_len%0#0 (copy)" - ] - }, - "2331": { - "op": "substring3", - "defined_out": [ - "arranger#0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "substring3%0#0" - ] - }, - "2332": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "arranger#0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "substring3%0#0", - "0" - ] - }, - "2333": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0" - ] - }, - "2334": { - "op": "pushint 42", - "defined_out": [ - "42", - "aggregate%array_length%0#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0", - "42" - ] - }, - "2336": { - "op": "+", - "defined_out": [ - "add%1#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "add%1#0" - ] - }, - "2337": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%2#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "eq%2#0" - ] - }, - "2338": { - "error": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "op": "assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "stack_out": [ - "arranger#0", - "metadata#0" - ] - }, - "2339": { - "op": "bytec 6 // 0x52323023", - "defined_out": [ - "0x52323023", - "arranger#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "0x52323023" - ] - }, - "2341": { - "op": "uncover 2", - "stack_out": [ - "metadata#0", - "0x52323023", - "arranger#0" - ] - }, - "2343": { - "op": "app_global_put", - "stack_out": [ - "metadata#0" - ] - }, - "2344": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "\"metadata\"" - ] - }, - "2346": { - "op": "swap", - "stack_out": [ - "\"metadata\"", - "metadata#0" - ] - }, - "2347": { - "op": "app_global_put", - "stack_out": [] - }, - "2348": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2349": { - "op": "return", - "stack_out": [] - }, - "2350": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.asset_update[routing]", - "params": {}, - "block": "asset_update", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "metadata#0" - ], - "stack_out": [ - "metadata#0" - ] - }, - "2353": { - "op": "dup", - "defined_out": [ - "metadata#0", - "metadata#0 (copy)" - ], - "stack_out": [ - "metadata#0", - "metadata#0 (copy)" - ] - }, - "2354": { - "op": "len", - "defined_out": [ - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0" - ] - }, - "2355": { - "op": "dig 1", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)" - ] - }, - "2357": { - "op": "pushint 38", - "defined_out": [ - "38", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "38" - ] - }, - "2359": { - "error": "invalid tuple encoding", - "op": "extract_uint16 // on error: invalid tuple encoding", - "defined_out": [ - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2360": { - "op": "dup", - "defined_out": [ - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)" - ] - }, - "2361": { - "op": "pushint 40", - "defined_out": [ - "40", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "40" - ] - }, - "2363": { - "op": "==", - "defined_out": [ - "eq%0#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "eq%0#0" - ] - }, - "2364": { - "error": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "op": "assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2365": { - "op": "dig 2", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "metadata#0 (copy)" - ] - }, - "2367": { - "op": "swap", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0" - ] - }, - "2368": { - "op": "dig 2", - "defined_out": [ - "extract_uint16%0#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0", - "tuple_len%0#0 (copy)" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0", - "tuple_len%0#0 (copy)" - ] - }, - "2370": { - "op": "substring3", - "defined_out": [ - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "substring3%0#0" - ] - }, - "2371": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "substring3%0#0", - "0" - ] - }, - "2372": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0" - ] - }, - "2373": { - "op": "pushint 42", - "defined_out": [ - "42", - "aggregate%array_length%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0", - "42" - ] - }, - "2375": { - "op": "+", - "defined_out": [ - "add%1#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "add%1#0" - ] - }, - "2376": { - "op": "==", - "defined_out": [ - "eq%1#0", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "eq%1#0" - ] - }, - "2377": { - "error": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "op": "assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "stack_out": [ - "metadata#0" - ] - }, - "2378": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2381": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "\"metadata\"" - ] - }, - "2383": { - "op": "swap", - "stack_out": [ - "\"metadata\"", - "metadata#0" - ] - }, - "2384": { - "op": "app_global_put", - "stack_out": [] - }, - "2385": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2386": { - "op": "return", - "stack_out": [] - }, - "2387": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.set_secondary_time_events[routing]", - "params": {}, - "block": "set_secondary_time_events", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0" - ] - }, - "2388": { - "op": "txna ApplicationArgs 1" - }, - "2391": { - "op": "dupn 2", - "defined_out": [ - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "2393": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)", - "0" - ] - }, - "2394": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2395": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "2396": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "8" - ] - }, - "2397": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "mul%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "mul%0#0" - ] - }, - "2398": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "mul%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "mul%0#0", - "2" - ] - }, - "2400": { - "op": "+", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0" - ] - }, - "2401": { - "op": "uncover 2", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0", - "secondary_market_time_events#0" - ] - }, - "2403": { - "op": "len", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "len%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0", - "len%0#0" - ] - }, - "2404": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "eq%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "eq%0#0" - ] - }, - "2405": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2406": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2409": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "0" - ] - }, - "2410": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "0", - "\"status\"" - ] - }, - "2411": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_length%0#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2412": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0" - ] - }, - "2413": { - "op": "intc 5 // 200", - "defined_out": [ - "200", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "200" - ] - }, - "2415": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0", - "tmp%0#2" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "tmp%0#2" - ] - }, - "2416": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0", - "tmp%1#1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "tmp%1#1" - ] - }, - "2417": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2418": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2421": { - "op": "dup", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "2422": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2423": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "1" - ] - }, - "2424": { - "op": ">", - "defined_out": [ - "secondary_market_time_events#0", - "tmp%5#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%5#0" - ] - }, - "2425": { - "op": "bz set_secondary_time_events_after_if_else@3", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2428": { - "op": "dup", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0" - ] - }, - "2429": { - "callsub": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "2432": { - "op": "bury 1", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2434": { - "block": "set_secondary_time_events_after_if_else@3", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2435": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"issuance_date\"" - ] - }, - "2436": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2437": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0" - ] - }, - "2438": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ] - }, - "2440": { - "op": "dup", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "2441": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "2444": { - "op": "bury 4", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ] - }, - "2446": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "2" - ] - }, - "2448": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "values%0#0" - ] - }, - "2449": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "maybe_value%0#0" - ] - }, - "2450": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "values%0#0", - "values%0#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "maybe_value%0#0", - "values%0#0 (copy)" - ] - }, - "2452": { - "op": "<=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%6#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "tmp%6#0" - ] - }, - "2453": { - "error": "Invalid secondary market opening date", - "op": "assert // Invalid secondary market opening date", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0" - ] - }, - "2454": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "\"secondary_market_opening_date\"" - ] - }, - "2456": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "\"secondary_market_opening_date\"", - "values%0#0" - ] - }, - "2457": { - "op": "app_global_put", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2458": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2459": { - "op": "bytec 10 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"maturity_date\"" - ] - }, - "2461": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2462": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%1#0" - ] - }, - "2463": { - "op": "bz set_secondary_time_events_after_if_else@5", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2466": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2467": { - "op": "bytec 10 // \"maturity_date\"", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"maturity_date\"" - ] - }, - "2469": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2470": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0" - ] - }, - "2471": { - "op": "dig 1", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ] - }, - "2473": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2474": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%3#0", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_length%3#0" - ] - }, - "2475": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%3#0", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_length%3#0", - "1" - ] - }, - "2476": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "tmp%9#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "tmp%9#0" - ] - }, - "2477": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "tmp%9#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "tmp%9#0", - "8" - ] - }, - "2478": { - "op": "*", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%bytes_offset%1#0" - ] - }, - "2479": { - "op": "dig 3", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0" - ] - }, - "2481": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0" - ] - }, - "2482": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "values%2#0" - ] - }, - "2483": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "maybe_value%2#0" - ] - }, - "2484": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "values%2#0", - "values%2#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "maybe_value%2#0", - "values%2#0 (copy)" - ] - }, - "2486": { - "op": ">=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%10#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "tmp%10#0" - ] - }, - "2487": { - "error": "Invalid secondary market closure date", - "op": "assert // Invalid secondary market closure date", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0" - ] - }, - "2488": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "\"secondary_market_closure_date\"" - ] - }, - "2490": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "\"secondary_market_closure_date\"", - "values%2#0" - ] - }, - "2491": { - "op": "app_global_put", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2492": { - "block": "set_secondary_time_events_after_if_else@5", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2493": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2495": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2496": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0" - ] - }, - "2497": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "0" - ] - }, - "2498": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "maybe_value%3#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2500": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%3#0", - "maybe_value%4#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2501": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_value%4#0" - ] - }, - "2502": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%4#0", - "maybe_value%3#0" - ] - }, - "2503": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%4#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%4#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2504": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%4#0" - ] - }, - "2505": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2506": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%head%1#0" - ] - }, - "2507": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "2508": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "2509": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%2#0" - ] - }, - "2510": { - "op": "log", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2511": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "1" - ] - }, - "2512": { - "op": "return", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2513": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.set_default_status[routing]", - "params": {}, - "block": "set_default_status", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "2516": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "2517": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "2518": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "2519": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "2520": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "2521": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "2522": { - "op": "getbit", - "defined_out": [ - "defaulted#0" - ], - "stack_out": [ - "defaulted#0" - ] - }, - "2523": { - "op": "bytec 19 // 0x52363023", - "defined_out": [ - "0x52363023", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "0x52363023" - ] - }, - "2525": { - "op": "txn Sender", - "defined_out": [ - "0x52363023", - "defaulted#0", - "tmp%0#2" - ], - "stack_out": [ - "defaulted#0", - "0x52363023", - "tmp%0#2" - ] - }, - "2527": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "defaulted#0", - "tmp%1#0" - ], - "stack_out": [ - "defaulted#0", - "tmp%1#0" - ] - }, - "2530": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "defaulted#0" - ] - }, - "2531": { - "op": "bytec 23 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "\"asset_defaulted\"" - ] - }, - "2533": { - "op": "swap", - "stack_out": [ - "\"asset_defaulted\"", - "defaulted#0" - ] - }, - "2534": { - "op": "app_global_put", - "stack_out": [] - }, - "2535": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2537": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2538": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2539": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2540": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "2541": { - "op": "log", - "stack_out": [] - }, - "2542": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "2543": { - "op": "return", - "stack_out": [] - }, - "2544": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.primary_distribution[routing]", - "params": {}, - "block": "primary_distribution", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "2546": { - "op": "txna ApplicationArgs 1" - }, - "2549": { - "op": "dup", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "holding_address#0" - ] - }, - "2550": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "len%0#0" - ] - }, - "2551": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2552": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "eq%0#0" - ] - }, - "2553": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0" - ] - }, - "2554": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "2557": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "2558": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "2559": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "2560": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "2561": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "2562": { - "op": "btoi", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2563": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2564": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"status\"" - ] - }, - "2565": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2566": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2567": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "100" - ] - }, - "2569": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%0#4", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%0#4" - ] - }, - "2570": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2573": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2574": { - "op": "bytec 8 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2576": { - "op": "app_global_get_ex", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2577": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2578": { - "op": "global LatestTimestamp" - }, - "2580": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "2581": { - "op": "bury 5", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0" - ] - }, - "2583": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%1#2", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "2584": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2587": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2588": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2590": { - "op": "app_global_get_ex", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2591": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "2592": { - "op": "dig 3", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "awst_tmp%0#0" - ] - }, - "2594": { - "op": ">", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "2595": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2598": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2599": { - "error": "Primary distribution is closed", - "block": "primary_distribution_bool_merge@6", - "stack_in": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Primary distribution is closed", - "defined_out": [], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2600": { - "op": "bytec 20 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52353023" - ] - }, - "2602": { - "op": "txn Sender", - "defined_out": [ - "0x52353023", - "tmp%0#3" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52353023", - "tmp%0#3" - ] - }, - "2604": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "2607": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2608": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52333023" - ] - }, - "2609": { - "op": "dig 2", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52333023", - "holding_address#0" - ] - }, - "2611": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "2612": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2613": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2614": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2616": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "2617": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2620": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2623": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0" - ] - }, - "2625": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "units#0 (copy)" - ] - }, - "2626": { - "error": "Can not distribute zero units", - "op": "assert // Can not distribute zero units", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0" - ] - }, - "2627": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "0" - ] - }, - "2628": { - "op": "bytec 4 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "0", - "\"circulating_units\"" - ] - }, - "2630": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2631": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0" - ] - }, - "2632": { - "op": "dig 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0", - "units#0 (copy)" - ] - }, - "2634": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2635": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "0" - ] - }, - "2636": { - "op": "bytec 13 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "0", - "\"total_units\"" - ] - }, - "2638": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2639": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0" - ] - }, - "2640": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_value%1#0", - "tmp%1#1", - "tmp%1#1 (copy)", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "tmp%1#1 (copy)" - ] - }, - "2642": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "tmp%2#1" - ] - }, - "2643": { - "error": "Insufficient remaining D-ASA units", - "op": "assert // Insufficient remaining D-ASA units", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2644": { - "op": "bytec 4 // \"circulating_units\"", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "\"circulating_units\"" - ] - }, - "2646": { - "op": "dig 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "\"circulating_units\"", - "tmp%1#1 (copy)" - ] - }, - "2648": { - "op": "app_global_put", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2649": { - "op": "dig 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2651": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2652": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0" - ] - }, - "2653": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "2654": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "values%0#0" - ] - }, - "2655": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "values%0#0", - "units#0" - ] - }, - "2657": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "tmp%4#1" - ] - }, - "2658": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2659": { - "op": "dig 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2661": { - "op": "intc_2 // 32", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1 (copy)", - "32" - ] - }, - "2662": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "box_prefixed_key%0#1 (copy)", - "32", - "aggregate%val_as_bytes%0#0" - ] - }, - "2664": { - "op": "box_replace", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1" - ] - }, - "2665": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "0" - ] - }, - "2666": { - "op": "bytec 7 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "0", - "\"unit_value\"" - ] - }, - "2668": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%3#0", - "maybe_value%3#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2669": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "maybe_value%3#0" - ] - }, - "2670": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%1#0" - ] - }, - "2671": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1" - ] - }, - "2673": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "40" - ] - }, - "2675": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "box_prefixed_key%0#1", - "40", - "aggregate%val_as_bytes%1#0" - ] - }, - "2677": { - "op": "box_replace", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "2678": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0" - ] - }, - "2679": { - "op": "bytec 13 // \"total_units\"", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0", - "\"total_units\"" - ] - }, - "2681": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%4#0", - "maybe_value%4#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2682": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%4#0" - ] - }, - "2683": { - "op": "swap", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%4#0", - "tmp%1#1" - ] - }, - "2684": { - "op": "-", - "defined_out": [ - "holding_address#0", - "tmp%5#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%5#1" - ] - }, - "2685": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%2#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2686": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%2#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "0x151f7c75" - ] - }, - "2687": { - "op": "swap", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%val_as_bytes%2#0" - ] - }, - "2688": { - "op": "concat", - "defined_out": [ - "holding_address#0", - "tmp%6#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%6#0" - ] - }, - "2689": { - "op": "log", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2690": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "1" - ] - }, - "2691": { - "op": "return", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2692": { - "block": "primary_distribution_bool_false@5", - "stack_in": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2693": { - "op": "b primary_distribution_bool_merge@6" - }, - "2696": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_asset_info[routing]", - "params": {}, - "block": "get_asset_info", - "stack_in": [], - "op": "intc_0 // 0" - }, - "2697": { - "op": "global LatestTimestamp" - }, - "2699": { - "op": "intc_0 // 0" - }, - "2700": { - "op": "bytec 10 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "tmp%0#1", - "0", - "\"maturity_date\"" - ] - }, - "2702": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2703": { - "op": "swap", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2704": { - "op": "dup", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "2705": { - "op": "cover 2", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2707": { - "op": "cover 3", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2709": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%0#1", - "maybe_value%0#0" - ] - }, - "2710": { - "op": ">", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "tmp%1#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%1#1" - ] - }, - "2711": { - "op": "bz get_asset_info_after_if_else@4", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2714": { - "op": "dup", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0" - ] - }, - "2715": { - "op": "bz get_asset_info_after_if_else@4", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2718": { - "op": "pushint 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0" - ] - }, - "2720": { - "op": "bury 2", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2722": { - "block": "get_asset_info_after_if_else@4", - "stack_in": [ - "performance#0", - "maybe_value%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0" - ] - }, - "2723": { - "op": "bytec 23 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0", - "\"asset_defaulted\"" - ] - }, - "2725": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2726": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2727": { - "op": "bz get_asset_info_after_if_else@6", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2730": { - "op": "pushint 3", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0" - ] - }, - "2732": { - "op": "bury 2", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2734": { - "block": "get_asset_info_after_if_else@6", - "stack_in": [ - "performance#0", - "maybe_value%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0" - ] - }, - "2735": { - "op": "bytec 24 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0", - "\"denomination_asset_id\"" - ] - }, - "2737": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2738": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0" - ] - }, - "2739": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "2740": { - "op": "bytec 14 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "2742": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2743": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "2744": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "0" - ] - }, - "2745": { - "op": "bytec 4 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "0", - "\"circulating_units\"" - ] - }, - "2747": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2748": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0" - ] - }, - "2749": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "0" - ] - }, - "2750": { - "op": "bytec 7 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "0", - "\"unit_value\"" - ] - }, - "2752": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2753": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2754": { - "op": "dup2", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "maybe_value%1#0", - "maybe_value%1#0 (copy)", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%0#0 (copy)", - "maybe_value%1#0 (copy)" - ] - }, - "2755": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1" - ] - }, - "2756": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "0" - ] - }, - "2757": { - "op": "bytec 15 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "0", - "\"day_count_convention\"" - ] - }, - "2759": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%5#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%5#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "maybe_value%5#0", - "maybe_exists%5#0" - ] - }, - "2760": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "maybe_value%5#0" - ] - }, - "2761": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2762": { - "op": "dup", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "2763": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%bitlen%0#0" - ] - }, - "2764": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%bitlen%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%bitlen%0#0", - "8" - ] - }, - "2765": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%no_overflow%0#0" - ] - }, - "2766": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2767": { - "op": "extract 7 1", - "defined_out": [ - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0" - ] - }, - "2770": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "0" - ] - }, - "2771": { - "op": "bytec 26 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "0", - "\"principal_discount\"" - ] - }, - "2773": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint8%0#0", - "maybe_exists%6#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%6#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "maybe_value%6#0", - "maybe_exists%6#0" - ] - }, - "2774": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "maybe_value%6#0" - ] - }, - "2775": { - "op": "itob", - "defined_out": [ - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2776": { - "op": "dup", - "defined_out": [ - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)" - ] - }, - "2777": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%bitlen%1#0" - ] - }, - "2778": { - "op": "pushint 16", - "defined_out": [ - "16", - "aggregate%bitlen%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%bitlen%1#0", - "16" - ] - }, - "2780": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%no_overflow%1#0" - ] - }, - "2781": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2782": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0" - ] - }, - "2785": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "0" - ] - }, - "2786": { - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "0", - "\"interest_rate\"" - ] - }, - "2788": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_exists%7#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%7#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "maybe_value%7#0", - "maybe_exists%7#0" - ] - }, - "2789": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "maybe_value%7#0" - ] - }, - "2790": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2791": { - "op": "dup", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%2#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%2#0 (copy)" - ] - }, - "2792": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%2#0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%bitlen%2#0" - ] - }, - "2793": { - "op": "pushint 16", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%bitlen%2#0", - "16" - ] - }, - "2795": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%2#0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%no_overflow%2#0" - ] - }, - "2796": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2797": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0" - ] - }, - "2800": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "0" - ] - }, - "2801": { - "op": "bytec 13 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "0", - "\"total_units\"" - ] - }, - "2803": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%8#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_exists%8#0" - ] - }, - "2804": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0" - ] - }, - "2805": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "0" - ] - }, - "2806": { - "op": "bytec 8 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2808": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%10#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_exists%10#0" - ] - }, - "2809": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0" - ] - }, - "2810": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "0" - ] - }, - "2811": { - "op": "bytec 27 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2813": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%11#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_exists%11#0" - ] - }, - "2814": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0" - ] - }, - "2815": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "0" - ] - }, - "2816": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "0", - "\"issuance_date\"" - ] - }, - "2817": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%12#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_exists%12#0" - ] - }, - "2818": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0" - ] - }, - "2819": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "0" - ] - }, - "2820": { - "op": "bytec 10 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "0", - "\"maturity_date\"" - ] - }, - "2822": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%13#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_exists%13#0" - ] - }, - "2823": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0" - ] - }, - "2824": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "0" - ] - }, - "2825": { - "op": "bytec 22 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "0", - "\"asset_suspended\"" - ] - }, - "2827": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%14#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_exists%14#0" - ] - }, - "2828": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0" - ] - }, - "2829": { - "op": "dig 15", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ] - }, - "2831": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2832": { - "op": "dup", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "2833": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%bitlen%3#0" - ] - }, - "2834": { - "op": "intc_3 // 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%bitlen%3#0", - "8" - ] - }, - "2835": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%no_overflow%3#0" - ] - }, - "2836": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2837": { - "op": "extract 7 1", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0" - ] - }, - "2840": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "maybe_value%2#0" - ] - }, - "2842": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "2843": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "maybe_value%3#0" - ] - }, - "2845": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "aggregate%val_as_bytes%5#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "2846": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0" - ] - }, - "2847": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0", - "tmp%0#1" - ] - }, - "2849": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%6#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%6#0" - ] - }, - "2850": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0" - ] - }, - "2851": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0", - "maybe_value%1#0" - ] - }, - "2853": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%7#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%7#0" - ] - }, - "2854": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%3#0" - ] - }, - "2855": { - "op": "uncover 10", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%3#0", - "aggregate%uint8%0#0" - ] - }, - "2857": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%4#0" - ] - }, - "2858": { - "op": "uncover 9", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%4#0", - "aggregate%uint16%0#0" - ] - }, - "2860": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%uint16%1#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%5#0" - ] - }, - "2861": { - "op": "uncover 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%5#0", - "aggregate%uint16%1#0" - ] - }, - "2863": { - "op": "concat", - "defined_out": [ - "aggregate%head%6#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0" - ] - }, - "2864": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0", - "maybe_value%8#0" - ] - }, - "2866": { - "op": "itob", - "defined_out": [ - "aggregate%head%6#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%8#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "2867": { - "op": "concat", - "defined_out": [ - "aggregate%head%7#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0" - ] - }, - "2868": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0", - "maybe_value%0#0" - ] - }, - "2870": { - "op": "itob", - "defined_out": [ - "aggregate%head%7#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%9#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%9#0" - ] - }, - "2871": { - "op": "concat", - "defined_out": [ - "aggregate%head%8#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0" - ] - }, - "2872": { - "op": "uncover 6", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0", - "maybe_value%10#0" - ] - }, - "2874": { - "op": "itob", - "defined_out": [ - "aggregate%head%8#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%10#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%10#0" - ] - }, - "2875": { - "op": "concat", - "defined_out": [ - "aggregate%head%9#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0" - ] - }, - "2876": { - "op": "uncover 5", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0", - "maybe_value%11#0" - ] - }, - "2878": { - "op": "itob", - "defined_out": [ - "aggregate%head%9#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%11#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%11#0" - ] - }, - "2879": { - "op": "concat", - "defined_out": [ - "aggregate%head%10#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0" - ] - }, - "2880": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0", - "maybe_value%12#0" - ] - }, - "2882": { - "op": "itob", - "defined_out": [ - "aggregate%head%10#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%12#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0", - "aggregate%val_as_bytes%12#0" - ] - }, - "2883": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0" - ] - }, - "2884": { - "op": "uncover 3", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0", - "maybe_value%13#0" - ] - }, - "2886": { - "op": "itob", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%13#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0", - "aggregate%val_as_bytes%13#0" - ] - }, - "2887": { - "op": "concat", - "defined_out": [ - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0" - ] - }, - "2888": { - "op": "bytec 30 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00" - ] - }, - "2890": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00", - "0" - ] - }, - "2891": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00", - "0", - "maybe_value%14#0" - ] - }, - "2893": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "aggregate%encoded_bool%0#0" - ] - }, - "2894": { - "op": "concat", - "defined_out": [ - "aggregate%head%13#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%13#0" - ] - }, - "2895": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%13#0", - "aggregate%uint8%1#0" - ] - }, - "2896": { - "op": "concat", - "defined_out": [ - "aggregate%head%14#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%14#0" - ] - }, - "2897": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%14#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%14#0", - "0x151f7c75" - ] - }, - "2898": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0x151f7c75", - "aggregate%head%14#0" - ] - }, - "2899": { - "op": "concat", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "tmp%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%1#0" - ] - }, - "2900": { - "op": "log", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2901": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "1" - ] - }, - "2902": { - "op": "return", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2903": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_time_events[routing]", - "params": {}, - "block": "get_time_events", - "stack_in": [], - "op": "bytec 33 // 0x0000" - }, - "2905": { - "op": "intc_0 // 0" - }, - "2906": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0", - "\"status\"" - ] - }, - "2907": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2908": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "time_events#0", - "maybe_value%0#0" - ] - }, - "2909": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "100" - ] - }, - "2911": { - "op": "==", - "defined_out": [ - "time_events#0", - "tmp%0#2" - ], - "stack_out": [ - "time_events#0", - "tmp%0#2" - ] - }, - "2912": { - "op": "bz get_time_events_after_if_else@3", - "stack_out": [ - "time_events#0" - ] - }, - "2915": { - "op": "bytec 32 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "2917": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%1#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "time_events#0", - "aggregate%box_get%1#0" - ] - }, - "2918": { - "op": "swap", - "stack_out": [ - "time_events#0", - "aggregate%box_get%1#0", - "time_events#0" - ] - }, - "2919": { - "op": "bury 2", - "stack_out": [ - "time_events#0", - "aggregate%box_get%1#0" - ] - }, - "2921": { - "error": "check self.time_events exists", - "op": "assert // check self.time_events exists", - "stack_out": [ - "time_events#0" - ] - }, - "2922": { - "block": "get_time_events_after_if_else@3", - "stack_in": [ - "time_events#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "time_events#0", - "0x151f7c75" - ] - }, - "2923": { - "op": "dig 1", - "defined_out": [ - "0x151f7c75", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0x151f7c75", - "time_events#0" - ] - }, - "2925": { - "op": "concat", - "defined_out": [ - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "time_events#0", - "tmp%1#0" - ] - }, - "2926": { - "op": "log", - "stack_out": [ - "time_events#0" - ] - }, - "2927": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "1" - ] - }, - "2928": { - "op": "return", - "stack_out": [ - "time_events#0" - ] - }, - "2929": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_secondary_market_schedule[routing]", - "params": {}, - "block": "get_secondary_market_schedule", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "2930": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2932": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2933": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "2934": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "2935": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2937": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2938": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2939": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "maybe_value%0#0" - ] - }, - "2940": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2941": { - "op": "pushbytes 0x0002", - "defined_out": [ - "0x0002", - "aggregate%val_as_bytes%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%val_as_bytes%0#0", - "0x0002" - ] - }, - "2945": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "0x0002", - "aggregate%val_as_bytes%0#0" - ] - }, - "2946": { - "op": "concat", - "defined_out": [ - "aggregate%head%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%head%0#0" - ] - }, - "2947": { - "op": "swap", - "stack_out": [ - "aggregate%head%0#0", - "maybe_value%1#0" - ] - }, - "2948": { - "op": "itob", - "defined_out": [ - "aggregate%head%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%head%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2949": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0" - ] - }, - "2950": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "2951": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "2952": { - "op": "concat", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "2953": { - "op": "log", - "stack_out": [] - }, - "2954": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2955": { - "op": "return", - "stack_out": [] - }, - "2956": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_asset_metadata[routing]", - "params": {}, - "block": "get_asset_metadata", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "2957": { - "op": "bytec 25 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "0" - ], - "stack_out": [ - "0", - "\"metadata\"" - ] - }, - "2959": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2960": { - "error": "check self.metadata exists", - "op": "assert // check self.metadata exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "2961": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "2962": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "2963": { - "op": "concat", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "2964": { - "op": "log", - "stack_out": [] - }, - "2965": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2966": { - "op": "return", - "stack_out": [] - }, - "2967": { - "subroutine": "modules.accounting.AccountingModule.account_gov_suspension[routing]", - "params": {}, - "block": "account_gov_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "2970": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "2971": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "2972": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2973": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "2974": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "2975": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2978": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "2979": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "2980": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "1" - ] - }, - "2981": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "2982": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2983": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0" - ] - }, - "2984": { - "op": "getbit", - "defined_out": [ - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "2985": { - "op": "bytec 11 // 0x52373023", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023" - ] - }, - "2987": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "2989": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ] - }, - "2992": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "2993": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52333023" - ] - }, - "2994": { - "op": "uncover 2", - "stack_out": [ - "suspended#0", - "0x52333023", - "holding_address#0" - ] - }, - "2996": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "2997": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2998": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2999": { - "op": "bury 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3001": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "3002": { - "op": "dup", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3003": { - "op": "pushint 56", - "defined_out": [ - "56", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56" - ] - }, - "3005": { - "op": "intc_1 // 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56", - "1" - ] - }, - "3006": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0", - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0" - ] - }, - "3007": { - "op": "intc_0 // 0", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0" - ] - }, - "3008": { - "op": "uncover 3", - "stack_out": [ - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0", - "suspended#0" - ] - }, - "3010": { - "op": "setbit", - "defined_out": [ - "aggregate%updated_target%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%updated_target%0#0" - ] - }, - "3011": { - "op": "pushint 56" - }, - "3013": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "56", - "aggregate%updated_target%0#0" - ] - }, - "3014": { - "op": "box_replace", - "stack_out": [] - }, - "3015": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3017": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3018": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3019": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3020": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "3021": { - "op": "log", - "stack_out": [] - }, - "3022": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3023": { - "op": "return", - "stack_out": [] - }, - "3024": { - "subroutine": "modules.accounting.AccountingModule.account_open[routing]", - "params": {}, - "block": "account_open", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3027": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3028": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3029": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3030": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3031": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3032": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3035": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ] - }, - "3036": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0" - ] - }, - "3037": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0", - "32" - ] - }, - "3038": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "eq%1#0" - ] - }, - "3039": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3040": { - "op": "bytec 12 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023" - ] - }, - "3042": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "3044": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "3047": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3048": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0" - ] - }, - "3049": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0", - "\"status\"" - ] - }, - "3050": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3051": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0" - ] - }, - "3052": { - "op": "intc 5 // 200", - "defined_out": [ - "200", - "holding_address#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "200" - ] - }, - "3054": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ] - }, - "3055": { - "op": "!", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "3056": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "3057": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3060": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "3063": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52333023" - ] - }, - "3064": { - "op": "uncover 2", - "stack_out": [ - "payment_address#0", - "0x52333023", - "holding_address#0" - ] - }, - "3066": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "3067": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3068": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3069": { - "op": "bury 1", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3071": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "tmp%2#1" - ] - }, - "3072": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "3073": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "0" - ] - }, - "3074": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3075": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0" - ] - }, - "3077": { - "op": "dig 1", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "3079": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0" - ] - }, - "3080": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "3082": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%2#0" - ] - }, - "3083": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3084": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0" - ] - }, - "3085": { - "op": "bytec 30 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0", - "0x00" - ] - }, - "3087": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%4#0" - ] - }, - "3088": { - "op": "box_put", - "stack_out": [] - }, - "3089": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "3091": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0" - ] - }, - "3092": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "3093": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "3094": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "3095": { - "op": "log", - "stack_out": [] - }, - "3096": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3097": { - "op": "return", - "stack_out": [] - }, - "3098": { - "subroutine": "modules.accounting.AccountingModule.account_close[routing]", - "params": {}, - "block": "account_close", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3101": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3102": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3103": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3104": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3105": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3106": { - "op": "bytec 12 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52343023" - ] - }, - "3108": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "3110": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "tmp%1#2" - ] - }, - "3113": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0" - ] - }, - "3114": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3117": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "3118": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "3119": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3120": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3121": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3122": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3124": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3125": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3126": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3127": { - "op": "pop", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "3128": { - "op": "intc_2 // 32", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "3129": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ] - }, - "3130": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "closed_units#0", - "closed_units#0 (copy)" - ] - }, - "3131": { - "op": "uncover 2", - "defined_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "box_prefixed_key%0#1" - ] - }, - "3133": { - "op": "box_del", - "defined_out": [ - "closed_units#0", - "{box_del}" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "{box_del}" - ] - }, - "3134": { - "op": "pop", - "stack_out": [ - "closed_units#0", - "closed_units#0" - ] - }, - "3135": { - "op": "intc_0 // 0", - "stack_out": [ - "closed_units#0", - "closed_units#0", - "0" - ] - }, - "3136": { - "op": "bytec 4 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "0", - "\"circulating_units\"" - ] - }, - "3138": { - "op": "app_global_get_ex", - "defined_out": [ - "closed_units#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3139": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "closed_units#0", - "closed_units#0", - "maybe_value%0#0" - ] - }, - "3140": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "maybe_value%0#0", - "closed_units#0" - ] - }, - "3141": { - "op": "-", - "defined_out": [ - "closed_units#0", - "tmp%0#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%0#1" - ] - }, - "3142": { - "op": "bytec 4 // \"circulating_units\"", - "stack_out": [ - "closed_units#0", - "tmp%0#1", - "\"circulating_units\"" - ] - }, - "3144": { - "op": "dig 1", - "defined_out": [ - "\"circulating_units\"", - "closed_units#0", - "tmp%0#1", - "tmp%0#1 (copy)" - ], - "stack_out": [ - "closed_units#0", - "tmp%0#1", - "\"circulating_units\"", - "tmp%0#1 (copy)" - ] - }, - "3146": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0", - "tmp%0#1" - ] - }, - "3147": { - "op": "bnz account_close_after_if_else@3", - "stack_out": [ - "closed_units#0" - ] - }, - "3150": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "\"status\"" - ] - }, - "3151": { - "op": "intc 5 // 200", - "defined_out": [ - "\"status\"", - "200", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "\"status\"", - "200" - ] - }, - "3153": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0" - ] - }, - "3154": { - "block": "account_close_after_if_else@3", - "stack_in": [ - "closed_units#0" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1" - ] - }, - "3156": { - "op": "dig 1", - "defined_out": [ - "closed_units#0", - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1", - "closed_units#0" - ] - }, - "3158": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "closed_units#0", - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3159": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#1" - ] - }, - "3160": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "3161": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "aggregate%head%1#0" - ] - }, - "3162": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "3163": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "3164": { - "op": "concat", - "defined_out": [ - "closed_units#0", - "tmp%5#0" - ], - "stack_out": [ - "closed_units#0", - "tmp%5#0" - ] - }, - "3165": { - "op": "log", - "stack_out": [ - "closed_units#0" - ] - }, - "3166": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "1" - ] - }, - "3167": { - "op": "return", - "stack_out": [ - "closed_units#0" - ] - }, - "3168": { - "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", - "params": {}, - "block": "account_update_payment_address", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3171": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3172": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3173": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3174": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3175": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3176": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3179": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "3180": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "3181": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "32" - ] - }, - "3182": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "3183": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3184": { - "op": "txn Sender", - "defined_out": [ - "holding_address#0", - "tmp%0#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1" - ] - }, - "3186": { - "op": "dig 2", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1", - "holding_address#0 (copy)" - ] - }, - "3188": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%1#1" - ] - }, - "3189": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "3190": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3193": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "3196": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0x52333023" - ] - }, - "3197": { - "op": "uncover 2", - "stack_out": [ - "tmp%2#0", - "0x52333023", - "holding_address#0" - ] - }, - "3199": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "3200": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3201": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3202": { - "op": "bury 1", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3204": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "3205": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "0" - ] - }, - "3206": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#1", - "0", - "tmp%2#0" - ] - }, - "3208": { - "op": "box_replace", - "stack_out": [] - }, - "3209": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "3211": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3212": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3213": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3214": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "3215": { - "op": "log", - "stack_out": [] - }, - "3216": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3217": { - "op": "return", - "stack_out": [] - }, - "3218": { - "subroutine": "modules.accounting.AccountingModule.account_get_info[routing]", - "params": {}, - "block": "account_get_info", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "3221": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "3222": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "3223": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "3224": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "3225": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "3226": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "3227": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "3228": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3229": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3230": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3231": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3233": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "3234": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3235": { - "op": "pop", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "3236": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "0x151f7c75" - ] - }, - "3237": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ] - }, - "3238": { - "op": "concat", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "3239": { - "op": "log", - "stack_out": [] - }, - "3240": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3241": { - "op": "return", - "stack_out": [] - }, - "3242": { - "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", - "params": {}, - "block": "rbac_rotate_arranger", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0" - ] - }, - "3245": { - "op": "dup", - "defined_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ], - "stack_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ] - }, - "3246": { - "op": "len", - "defined_out": [ - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0" - ] - }, - "3247": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0", - "32" - ] - }, - "3248": { - "op": "==", - "defined_out": [ - "eq%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "eq%0#0" - ] - }, - "3249": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "new_arranger#0" - ] - }, - "3250": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3253": { - "op": "bytec 6 // 0x52323023", - "defined_out": [ - "0x52323023", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "0x52323023" - ] - }, - "3255": { - "op": "swap", - "stack_out": [ - "0x52323023", - "new_arranger#0" - ] - }, - "3256": { - "op": "app_global_put", - "stack_out": [] - }, - "3257": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3259": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3260": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3261": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3262": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3263": { - "op": "log", - "stack_out": [] - }, - "3264": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3265": { - "op": "return", - "stack_out": [] - }, - "3266": { - "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", - "params": {}, - "block": "rbac_set_op_daemon", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "3269": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "3270": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "3271": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "3272": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "3273": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "3274": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3277": { - "op": "bytec 21 // 0x52323523", - "defined_out": [ - "0x52323523", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52323523" - ] - }, - "3279": { - "op": "swap", - "stack_out": [ - "0x52323523", - "address#0" - ] - }, - "3280": { - "op": "app_global_put", - "stack_out": [] - }, - "3281": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3283": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3284": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3285": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3286": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3287": { - "op": "log", - "stack_out": [] - }, - "3288": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3289": { - "op": "return", - "stack_out": [] - }, - "3290": { - "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", - "params": {}, - "block": "rbac_assign_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3293": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3294": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3295": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3296": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3297": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3298": { - "op": "txna ApplicationArgs 2" - }, - "3301": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3302": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3304": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3305": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3306": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3307": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3308": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "3311": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ] - }, - "3312": { - "op": "intc_0 // 0", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)", - "0" - ] - }, - "3313": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0" - ] - }, - "3314": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "3316": { - "op": "+", - "defined_out": [ - "add%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0" - ] - }, - "3317": { - "op": "dig 1", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "tmp%3#0 (copy)" - ] - }, - "3319": { - "op": "len", - "defined_out": [ - "add%0#0", - "len%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "len%2#0" - ] - }, - "3320": { - "op": "==", - "defined_out": [ - "eq%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "eq%2#0" - ] - }, - "3321": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "3322": { - "op": "extract 2 0", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "config#0" - ] - }, - "3325": { - "op": "swap", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#0" - ] - }, - "3326": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3329": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3332": { - "op": "btoi", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3333": { - "op": "dupn 2", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3335": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3338": { - "op": "pushint 20", - "defined_out": [ - "20", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "20" - ] - }, - "3340": { - "op": "==", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%0#2" - ] - }, - "3341": { - "op": "bz rbac_assign_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3344": { - "op": "bytec 6 // 0x52323023", - "defined_out": [ - "0x52323023", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023" - ] - }, - "3346": { - "op": "dig 3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023", - "role_address#0" - ] - }, - "3348": { - "op": "app_global_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3349": { - "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%2#1" - ] - }, - "3351": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3352": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3353": { - "op": "swap", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3354": { - "op": "concat", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#0" - ] - }, - "3355": { - "op": "log", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3356": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "1" - ] - }, - "3357": { - "op": "return", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3358": { - "block": "rbac_assign_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3359": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "3361": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%1#1" - ] - }, - "3362": { - "op": "bz rbac_assign_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3365": { - "op": "bytec 12 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023" - ] - }, - "3367": { - "op": "dig 3", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "3369": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3370": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3371": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3372": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3374": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "tmp%2#2" - ] - }, - "3375": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3376": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "config#0" - ] - }, - "3378": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3379": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3382": { - "block": "rbac_assign_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3383": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "3385": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%3#1" - ] - }, - "3386": { - "op": "bz rbac_assign_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3389": { - "op": "bytec 20 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023" - ] - }, - "3391": { - "op": "dig 3", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "3393": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3394": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "3395": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "3396": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "3398": { - "op": "!", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1", - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "tmp%4#0" - ] - }, - "3399": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3400": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%2#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "config#0" - ] - }, - "3402": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3403": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3406": { - "block": "rbac_assign_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3407": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "3409": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%5#0" - ] - }, - "3410": { - "op": "bz rbac_assign_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3413": { - "op": "bytec 19 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023" - ] - }, - "3415": { - "op": "dig 3", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "3417": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3418": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "3419": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "3420": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "3422": { - "op": "!", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1", - "tmp%6#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "tmp%6#1" - ] - }, - "3423": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3424": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%4#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "config#0" - ] - }, - "3426": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3427": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3430": { - "block": "rbac_assign_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3431": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "3433": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%7#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#1" - ] - }, - "3434": { - "op": "bz rbac_assign_role_after_if_else@11", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3437": { - "op": "bytec 11 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023" - ] - }, - "3439": { - "op": "dig 3", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "3441": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3442": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "3443": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "3444": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "3446": { - "op": "!", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1", - "tmp%8#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "tmp%8#0" - ] - }, - "3447": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3448": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%6#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "config#0" - ] - }, - "3450": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3451": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3454": { - "block": "rbac_assign_role_after_if_else@11", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3455": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "3457": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%9#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%9#0" - ] - }, - "3458": { - "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3461": { - "op": "bytec 18 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023" - ] - }, - "3463": { - "op": "dig 3", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "3465": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3466": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "3467": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "3468": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "3470": { - "op": "!", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1", - "tmp%10#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "tmp%10#0" - ] - }, - "3471": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3472": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%8#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "config#0" - ] - }, - "3474": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3475": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3478": { - "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", - "params": {}, - "block": "rbac_revoke_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3481": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3482": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3483": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3484": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3485": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3486": { - "op": "txna ApplicationArgs 2" - }, - "3489": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3490": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3492": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3493": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3494": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3495": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3496": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3499": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3502": { - "op": "btoi", - "defined_out": [ - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3503": { - "op": "dupn 2", - "defined_out": [ - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3505": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3508": { - "op": "dup", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3509": { - "op": "pushint 20", - "defined_out": [ - "20", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)", - "20" - ] - }, - "3511": { - "op": "!=", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "tmp%0#2" - ] - }, - "3512": { - "error": "Invalid role identifier", - "op": "assert // Invalid role identifier", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3513": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "3515": { - "op": "==", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ] - }, - "3516": { - "op": "bz rbac_revoke_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3519": { - "op": "bytec 12 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023" - ] - }, - "3521": { - "op": "dig 2", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "3523": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3524": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3525": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3526": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3528": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3529": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3530": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3531": { - "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#1" - ] - }, - "3533": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3534": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3535": { - "op": "swap", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3536": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#0" - ] - }, - "3537": { - "op": "log", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3538": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "1" - ] - }, - "3539": { - "op": "return", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3540": { - "block": "rbac_revoke_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3541": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "3543": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#2" - ] - }, - "3544": { - "op": "bz rbac_revoke_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3547": { - "op": "bytec 20 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023" - ] - }, - "3549": { - "op": "dig 2", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "3551": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3552": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "3553": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "3554": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "3556": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3557": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3558": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3559": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3562": { - "block": "rbac_revoke_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3563": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "3565": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%3#0" - ] - }, - "3566": { - "op": "bz rbac_revoke_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3569": { - "op": "bytec 19 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023" - ] - }, - "3571": { - "op": "dig 2", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "3573": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3574": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "3575": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "3576": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "3578": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3579": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3580": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3581": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3584": { - "block": "rbac_revoke_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3585": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "3587": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%4#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%4#1" - ] - }, - "3588": { - "op": "bz rbac_revoke_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3591": { - "op": "bytec 11 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023" - ] - }, - "3593": { - "op": "dig 2", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "3595": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3596": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "3597": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "3598": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "3600": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3601": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3602": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3603": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3606": { - "block": "rbac_revoke_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3607": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "3609": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#1" - ] - }, - "3610": { - "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3613": { - "op": "bytec 18 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023" - ] - }, - "3615": { - "op": "dig 2", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "3617": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3618": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "3619": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "3620": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "3622": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3623": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3624": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3625": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3628": { - "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", - "params": {}, - "block": "rbac_gov_asset_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3631": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "3632": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "3633": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "3634": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "3635": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "3636": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "3637": { - "op": "getbit", - "defined_out": [ - "suspended#0" - ], - "stack_out": [ - "suspended#0" - ] - }, - "3638": { - "op": "bytec 11 // 0x52373023", - "defined_out": [ - "0x52373023", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "0x52373023" - ] - }, - "3640": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "3642": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "suspended#0", - "tmp%1#0" - ] - }, - "3645": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "suspended#0" - ] - }, - "3646": { - "op": "bytec 22 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "\"asset_suspended\"" - ] - }, - "3648": { - "op": "swap", - "stack_out": [ - "\"asset_suspended\"", - "suspended#0" - ] - }, - "3649": { - "op": "app_global_put", - "stack_out": [] - }, - "3650": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3652": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3653": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3654": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3655": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3656": { - "op": "log", - "stack_out": [] - }, - "3657": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3658": { - "op": "return", - "stack_out": [] - }, - "3659": { - "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", - "params": {}, - "block": "rbac_get_arranger", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3660": { - "op": "bytec 6 // 0x52323023", - "defined_out": [ - "0", - "0x52323023" - ], - "stack_out": [ - "0", - "0x52323023" - ] - }, - "3662": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3663": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3664": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "3665": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "3666": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "3667": { - "op": "log", - "stack_out": [] - }, - "3668": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3669": { - "op": "return", - "stack_out": [] - }, - "3670": { - "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", - "params": {}, - "block": "rbac_get_address_roles", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "3673": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "3674": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "3675": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "3676": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "3677": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "3678": { - "op": "bytec 12 // 0x52343023", - "defined_out": [ - "0x52343023", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52343023" - ] - }, - "3680": { - "op": "dig 1", - "stack_out": [ - "address#0", - "0x52343023", - "address#0 (copy)" - ] - }, - "3682": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1" - ] - }, - "3685": { - "op": "bytec 20 // 0x52353023", - "defined_out": [ - "0x52353023", - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023" - ] - }, - "3687": { - "op": "dig 2", - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023", - "address#0 (copy)" - ] - }, - "3689": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ] - }, - "3692": { - "op": "bytec 19 // 0x52363023", - "defined_out": [ - "0x52363023", - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023" - ] - }, - "3694": { - "op": "dig 3", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023", - "address#0 (copy)" - ] - }, - "3696": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ] - }, - "3699": { - "op": "bytec 11 // 0x52373023", - "defined_out": [ - "0x52373023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023" - ] - }, - "3701": { - "op": "dig 4", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023", - "address#0 (copy)" - ] - }, - "3703": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ] - }, - "3706": { - "op": "bytec 18 // 0x52383023", - "defined_out": [ - "0x52383023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023" - ] - }, - "3708": { - "op": "uncover 5", - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023", - "address#0" - ] - }, - "3710": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ] - }, - "3713": { - "op": "bytec 30 // 0x00", - "defined_out": [ - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00" - ] - }, - "3715": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0" - ] - }, - "3716": { - "op": "uncover 6", - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0", - "tmp%0#1" - ] - }, - "3718": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0" - ] - }, - "3719": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1" - ] - }, - "3720": { - "op": "uncover 5", - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1", - "tmp%1#1" - ] - }, - "3722": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0" - ] - }, - "3723": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2" - ] - }, - "3725": { - "op": "uncover 4", - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2", - "tmp%2#1" - ] - }, - "3727": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0" - ] - }, - "3728": { - "op": "pushint 3", - "defined_out": [ - "3", - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0", - "3" - ] - }, - "3730": { - "op": "uncover 3", - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%1#0", - "3", - "tmp%3#1" - ] - }, - "3732": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0" - ] - }, - "3733": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0", - "4" - ] - }, - "3735": { - "op": "uncover 2", - "stack_out": [ - "aggregate%set_bit%2#0", - "4", - "tmp%4#1" - ] - }, - "3737": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0" - ] - }, - "3738": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0", - "0x151f7c75" - ] - }, - "3739": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ] - }, - "3740": { - "op": "concat", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "3741": { - "op": "log", - "stack_out": [] - }, - "3742": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3743": { - "op": "return", - "stack_out": [] - }, - "3744": { - "subroutine": "modules.rbac.RbacModule.rbac_get_role_config[routing]", - "params": {}, - "block": "rbac_get_role_config", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3747": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3748": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3749": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3750": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3751": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3752": { - "op": "txna ApplicationArgs 2" - }, - "3755": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3756": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3758": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3759": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3760": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3761": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3762": { - "op": "btoi", - "defined_out": [ - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "3763": { - "op": "dup", - "defined_out": [ - "role#0", - "role#0 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "role#0 (copy)" - ] - }, - "3764": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "3767": { - "op": "pushints 20 40 50 60 70 80", - "defined_out": [ - "20", - "40", - "50", - "60", - "70", - "80", - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "20", - "40", - "50", - "60", - "70", - "80" - ] - }, - "3775": { - "op": "uncover 6", - "stack_out": [ - "role_address#0", - "20", - "40", - "50", - "60", - "70", - "80", - "role#0" - ] - }, - "3777": { - "op": "match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7", - "stack_out": [ - "role_address#0" - ] - }, - "3791": { - "error": "Invalid role identifier", - "op": "err // Invalid role identifier" - }, - "3792": { - "block": "rbac_get_role_config_switch_case_5@7", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 18 // 0x52383023", - "defined_out": [ - "0x52383023" - ], - "stack_out": [ - "role_address#0", - "0x52383023" - ] - }, - "3794": { - "op": "dig 1", - "defined_out": [ - "0x52383023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52383023", - "role_address#0" - ] - }, - "3796": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3797": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3798": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3799": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3801": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3802": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "3803": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3804": { - "block": "rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9", - "stack_in": [ - "role_address#0", - "tmp%3#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0", - "0x151f7c75" - ] - }, - "3805": { - "op": "swap", - "defined_out": [ - "0x151f7c75", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "0x151f7c75", - "tmp%3#0" - ] - }, - "3806": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "tmp%4#0" - ] - }, - "3807": { - "op": "log", - "stack_out": [ - "role_address#0" - ] - }, - "3808": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "1" - ] - }, - "3809": { - "op": "return", - "stack_out": [ - "role_address#0" - ] - }, - "3810": { - "block": "rbac_get_role_config_switch_case_4@6", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 11 // 0x52373023", - "defined_out": [ - "0x52373023" - ], - "stack_out": [ - "role_address#0", - "0x52373023" - ] - }, - "3812": { - "op": "dig 1", - "defined_out": [ - "0x52373023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52373023", - "role_address#0" - ] - }, - "3814": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3815": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3816": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3817": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3819": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3820": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "3821": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3822": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3825": { - "block": "rbac_get_role_config_switch_case_3@5", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 19 // 0x52363023", - "defined_out": [ - "0x52363023" - ], - "stack_out": [ - "role_address#0", - "0x52363023" - ] - }, - "3827": { - "op": "dig 1", - "defined_out": [ - "0x52363023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52363023", - "role_address#0" - ] - }, - "3829": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3830": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3831": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3832": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3834": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3835": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "3836": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3837": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3840": { - "block": "rbac_get_role_config_switch_case_2@4", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 20 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "role_address#0", - "0x52353023" - ] - }, - "3842": { - "op": "dig 1", - "defined_out": [ - "0x52353023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52353023", - "role_address#0" - ] - }, - "3844": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3845": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3846": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3847": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3849": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3850": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "3851": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3852": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3855": { - "block": "rbac_get_role_config_switch_case_1@3", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 12 // 0x52343023", - "defined_out": [ - "0x52343023" - ], - "stack_out": [ - "role_address#0", - "0x52343023" - ] - }, - "3857": { - "op": "dig 1", - "defined_out": [ - "0x52343023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52343023", - "role_address#0" - ] - }, - "3859": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3860": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3861": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3862": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3864": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3865": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3866": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3867": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3870": { - "block": "rbac_get_role_config_switch_case_0@2", - "stack_in": [ - "role_address#0" - ], - "op": "pushbytes 0x00000000000000000000000000000000", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3888": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3891": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons", - "params": {}, - "block": "count_due_coupons", - "stack_in": [], - "op": "proto 0 1" - }, - "3894": { - "op": "intc_0 // 0" - }, - "3895": { - "op": "global LatestTimestamp" - }, - "3897": { - "op": "dup" - }, - "3898": { - "op": "intc_0 // 0" - }, - "3899": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "current_ts#0", - "due_coupons#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "current_ts#0", - "0", - "\"issuance_date\"" - ] - }, - "3900": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "current_ts#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3901": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "current_ts#0", - "maybe_value%0#0" - ] - }, - "3902": { - "op": ">", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "tmp%1#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "tmp%1#0" - ] - }, - "3903": { - "op": "bz count_due_coupons_after_if_else@2", - "stack_out": [ - "due_coupons#0", - "current_ts#0" - ] - }, - "3906": { - "op": "intc_0 // 0", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "0" - ] - }, - "3907": { - "op": "bytec_3 // \"issuance_date\"", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "0", - "\"issuance_date\"" - ] - }, - "3908": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "3909": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "maybe_value%1#0" - ] - }, - "3910": { - "op": "frame_dig 1", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "maybe_value%1#0", - "current_ts#0" - ] - }, - "3912": { - "op": "swap", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "current_ts#0", - "maybe_value%1#0" - ] - }, - "3913": { - "op": "-", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "tmp%2#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "tmp%2#0" - ] - }, - "3914": { - "op": "intc_0 // 0", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "tmp%2#0", - "0" - ] - }, - "3915": { - "op": "bytec 17 // \"coupon_period\"", - "defined_out": [ - "\"coupon_period\"", - "0", - "current_ts#0", - "due_coupons#0", - "tmp%2#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "tmp%2#0", - "0", - "\"coupon_period\"" - ] - }, - "3917": { - "op": "app_global_get_ex", - "defined_out": [ - "current_ts#0", - "due_coupons#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "tmp%2#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "tmp%2#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "3918": { - "error": "check self.coupon_period exists", - "op": "assert // check self.coupon_period exists", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "tmp%2#0", - "maybe_value%2#0" - ] - }, - "3919": { - "op": "/", - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "3920": { - "op": "frame_bury 0", - "stack_out": [ - "due_coupons#0", - "current_ts#0" - ] - }, - "3922": { - "block": "count_due_coupons_after_if_else@2", - "stack_in": [ - "due_coupons#0", - "current_ts#0" - ], - "retsub": true, - "op": "retsub", - "defined_out": [ - "due_coupons#0" - ], - "stack_out": [ - "due_coupons#0", - "current_ts#0", - "due_coupons#0" - ] - }, - "3923": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.coupon_due_date", - "params": { - "coupon#0": "uint64" - }, - "block": "coupon_due_date", - "stack_in": [], - "op": "proto 1 1" - }, - "3926": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3927": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "0", - "\"issuance_date\"" - ] - }, - "3928": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3929": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3930": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "3931": { - "op": "bytec 17 // \"coupon_period\"", - "defined_out": [ - "\"coupon_period\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"coupon_period\"" - ] - }, - "3933": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "3934": { - "error": "check self.coupon_period exists", - "op": "assert // check self.coupon_period exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "3935": { - "op": "frame_dig -1", - "defined_out": [ - "coupon#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "coupon#0 (copy)" - ] - }, - "3937": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "tmp%0#0" - ] - }, - "3938": { - "op": "+", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "3939": { - "retsub": true, - "op": "retsub" - }, - "3940": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.day_count_factor", - "params": { - "due_coupons#0": "uint64" - }, - "block": "day_count_factor", - "stack_in": [], - "op": "proto 1 1" - }, - "3943": { - "op": "pushbytes \"\"", - "stack_out": [ - "coupon_accrued_period#0" - ] - }, - "3945": { - "op": "dup", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "3946": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "3948": { - "op": "bnz day_count_factor_else_body@2", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "3951": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "0" - ] - }, - "3952": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "0", - "\"issuance_date\"" - ] - }, - "3953": { - "op": "app_global_get_ex", - "defined_out": [ - "accruing_start_time#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "maybe_exists%0#0" - ] - }, - "3954": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ] - }, - "3955": { - "block": "day_count_factor_after_if_else@3", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0", - "tmp%2#0" - ] - }, - "3957": { - "op": "swap", - "defined_out": [ - "accruing_start_time#0", - "tmp%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "tmp%2#0", - "accruing_start_time#0" - ] - }, - "3958": { - "op": "-", - "defined_out": [ - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_accrued_period#0" - ] - }, - "3959": { - "op": "frame_bury 0", - "defined_out": [ - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "3961": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "0" - ] - }, - "3962": { - "op": "bytec 17 // \"coupon_period\"", - "defined_out": [ - "\"coupon_period\"", - "0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "0", - "\"coupon_period\"" - ] - }, - "3964": { - "op": "app_global_get_ex", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "maybe_exists%1#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "maybe_exists%1#0" - ] - }, - "3965": { - "error": "check self.coupon_period exists", - "op": "assert // check self.coupon_period exists", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "3966": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "0" - ] - }, - "3967": { - "op": "bytec 15 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "0", - "\"day_count_convention\"" - ] - }, - "3969": { - "op": "app_global_get_ex", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "maybe_exists%2#0", - "maybe_value%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "3970": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "maybe_value%2#0" - ] - }, - "3971": { - "op": "bnz day_count_factor_after_if_else@5", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "3974": { - "op": "frame_dig 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0" - ] - }, - "3976": { - "op": "intc 6 // 86400", - "defined_out": [ - "86400", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0", - "86400" - ] - }, - "3978": { - "op": "/", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0" - ] - }, - "3979": { - "op": "frame_bury 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "3981": { - "op": "intc 6 // 86400", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "86400" - ] - }, - "3983": { - "op": "/", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ] - }, - "3984": { - "block": "day_count_factor_after_if_else@5", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "coupon_accrued_period#0" - ] - }, - "3986": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_period#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3987": { - "op": "swap", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "aggregate%val_as_bytes%0#0", - "coupon_period#0" - ] - }, - "3988": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "3989": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "coupon_accrued_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "aggregate%head%1#0" - ] - }, - "3990": { - "op": "frame_bury 0" - }, - "3992": { - "retsub": true, - "op": "retsub" - }, - "3993": { - "block": "day_count_factor_else_body@2", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "coupon_due_date#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_due_date#0" - ] - }, - "3994": { - "op": "frame_bury 1", - "defined_out": [ - "coupon_due_date#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "3996": { - "op": "frame_dig -1", - "defined_out": [ - "coupon_due_date#0", - "due_coupons#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "3998": { - "op": "bz day_count_factor_after_if_else@8", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4001": { - "op": "frame_dig -1", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "due_coupons#0 (copy)" - ] - }, - "4003": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.coupon_due_date", - "op": "callsub coupon_due_date", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "coupon_due_date#0" - ] - }, - "4006": { - "op": "frame_bury 1", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ] - }, - "4008": { - "block": "day_count_factor_after_if_else@8", - "stack_in": [ - "coupon_accrued_period#0", - "coupon_due_date#0" - ], - "op": "frame_dig 1", - "defined_out": [ - "accruing_start_time#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_due_date#0", - "accruing_start_time#0" - ] - }, - "4010": { - "op": "b day_count_factor_after_if_else@3" - }, - "4013": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.is_accruing_interest", - "params": { - "_due_coupons#0": "uint64" - }, - "block": "is_accruing_interest", - "stack_in": [], - "op": "proto 1 1" - }, - "4016": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4017": { - "op": "bytec_3 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "0", - "\"issuance_date\"" - ] - }, - "4018": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4019": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4020": { - "op": "bz is_accruing_interest_bool_false@3", - "stack_out": [] - }, - "4023": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4025": { - "op": "intc_0 // 0", - "stack_out": [ - "tmp%1#0", - "0" - ] - }, - "4026": { - "op": "bytec_3 // \"issuance_date\"", - "stack_out": [ - "tmp%1#0", - "0", - "\"issuance_date\"" - ] - }, - "4027": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4028": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "tmp%1#0", - "maybe_value%1#0" - ] - }, - "4029": { - "op": ">", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "4030": { - "op": "bz is_accruing_interest_bool_false@3", - "stack_out": [] - }, - "4033": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "and_result%0#0" - ] - }, - "4034": { - "retsub": true, - "op": "retsub" - }, - "4035": { - "block": "is_accruing_interest_bool_false@3", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "and_result%0#0" - ] - }, - "4036": { - "retsub": true, - "op": "retsub" - }, - "4037": { - "subroutine": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.accrued_interest_amount", - "params": { - "holding_address#0": "bytes", - "units#0": "uint64", - "due_coupons#0": "uint64" - }, - "block": "accrued_interest_amount", - "stack_in": [], - "op": "proto 3 1" - }, - "4040": { - "op": "frame_dig -3", - "defined_out": [ - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0 (copy)" - ] - }, - "4042": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0 (copy)", - "due_coupons#0 (copy)" - ] - }, - "4044": { - "callsub": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "op": "callsub assert_no_pending_coupon_payment", - "stack_out": [] - }, - "4047": { - "op": "frame_dig -1", - "stack_out": [ - "due_coupons#0 (copy)" - ] - }, - "4049": { - "callsub": "modules.core_financial.coupon.PerpetualCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "day_count_factor#0" - ], - "stack_out": [ - "day_count_factor#0" - ] - }, - "4052": { - "op": "dup", - "defined_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)" - ], - "stack_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "4053": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ], - "stack_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "4054": { - "op": "extract_uint64", - "defined_out": [ - "coupon_accrued_period#0", - "day_count_factor#0" - ], - "stack_out": [ - "day_count_factor#0", - "coupon_accrued_period#0" - ] - }, - "4055": { - "op": "swap", - "stack_out": [ - "coupon_accrued_period#0", - "day_count_factor#0" - ] - }, - "4056": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "coupon_accrued_period#0", - "day_count_factor#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "day_count_factor#0", - "8" - ] - }, - "4057": { - "op": "extract_uint64", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0" - ] - }, - "4058": { - "op": "frame_dig -3", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "holding_address#0 (copy)" - ] - }, - "4060": { - "op": "frame_dig -2", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "holding_address#0 (copy)", - "units#0 (copy)" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "holding_address#0 (copy)", - "units#0 (copy)" - ] - }, - "4062": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0" - ] - }, - "4065": { - "op": "intc_0 // 0", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0", - "0" - ] - }, - "4066": { - "op": "bytec 5 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0", - "0", - "\"interest_rate\"" - ] - }, - "4068": { - "op": "app_global_get_ex", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%1#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4069": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%1#0", - "maybe_value%0#0" - ] - }, - "4070": { - "op": "*", - "defined_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%2#0" - ], - "stack_out": [ - "coupon_accrued_period#0", - "coupon_period#0", - "tmp%2#0" - ] - }, - "4071": { - "op": "uncover 2", - "stack_out": [ - "coupon_period#0", - "tmp%2#0", - "coupon_accrued_period#0" - ] - }, - "4073": { - "op": "*", - "defined_out": [ - "coupon_period#0", - "tmp%3#0" - ], - "stack_out": [ - "coupon_period#0", - "tmp%3#0" - ] - }, - "4074": { - "op": "intc 4 // 10000", - "defined_out": [ - "10000", - "coupon_period#0", - "tmp%3#0" - ], - "stack_out": [ - "coupon_period#0", - "tmp%3#0", - "10000" - ] - }, - "4076": { - "op": "uncover 2", - "stack_out": [ - "tmp%3#0", - "10000", - "coupon_period#0" - ] - }, - "4078": { - "op": "*", - "defined_out": [ - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "tmp%3#0", - "tmp%4#0" - ] - }, - "4079": { - "op": "/", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "4080": { - "retsub": true, - "op": "retsub" - }, - "4081": { - "subroutine": "modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid", - "params": { - "due_coupons#0": "uint64" - }, - "block": "all_due_coupons_paid", - "stack_in": [], - "op": "proto 1 1" - }, - "4084": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4085": { - "op": "bytec 28 // \"paid_coupon_units\"", - "defined_out": [ - "\"paid_coupon_units\"", - "0" - ], - "stack_out": [ - "0", - "\"paid_coupon_units\"" - ] - }, - "4087": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4088": { - "error": "check self.paid_coupon_units exists", - "op": "assert // check self.paid_coupon_units exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4089": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "4090": { - "op": "bytec 4 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"circulating_units\"" - ] - }, - "4092": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "4093": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "4094": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "due_coupons#0 (copy)" - ] - }, - "4096": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "tmp%0#0" - ] - }, - "4097": { - "op": ">=", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4098": { - "retsub": true, - "op": "retsub" - }, - "4099": { - "subroutine": "modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment", - "params": { - "holding_address#0": "bytes", - "due_coupons#0": "uint64" - }, - "block": "assert_no_pending_coupon_payment", - "stack_in": [], - "op": "proto 2 0" - }, - "4102": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4103": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4105": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4106": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4107": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4108": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "48" - ] - }, - "4110": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4111": { - "op": "frame_dig -1", - "defined_out": [ - "due_coupons#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "values%0#0", - "due_coupons#0 (copy)" - ] - }, - "4113": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4114": { - "error": "Pending due coupon payment", - "op": "assert // Pending due coupon payment", - "stack_out": [] - }, - "4115": { - "retsub": true, - "op": "retsub" - }, - "4116": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "params": { - "time_events#0": "bytes" - }, - "block": "assert_time_events_sorted", - "stack_in": [], - "op": "proto 1 1" - }, - "4119": { - "op": "pushbytes \"\"", - "stack_out": [ - "time_f#0" - ] - }, - "4121": { - "op": "dupn 2", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0" - ] - }, - "4123": { - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "time_events#0 (copy)" - ] - }, - "4125": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0" - ] - }, - "4128": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "4130": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "2" - ] - }, - "4132": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "values%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "values%0#0" - ] - }, - "4133": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%0#0", - "values%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "values%0#0", - "tmp%0#0" - ] - }, - "4135": { - "op": ">", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ] - }, - "4136": { - "error": "Time events must be set in the future", - "op": "assert // Time events must be set in the future", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0" - ] - }, - "4137": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "4139": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "0" - ] - }, - "4140": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%0#0" - ] - }, - "4141": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%0#0", - "1" - ] - }, - "4142": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0" - ] - }, - "4143": { - "op": "intc_0 // 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4144": { - "block": "assert_time_events_sorted_for_header@1", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "4146": { - "op": "frame_dig 4", - "defined_out": [ - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "tmp%3#0" - ] - }, - "4148": { - "op": "<", - "defined_out": [ - "continue_looping%0#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "continue_looping%0#0" - ] - }, - "4149": { - "op": "bz assert_time_events_sorted_after_for@6", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4152": { - "block": "assert_time_events_sorted_while_top@8", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "pushint 75", - "defined_out": [ - "75" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "75" - ] - }, - "4154": { - "op": "global OpcodeBudget", - "defined_out": [ - "75", - "tmp%1#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "75", - "tmp%1#1" - ] - }, - "4156": { - "op": ">", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%2#1" - ] - }, - "4157": { - "op": "bz assert_time_events_sorted_after_while@13", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4160": { - "op": "itxn_begin" - }, - "4161": { - "op": "pushint 6 // appl", - "defined_out": [ - "appl" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "appl" - ] - }, - "4163": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4165": { - "op": "pushint 5 // DeleteApplication", - "defined_out": [ - "DeleteApplication" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "DeleteApplication" - ] - }, - "4167": { - "op": "itxn_field OnCompletion", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4169": { - "op": "bytec 34 // 0x068101", - "defined_out": [ - "0x068101" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0x068101" - ] - }, - "4171": { - "op": "itxn_field ApprovalProgram", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4173": { - "op": "bytec 34 // 0x068101", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0x068101" - ] - }, - "4175": { - "op": "itxn_field ClearStateProgram", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4177": { - "op": "global MinTxnFee", - "defined_out": [ - "tmp%3#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%3#1" - ] - }, - "4179": { - "op": "itxn_field Fee", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4181": { - "op": "itxn_submit" - }, - "4182": { - "op": "b assert_time_events_sorted_while_top@8" - }, - "4185": { - "block": "assert_time_events_sorted_after_while@13", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "4187": { - "op": "dup", - "defined_out": [ - "idx#0", - "idx#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "idx#0 (copy)" - ] - }, - "4188": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "idx#0", - "idx#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "idx#0 (copy)", - "8" - ] - }, - "4189": { - "op": "*", - "defined_out": [ - "aggregate%bytes_offset%1#0", - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0" - ] - }, - "4190": { - "op": "frame_dig 3", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0", - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0" - ] - }, - "4192": { - "op": "dup", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%bytes_offset%1#0", - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%array_trimmed%0#0 (copy)" - ] - }, - "4193": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0 (copy)" - ] - }, - "4195": { - "op": "swap", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%bytes_offset%1#0" - ] - }, - "4196": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ] - }, - "4197": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "time_i#0 (copy)" - ] - }, - "4198": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ] - }, - "4200": { - "op": "frame_bury 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0" - ] - }, - "4202": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "1" - ] - }, - "4203": { - "op": "+", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0" - ] - }, - "4204": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0", - "tmp%4#0" - ] - }, - "4205": { - "op": "frame_bury 2", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0" - ] - }, - "4207": { - "op": "intc_3 // 8", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0", - "8" - ] - }, - "4208": { - "op": "*", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%2#0", - "idx#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%2#0" - ] - }, - "4209": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0" - ] - }, - "4210": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0", - "time_f#0" - ] - }, - "4211": { - "op": "frame_bury 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0" - ] - }, - "4213": { - "op": "<", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%5#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%5#0" - ] - }, - "4214": { - "error": "Time events must be sorted in strictly ascending order", - "op": "assert // Time events must be sorted in strictly ascending order", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4215": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0" - ] - }, - "4216": { - "op": "bytec 15 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0", - "\"day_count_convention\"" - ] - }, - "4218": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4219": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0" - ] - }, - "4220": { - "op": "pushint 255", - "defined_out": [ - "255", - "aggregate%array_trimmed%0#0", - "idx#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0", - "255" - ] - }, - "4223": { - "op": "!=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%6#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%6#0" - ] - }, - "4224": { - "op": "bz assert_time_events_sorted_after_if_else@4", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4227": { - "op": "frame_dig 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_f#0" - ] - }, - "4229": { - "op": "frame_dig 1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_f#0", - "time_i#0" - ] - }, - "4231": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%7#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%7#0" - ] - }, - "4232": { - "op": "intc 6 // 86400", - "defined_out": [ - "86400", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%7#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%7#0", - "86400" - ] - }, - "4234": { - "op": "%", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%8#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%8#0" - ] - }, - "4235": { - "op": "!", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%9#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%9#0" - ] - }, - "4236": { - "error": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "op": "assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4237": { - "block": "assert_time_events_sorted_after_if_else@4", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 2", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "4239": { - "op": "frame_bury 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "4241": { - "op": "b assert_time_events_sorted_for_header@1" - }, - "4244": { - "block": "assert_time_events_sorted_after_for@6", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_events#0 (copy)" - ] - }, - "4246": { - "op": "frame_bury 0" - }, - "4248": { - "retsub": true, - "op": "retsub" - }, - "4249": { - "subroutine": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "params": { - "holding_address#0": "bytes" - }, - "block": "assert_is_not_account_suspended", - "stack_in": [], - "op": "proto 1 0" - }, - "4252": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4253": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4255": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4256": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4257": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4258": { - "op": "pushint 448", - "defined_out": [ - "448", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "448" - ] - }, - "4261": { - "op": "getbit", - "defined_out": [ - "aggregate%get_bit%0#0" - ], - "stack_out": [ - "aggregate%get_bit%0#0" - ] - }, - "4262": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4263": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "4264": { - "retsub": true, - "op": "retsub" - }, - "4265": { - "subroutine": "modules.accounting.AccountingModule.account_units_value", - "params": { - "holding_address#0": "bytes", - "units#0": "uint64" - }, - "block": "account_units_value", - "stack_in": [], - "op": "proto 2 1" - }, - "4268": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4269": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4271": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4272": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4273": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4274": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "40" - ] - }, - "4276": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4277": { - "op": "frame_dig -1", - "defined_out": [ - "units#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "values%0#0", - "units#0 (copy)" - ] - }, - "4279": { - "op": "*", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4280": { - "retsub": true, - "op": "retsub" - }, - "4281": { - "subroutine": "modules.accounting.AccountingModule.account_total_units_value", - "params": { - "holding_address#0": "bytes" - }, - "block": "account_total_units_value", - "stack_in": [], - "op": "proto 1 1" - }, - "4284": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "4285": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "4287": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "4288": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4289": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "4290": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "32" - ] - }, - "4291": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "4292": { - "op": "frame_dig -1", - "stack_out": [ - "values%0#0", - "holding_address#0 (copy)" - ] - }, - "4294": { - "op": "swap", - "stack_out": [ - "holding_address#0 (copy)", - "values%0#0" - ] - }, - "4295": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4298": { - "retsub": true, - "op": "retsub" - }, - "4299": { - "subroutine": "modules.rbac.RbacModule._role_is_active", - "params": { - "role_map#0": "bytes", - "role_address#0": "bytes" - }, - "block": "_role_is_active", - "stack_in": [], - "op": "proto 2 1" - }, - "4302": { - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "4304": { - "op": "frame_dig -2", - "defined_out": [ - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)" - ] - }, - "4306": { - "op": "frame_dig -1", - "defined_out": [ - "role_address#0 (copy)", - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)", - "role_address#0 (copy)" - ] - }, - "4308": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4309": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "4310": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "4311": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "4313": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4316": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "4318": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "4319": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "4320": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "0" - ] - }, - "4321": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ] - }, - "4322": { - "op": "global LatestTimestamp" - }, - "4324": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "4325": { - "op": "frame_bury 0", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0" - ] - }, - "4327": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ] - }, - "4328": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4331": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "4333": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "4334": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0" - ] - }, - "4335": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%box_get%2#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "8" - ] - }, - "4336": { - "op": "extract_uint64", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ] - }, - "4337": { - "op": "frame_dig 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0", - "awst_tmp%0#0" - ] - }, - "4339": { - "op": ">=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ] - }, - "4340": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "4343": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "4344": { - "block": "_role_is_active_bool_merge@5", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ], - "op": "frame_bury 0", - "defined_out": [ - "and_result%0#0" - ] - }, - "4346": { - "retsub": true, - "op": "retsub" - }, - "4347": { - "block": "_role_is_active_bool_false@4", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "4348": { - "op": "b _role_is_active_bool_merge@5" - }, - "4351": { - "subroutine": "modules.rbac.RbacModule.assert_caller_is_arranger", - "params": {}, - "block": "assert_caller_is_arranger", - "stack_in": [], - "op": "txn Sender", - "defined_out": [ - "role_address#0" - ], - "stack_out": [ - "role_address#0" - ] - }, - "4353": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0" - ] - }, - "4354": { - "op": "bytec 6 // 0x52323023", - "defined_out": [ - "0", - "0x52323023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0", - "0x52323023" - ] - }, - "4356": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4357": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "role_address#0", - "maybe_value%0#0" - ] - }, - "4358": { - "op": "==", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "4359": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [] - }, - "4360": { - "retsub": true, - "op": "retsub" - }, - "4361": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "params": {}, - "block": "assert_is_not_asset_defaulted", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4362": { - "op": "bytec 23 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_defaulted\"" - ] - }, - "4364": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4365": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4366": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4367": { - "error": "Defaulted", - "op": "assert // Defaulted", - "stack_out": [] - }, - "4368": { - "retsub": true, - "op": "retsub" - }, - "4369": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "params": {}, - "block": "assert_is_not_asset_suspended", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "4370": { - "op": "bytec 22 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_suspended\"" - ] - }, - "4372": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "4373": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "4374": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4375": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "4376": { - "retsub": true, - "op": "retsub" - }, - "4377": { - "subroutine": "modules.rbac.RbacModule._assert_valid_role", - "params": { - "role_id#0": "uint64" - }, - "block": "_assert_valid_role", - "stack_in": [], - "op": "proto 1 0" - }, - "4380": { - "op": "frame_dig -1", - "defined_out": [ - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4382": { - "op": "pushint 20", - "defined_out": [ - "20", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "20" - ] - }, - "4384": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "4385": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4388": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4390": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "40" - ] - }, - "4392": { - "op": "==", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "4393": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4396": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4398": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "50" - ] - }, - "4400": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "4401": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4404": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4406": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "60" - ] - }, - "4408": { - "op": "==", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "4409": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4412": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4414": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "70" - ] - }, - "4416": { - "op": "==", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "4417": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4420": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4422": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "80" - ] - }, - "4424": { - "op": "==", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "4425": { - "op": "bz _assert_valid_role_bool_false@7", - "stack_out": [] - }, - "4428": { - "block": "_assert_valid_role_bool_true@6", - "stack_in": [], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4429": { - "error": "Invalid role identifier", - "block": "_assert_valid_role_bool_merge@8", - "stack_in": [ - "or_result%0#0" - ], - "op": "assert // Invalid role identifier", - "defined_out": [], - "stack_out": [] - }, - "4430": { - "retsub": true, - "op": "retsub" - }, - "4431": { - "block": "_assert_valid_role_bool_false@7", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4432": { - "op": "b _assert_valid_role_bool_merge@8" - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.teal b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.teal deleted file mode 100644 index 647da9f7..00000000 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.teal +++ /dev/null @@ -1,4455 +0,0 @@ -#pragma version 12 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.approval_program() -> uint64: -main: - intcblock 0 1 32 8 10000 200 86400 - bytecblock 0x151f7c75 0x52333023 "status" "issuance_date" "circulating_units" "interest_rate" 0x52323023 "unit_value" "primary_distribution_opening_date" "secondary_market_closure_date" "maturity_date" 0x52373023 0x52343023 "total_units" "settlement_asset_id" "day_count_convention" "secondary_market_opening_date" "coupon_period" 0x52383023 0x52363023 0x52353023 0x52323523 "asset_suspended" "asset_defaulted" "denomination_asset_id" "metadata" "principal_discount" "primary_distribution_closure_date" "paid_coupon_units" 0x74696d65506572696f6473 0x00 "total_coupons" 0x74696d654576656e7473 0x0000 0x068101 - txn ApplicationID - bnz main_after_if_else@2 - // modules/rbac.py:30-31 - // # RBAC Roles - // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec 6 // 0x52323023 - global ZeroAddress - app_global_put - // modules/rbac.py:32 - // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 21 // 0x52323523 - global ZeroAddress - app_global_put - // modules/rbac.py:47-48 - // # D-ASA Governance - // self.asset_suspended = False - bytec 22 // "asset_suspended" - intc_0 // 0 - app_global_put - // modules/rbac.py:49 - // self.asset_defaulted = False - bytec 23 // "asset_defaulted" - intc_0 // 0 - app_global_put - // modules/accounting.py:19 - // self.total_units = UInt64() - bytec 13 // "total_units" - intc_0 // 0 - app_global_put - // modules/accounting.py:20 - // self.circulating_units = UInt64() - bytec 4 // "circulating_units" - intc_0 // 0 - app_global_put - // modules/accounting.py:21 - // self.unit_value = UInt64() - bytec 7 // "unit_value" - intc_0 // 0 - app_global_put - // modules/accounting.py:22 - // self.status = UInt64(enm.STATUS_INACTIVE) - bytec_2 // "status" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:31-32 - // # Asset Configuration - // self.denomination_asset_id = Asset() - bytec 24 // "denomination_asset_id" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:33 - // self.settlement_asset_id = Asset() - bytec 14 // "settlement_asset_id" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:34 - // self.unit_value = UInt64() - bytec 7 // "unit_value" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:35 - // self.day_count_convention = UInt64() - bytec 15 // "day_count_convention" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:37-38 - // # Metadata - // self.metadata = Bytes() - bytec 25 // "metadata" - pushbytes 0x - app_global_put - // modules/core_financial/common.py:40-41 - // # Principal / Rates - // self.principal_discount = UInt64() - bytec 26 // "principal_discount" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:42 - // self.interest_rate = UInt64() - bytec 5 // "interest_rate" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:43 - // self.total_coupons = UInt64() - bytec 31 // "total_coupons" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:47 - // self.primary_distribution_opening_date = UInt64() - bytec 8 // "primary_distribution_opening_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:48 - // self.primary_distribution_closure_date = UInt64() - bytec 27 // "primary_distribution_closure_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:49 - // self.issuance_date = UInt64() - bytec_3 // "issuance_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:50 - // self.secondary_market_opening_date = UInt64() - bytec 16 // "secondary_market_opening_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:51 - // self.secondary_market_closure_date = UInt64() - bytec 9 // "secondary_market_closure_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:52 - // self.maturity_date = UInt64() - bytec 10 // "maturity_date" - intc_0 // 0 - app_global_put - // modules/core_financial/coupon.py:24 - // self.paid_coupon_units = UInt64() - bytec 28 // "paid_coupon_units" - intc_0 // 0 - app_global_put - // modules/core_financial/coupon.py:337 - // self.coupon_period = UInt64() - bytec 17 // "coupon_period" - intc_0 // 0 - app_global_put - // smart_contracts/perpetual_bond/contract.py:31 - // assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES - txn GlobalNumByteSlice - pushint 3 - == - assert // Wrong Global Bytes allocation - // smart_contracts/perpetual_bond/contract.py:32 - // assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS - txn GlobalNumUint - pushint 20 - == - assert // Wrong Global UInts allocation - // smart_contracts/perpetual_bond/contract.py:33 - // assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES - txn LocalNumByteSlice - ! - assert // Wrong Local Bytes allocation - // smart_contracts/perpetual_bond/contract.py:34 - // assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS - txn LocalNumUint - ! - assert // Wrong Local UInts allocation - -main_after_if_else@2: - // smart_contracts/perpetual_bond/contract.py:15-28 - // class PerpetualBond( - // PBNCoreMixin, - // PerpetualCouponCashflowMixin, - // NoPrincipalPaymentMixin, - // CouponPaymentAgentMixin, - // CouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - pushbytes 0x25dba95b // method "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - txna ApplicationArgs 0 - match main_asset_update_route@4 - -main_switch_case_next@5: - // smart_contracts/perpetual_bond/contract.py:15-28 - // class PerpetualBond( - // PBNCoreMixin, - // PerpetualCouponCashflowMixin, - // NoPrincipalPaymentMixin, - // CouponPaymentAgentMixin, - // CouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - txn OnCompletion - ! - assert - txn ApplicationID - bz main_create_NoOp@36 - pushbytess 0x89474134 0x9316298d 0x44363d49 0x67db4f20 0xf6a96c8d 0x229b706f 0x8cf14b51 0x4fd6a3cc 0x1d6fc255 0x25e9997f 0x6c85e3ee 0x402dba47 0xfad2173e 0x08efea35 0xe4a5ab54 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "update_interest_rate(uint16)uint64", method "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", method "get_payment_amount(address)(uint64,uint64)", method "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", method "get_time_periods()(uint64,uint64)[]", method "pay_coupon(address,byte[])(uint64,uint64,byte[])", method "asset_transfer(address,address,uint64)uint64", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "set_default_status(bool)uint64", method "primary_distribution(address,uint64)uint64", method "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", method "account_gov_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_close(address)(uint64,uint64)", method "account_update_payment_address(address,address)uint64", method "account_get_info(address)(address,uint64,uint64,uint64,bool)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,byte[])uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_config(uint8,address)(uint64,uint64)" - txna ApplicationArgs 0 - match asset_config update_interest_rate get_account_units_current_value get_payment_amount get_coupons_status get_time_periods pay_coupon asset_transfer set_secondary_time_events set_default_status primary_distribution get_asset_info get_time_events get_secondary_market_schedule get_asset_metadata account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config - err - -main_create_NoOp@36: - // smart_contracts/perpetual_bond/contract.py:15-28 - // class PerpetualBond( - // PBNCoreMixin, - // PerpetualCouponCashflowMixin, - // NoPrincipalPaymentMixin, - // CouponPaymentAgentMixin, - // CouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - pushbytes 0x3f0efc6c // method "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - txna ApplicationArgs 0 - match asset_create - err - -main_asset_update_route@4: - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txn OnCompletion - pushint 4 // UpdateApplication - == - txn ApplicationID - && - assert - b asset_update - - -// modules.actus.pbn.PBNCoreMixin.asset_config[routing]() -> void: -asset_config: - pushbytes "" - // modules/actus/pbn.py:32 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 3 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 4 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 5 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 6 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 7 - dup - cover 7 - len - pushint 2 - == - assert // invalid number of bytes for arc4.uint16 - txna ApplicationArgs 8 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - pushint 2 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array - txna ApplicationArgs 9 - dup - cover 7 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - intc_3 // 8 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array - txna ApplicationArgs 10 - dup - cover 7 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - pushint 16 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array> - // modules/core_financial/common.py:227 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/core_financial/common.py:228 - // assert self.status == enums.STATUS_INACTIVE, err.ALREADY_CONFIGURED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - ! - assert // D-ASA already configured - // modules/core_financial/common.py:55-56 - // # The reference implementation has on-chain denomination with ASA - // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) - dig 5 - asset_params_get AssetCreator - bury 1 - // modules/core_financial/common.py:57 - // assert exists, err.INVALID_DENOMINATION - assert // Denomination asset is not properly set - // modules/core_financial/common.py:60 - // self.denomination_asset_id = denomination_asset_id - bytec 24 // "denomination_asset_id" - dig 6 - app_global_put - // modules/core_financial/common.py:65 - // settlement_asset_id == self.denomination_asset_id - dig 4 - uncover 6 - == - // modules/core_financial/common.py:63-66 - // # The reference implementation settlement asset is the denomination asset - // assert ( - // settlement_asset_id == self.denomination_asset_id - // ), err.INVALID_SETTLEMENT_ASSET - assert // Different settlement asset not supported, must be equal to denomination asset - // modules/core_financial/common.py:69 - // self.settlement_asset_id = settlement_asset_id - bytec 14 // "settlement_asset_id" - dig 5 - app_global_put - // modules/core_financial/common.py:70-76 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // modules/core_financial/common.py:75 - // fee=Global.min_txn_fee, - global MinTxnFee - // modules/core_financial/common.py:73 - // asset_receiver=Global.current_application_address, - global CurrentApplicationAddress - // modules/core_financial/common.py:74 - // asset_amount=0, - intc_0 // 0 - itxn_field AssetAmount - itxn_field AssetReceiver - uncover 5 - itxn_field XferAsset - // modules/core_financial/common.py:70-71 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - pushint 4 // axfer - itxn_field TypeEnum - itxn_field Fee - // modules/core_financial/common.py:70-76 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - // modules/core_financial/common.py:238-239 - // # Set Principal and Minimum Denomination - // assert principal % minimum_denomination == 0, err.INVALID_MINIMUM_DENOMINATION - dig 3 - dig 2 - % - ! - assert // Minimum denomination is not a divisor of principal - // modules/core_financial/common.py:240 - // self.unit_value = minimum_denomination - bytec 7 // "unit_value" - dig 2 - app_global_put - // modules/core_financial/common.py:241 - // self.total_units = principal // minimum_denomination - uncover 3 - uncover 2 - / - bytec 13 // "total_units" - swap - app_global_put - // modules/core_financial/common.py:242 - // self.principal_discount = principal_discount - bytec 26 // "principal_discount" - uncover 2 - app_global_put - // modules/core_financial/common.py:244-245 - // # Set Day-Count Convention - // self.assert_day_count_convention(day_count_convention.as_uint64()) - btoi - dup - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - bz asset_config_bool_true@3 - dup - // modules/core_financial/common.py:82 - // UInt64(cst.DCC_CONT), - pushint 255 - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - == - bz asset_config_bool_false@4 - -asset_config_bool_true@3: - intc_1 // 1 - -asset_config_bool_merge@5: - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - assert // Invalid day-count convention ID - // modules/core_financial/common.py:86 - // self.day_count_convention = day_count_convention - bytec 15 // "day_count_convention" - dig 1 - app_global_put - // modules/core_financial/common.py:248-249 - // # Set Interest Rate - // self.assert_interest_rate(interest_rate.as_uint64()) - dig 6 - btoi - bury 8 - // modules/core_financial/common.py:89-90 - // # This subroutine must be used after the principal discount has been set - // if not self.principal_discount: - intc_0 // 0 - bytec 26 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - bnz asset_config_after_if_else@7 - // modules/core_financial/common.py:91 - // assert interest_rate > UInt64(0), err.INVALID_INTEREST_RATE - dig 7 - assert // Interest rate is not properly defined - -asset_config_after_if_else@7: - // modules/core_financial/common.py:94 - // self.interest_rate = interest_rate - bytec 5 // "interest_rate" - dig 8 - app_global_put - // modules/core_financial/common.py:97 - // assert not coupon_rates.length, err.INVALID_COUPON_RATES - dig 5 - dup - ! - assert // Coupon rates are not properly defined - // modules/core_financial/common.py:100 - // self.total_coupons = coupon_rates.length - bytec 31 // "total_coupons" - dig 1 - app_global_put - // modules/actus/pbn.py:18 - // time_events.length == self.total_coupons + 3 - pushint 3 - + - dig 4 - == - // modules/actus/pbn.py:16-19 - // # PBN has no maturity date in the static schedule - // assert ( - // time_events.length == self.total_coupons + 3 - // ), err.INVALID_TIME_EVENTS_LENGTH - assert // Time events length is invalid - // modules/core_financial/common.py:258 - // self.assert_time_events_sorted(time_events) - dig 4 - callsub assert_time_events_sorted - // modules/actus/pbn.py:22 - // self.time_events.value = time_events.copy() - bytec 32 // 0x74696d654576656e7473 - box_del - pop - bytec 32 // 0x74696d654576656e7473 - dig 1 - box_put - // modules/actus/pbn.py:23-25 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ] - dup - pushint 2 - extract_uint64 - // modules/actus/pbn.py:23 - // self.primary_distribution_opening_date = time_events[ - bytec 8 // "primary_distribution_opening_date" - // modules/actus/pbn.py:23-25 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ] - swap - app_global_put - // modules/actus/pbn.py:26-28 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ] - dup - pushint 10 - extract_uint64 - // modules/actus/pbn.py:26 - // self.primary_distribution_closure_date = time_events[ - bytec 27 // "primary_distribution_closure_date" - // modules/actus/pbn.py:26-28 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ] - swap - app_global_put - pushint 18 - // modules/actus/pbn.py:29 - // self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX] - extract_uint64 - bytec_3 // "issuance_date" - swap - app_global_put - // modules/actus/pbn.py:30 - // self.maturity_date = UInt64(0) - bytec 10 // "maturity_date" - intc_0 // 0 - app_global_put - // modules/core_financial/coupon.py:340-341 - // # The perpetual bond defines a single time period for the coupon duration with unlimited repetitions - // assert time_periods.length == UInt64(1), err.INVALID_TIME_PERIODS - dig 1 - intc_1 // 1 - == - assert // Time periods are not properly defined - // modules/core_financial/coupon.py:342 - // coupon_period_duration = time_periods[0][0] - dig 2 - dup - extract 2 16 - dup - intc_0 // 0 - extract_uint64 - swap - intc_3 // 8 - extract_uint64 - // modules/core_financial/coupon.py:344 - // assert coupon_period_duration > UInt64(0), err.INVALID_TIME_PERIOD_DURATION - swap - assert // Time period durations must be strictly greater than zero - // modules/core_financial/coupon.py:345 - // assert repetitions == UInt64(0), err.INVALID_TIME_PERIOD_REPETITIONS - ! - assert // Time period repetitions are not properly defined - // modules/core_financial/coupon.py:348 - // self.time_periods.value = time_periods.copy() - bytec 29 // 0x74696d65506572696f6473 - box_del - pop - bytec 29 // 0x74696d65506572696f6473 - swap - box_put - // modules/core_financial/coupon.py:349 - // self.coupon_period = self.time_periods.value[0][0] - bytec 29 // 0x74696d65506572696f6473 - pushints 2 16 - box_extract - intc_0 // 0 - extract_uint64 - bytec 17 // "coupon_period" - swap - app_global_put - // modules/core_financial/common.py:265 - // self.status = UInt64(enums.STATUS_ACTIVE) - bytec_2 // "status" - pushint 100 - app_global_put - // modules/actus/pbn.py:32 - // @arc4.abimethod - intc_1 // 1 - return - -asset_config_bool_false@4: - intc_0 // 0 - b asset_config_bool_merge@5 - - -// modules.actus.pbn.PBNCoreMixin.update_interest_rate[routing]() -> void: -update_interest_rate: - // modules/actus/pbn.py:89 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - pushint 2 - == - assert // invalid number of bytes for arc4.uint16 - // modules/rbac.py:80 - // assert self._role_is_active(self.interest_oracle, Txn.sender), err.UNAUTHORIZED - bytec 18 // 0x52383023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/actus/pbn.py:107 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/actus/pbn.py:108 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/actus/pbn.py:109 - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - // modules/actus/pbn.py:110 - // assert self.all_due_coupons_paid(due_coupons), err.PENDING_COUPON_PAYMENT - callsub all_due_coupons_paid - assert // Pending due coupon payment - // modules/actus/pbn.py:112-113 - // # Update interest rate - // self.interest_rate = interest_rate.as_uint64() - btoi - bytec 5 // "interest_rate" - swap - app_global_put - // modules/actus/pbn.py:114 - // return Global.latest_timestamp - global LatestTimestamp - // modules/actus/pbn.py:89 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_account_units_current_value[routing]() -> void: -get_account_units_current_value: - intc_0 // 0 - pushbytes "" - dupn 4 - // modules/core_financial/coupon.py:417 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/core_financial/coupon.py:438 - // self.primary_distribution_opening_date - intc_0 // 0 - bytec 8 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/coupon.py:438-439 - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - bz get_account_units_current_value_bool_false@4 - // modules/core_financial/coupon.py:439 - // and Global.latest_timestamp >= self.primary_distribution_opening_date - global LatestTimestamp - intc_0 // 0 - bytec 8 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - >= - // modules/core_financial/coupon.py:438-439 - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - bz get_account_units_current_value_bool_false@4 - intc_1 // 1 - -get_account_units_current_value_bool_merge@5: - // modules/core_financial/coupon.py:437-440 - // assert ( - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - // ), err.NO_PRIMARY_DISTRIBUTION - assert // Primary distribution not yet executed - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 2 - concat - dup - bury 9 - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/coupon.py:442 - // assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - dup - bz get_account_units_current_value_bool_false@8 - dig 7 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dig 1 - >= - bz get_account_units_current_value_bool_false@8 - intc_1 // 1 - -get_account_units_current_value_bool_merge@9: - // modules/core_financial/coupon.py:442 - // assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - assert // Invalid amount of units for the account - // modules/core_financial/coupon.py:444-445 - // # Value during primary distribution - // account_units_nominal_value = self.account_units_value(holding_address, units) - dig 1 - dup - dig 2 - callsub account_units_value - bury 8 - // modules/core_financial/coupon.py:446-447 - // # Accruing interest during primary distribution - // accrued_interest = UInt64() - intc_0 // 0 - bury 7 - // modules/core_financial/coupon.py:448 - // numerator = UInt64() - intc_0 // 0 - bury 4 - // modules/core_financial/coupon.py:449 - // denominator = UInt64() - intc_0 // 0 - bury 6 - // modules/core_financial/coupon.py:451-452 - // # Accruing interest - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - dup - bury 6 - // modules/core_financial/coupon.py:453 - // self.assert_no_pending_coupon_payment(holding_address, due_coupons) - swap - dig 1 - callsub assert_no_pending_coupon_payment - // modules/core_financial/coupon.py:454 - // if self.is_accruing_interest(due_coupons): - callsub is_accruing_interest - bz get_account_units_current_value_after_if_else@11 - // modules/core_financial/coupon.py:455 - // day_count_factor = self.day_count_factor(due_coupons) - dig 3 - dup - callsub day_count_factor - // modules/core_financial/coupon.py:456-458 - // accrued_interest = self.accrued_interest_amount( - // holding_address, units, due_coupons - // ) - dig 3 - dig 3 - uncover 3 - callsub accrued_interest_amount - bury 7 - // modules/core_financial/coupon.py:459 - // numerator = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - bury 4 - // modules/core_financial/coupon.py:460 - // denominator = day_count_factor.denominator - intc_3 // 8 - extract_uint64 - bury 5 - -get_account_units_current_value_after_if_else@11: - // modules/core_financial/coupon.py:465-468 - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - dig 2 - itob - dig 5 - itob - concat - // modules/core_financial/coupon.py:462-469 - // return typ.CurrentUnitsValue( - // units_value=account_units_nominal_value, - // accrued_interest=accrued_interest, - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - // ) - dig 7 - itob - dig 7 - itob - concat - swap - concat - // modules/core_financial/coupon.py:417 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -get_account_units_current_value_bool_false@8: - intc_0 // 0 - b get_account_units_current_value_bool_merge@9 - -get_account_units_current_value_bool_false@4: - intc_0 // 0 - b get_account_units_current_value_bool_merge@5 - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_payment_amount[routing]() -> void: -get_payment_amount: - // modules/core_financial/coupon.py:471 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/coupon.py:487 - // self.account_total_units_value(holding_address) - callsub account_total_units_value - // modules/core_financial/coupon.py:488 - // * self.interest_rate - intc_0 // 0 - bytec 5 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - // modules/core_financial/coupon.py:487-488 - // self.account_total_units_value(holding_address) - // * self.interest_rate - * - // modules/core_financial/coupon.py:489 - // // cst.BPS - intc 4 // 10000 - // modules/core_financial/coupon.py:487-489 - // self.account_total_units_value(holding_address) - // * self.interest_rate - // // cst.BPS - / - // modules/core_financial/coupon.py:491-494 - // return typ.PaymentAmounts( - // interest=interest_amount, - // principal=UInt64(0), - // ) - itob - // modules/core_financial/coupon.py:493 - // principal=UInt64(0), - intc_0 // 0 - // modules/core_financial/coupon.py:491-494 - // return typ.PaymentAmounts( - // interest=interest_amount, - // principal=UInt64(0), - // ) - itob - concat - // modules/core_financial/coupon.py:471 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_coupons_status[routing]() -> void: -get_coupons_status: - pushbytes "" - dupn 4 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/coupon.py:505 - // due_coupons = self.count_due_coupons() if self.status_is_active() else UInt64() - bz get_coupons_status_ternary_false@3 - callsub count_due_coupons - bury 3 - -get_coupons_status_ternary_merge@4: - // modules/core_financial/coupon.py:369 - // return self.coupon_due_date(due_coupons + 1) - dig 2 - dup - intc_1 // 1 - + - callsub coupon_due_date - bury 3 - // modules/core_financial/coupon.py:507 - // all_due_coupons_paid = self.all_due_coupons_paid(due_coupons) - dup - callsub all_due_coupons_paid - bury 6 - // modules/core_financial/coupon.py:508 - // numerator = UInt64() - intc_0 // 0 - bury 2 - // modules/core_financial/coupon.py:509 - // denominator = UInt64() - intc_0 // 0 - bury 5 - // modules/core_financial/coupon.py:510 - // if self.is_accruing_interest(due_coupons): - callsub is_accruing_interest - bz get_coupons_status_after_if_else@6 - // modules/core_financial/coupon.py:511 - // day_count_factor = self.day_count_factor(due_coupons) - dig 2 - callsub day_count_factor - // modules/core_financial/coupon.py:512 - // numerator = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - bury 2 - // modules/core_financial/coupon.py:513 - // denominator = day_count_factor.denominator - intc_3 // 8 - extract_uint64 - bury 4 - -get_coupons_status_after_if_else@6: - // modules/core_financial/coupon.py:515 - // total_coupons=self.total_coupons, - intc_0 // 0 - bytec 31 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - // modules/core_financial/coupon.py:518-521 - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - dig 1 - itob - dig 5 - itob - concat - // modules/core_financial/coupon.py:514-523 - // return typ.CouponsInfo( - // total_coupons=self.total_coupons, - // due_coupons=due_coupons, - // next_coupon_due_date=next_coupon_due_date, - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - // all_due_coupons_paid=all_due_coupons_paid, - // ) - swap - itob - dig 4 - itob - concat - dig 3 - itob - concat - swap - concat - bytec 30 // 0x00 - intc_0 // 0 - dig 7 - setbit - concat - // modules/core_financial/coupon.py:496 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -get_coupons_status_ternary_false@3: - // modules/core_financial/coupon.py:505 - // due_coupons = self.count_due_coupons() if self.status_is_active() else UInt64() - intc_0 // 0 - bury 3 - b get_coupons_status_ternary_merge@4 - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.get_time_periods[routing]() -> void: -get_time_periods: - // modules/core_financial/coupon.py:533 - // time_periods = typ.TimePeriods() - bytec 33 // 0x0000 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/coupon.py:534 - // if self.status_is_active(): - bz get_time_periods_after_if_else@3 - // modules/core_financial/coupon.py:535 - // time_periods = self.time_periods.value.copy() - bytec 29 // 0x74696d65506572696f6473 - box_get - swap - bury 2 - assert // check self.time_periods exists - -get_time_periods_after_if_else@3: - // modules/core_financial/coupon.py:525 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - dig 1 - concat - log - intc_1 // 1 - return - - -// modules.payment_agent.coupon.CouponPaymentAgentMixin.pay_coupon[routing]() -> void: -pay_coupon: - // modules/payment_agent/coupon.py:30 - // @arc4.abimethod - txna ApplicationArgs 1 - dupn 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/coupon.py:39 - // assert self.status_is_active(), err.UNAUTHORIZED - assert // Not authorized - // modules/core_financial/coupon.py:40 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/coupon.py:41 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - cover 2 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/coupon.py:44 - // units = self.account[holding_address].units - dup - box_get - pop - intc_2 // 32 - extract_uint64 - dup - cover 3 - // modules/core_financial/coupon.py:45 - // assert units > 0, err.NO_UNITS - assert // No D-ASA units - // modules/core_financial/coupon.py:47 - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - // modules/core_financial/coupon.py:48 - // account_paid_coupons = self.account[holding_address].paid_coupons - swap - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - // modules/core_financial/coupon.py:49 - // assert due_coupons > account_paid_coupons, err.NO_DUE_COUPON - swap - dig 1 - > - assert // No due coupon to pay - // modules/core_financial/coupon.py:50-53 - // # The following conditions verify if other accounts are still waiting for the payment of previous coupons - // assert self.all_due_coupons_paid( - // account_paid_coupons - // ), err.PENDING_COUPON_PAYMENT - callsub all_due_coupons_paid - assert // Pending due coupon payment - // modules/core_financial/coupon.py:414 - // self.account_total_units_value(holding_address), UInt64(1) - callsub account_total_units_value - // modules/core_financial/coupon.py:374 - // return principal_amount * self.interest_rate // cst.BPS - intc_0 // 0 - bytec 5 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - * - intc 4 // 10000 - / - // modules/payment_agent/common.py:13 - // if self.op_daemon.value != Global.zero_address: - intc_0 // 0 - bytec 21 // 0x52323523 - app_global_get_ex - assert // check self.op_daemon exists - global ZeroAddress - != - bz pay_coupon_after_if_else@22 - // modules/payment_agent/common.py:15 - // Txn.sender == self.op_daemon.value - txn Sender - intc_0 // 0 - bytec 21 // 0x52323523 - app_global_get_ex - assert // check self.op_daemon exists - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bnz pay_coupon_bool_true@19 - // modules/payment_agent/common.py:16 - // or Txn.sender == holding_address - txn Sender - dig 5 - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bnz pay_coupon_bool_true@19 - // modules/payment_agent/common.py:17 - // or Txn.sender == self.account[holding_address].payment_address - txn Sender - dig 3 - box_get - assert // check self.account entry exists - extract 0 32 - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bz pay_coupon_bool_false@20 - -pay_coupon_bool_true@19: - intc_1 // 1 - -pay_coupon_bool_merge@21: - // modules/payment_agent/common.py:14-18 - // assert ( - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - // ), err.UNAUTHORIZED - assert // Not authorized - -pay_coupon_after_if_else@22: - // modules/payment_agent/common.py:22 - // self.account[holding_address].payment_address.is_opted_in( - dig 2 - box_get - assert // check self.account entry exists - extract 0 32 - // modules/payment_agent/common.py:23 - // self.settlement_asset_id - intc_0 // 0 - bytec 14 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // modules/payment_agent/common.py:22-24 - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - asset_holding_get AssetBalance - bury 1 - // modules/payment_agent/common.py:22-25 - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - // and not self.account[holding_address].suspended - bz pay_coupon_bool_false@27 - // modules/payment_agent/common.py:25 - // and not self.account[holding_address].suspended - dig 2 - box_get - assert // check self.account entry exists - pushint 448 - getbit - bnz pay_coupon_bool_false@27 - intc_1 // 1 - -pay_coupon_bool_merge@28: - // modules/payment_agent/coupon.py:57 - // if self.is_payment_executable(holding_address): - bz pay_coupon_else_body@3 - // modules/payment_agent/common.py:30 - // self.settlement_asset_id.balance(Global.current_application_address) - global CurrentApplicationAddress - intc_0 // 0 - bytec 14 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - swap - dig 1 - asset_holding_get AssetBalance - assert // account opted into asset - // modules/payment_agent/common.py:30-31 - // self.settlement_asset_id.balance(Global.current_application_address) - // >= payment_amount - dig 2 - dup - cover 2 - >= - // modules/payment_agent/common.py:29-32 - // assert ( - // self.settlement_asset_id.balance(Global.current_application_address) - // >= payment_amount - // ), err.NOT_ENOUGH_FUNDS - assert // Not enough funds for the payment - // modules/payment_agent/coupon.py:60-61 - // # The reference implementation has the same asset for denomination and settlement, no conversion needed - // self.pay(self.account[holding_address].payment_address, payment_amount) - dig 4 - box_get - assert // check self.account entry exists - extract 0 32 - // modules/payment_agent/common.py:35-40 - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=receiver, - // asset_amount=amount, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // modules/payment_agent/common.py:39 - // fee=Global.min_txn_fee, - global MinTxnFee - uncover 2 - itxn_field AssetAmount - swap - itxn_field AssetReceiver - swap - itxn_field XferAsset - // modules/payment_agent/common.py:35 - // itxn.AssetTransfer( - pushint 4 // axfer - itxn_field TypeEnum - itxn_field Fee - // modules/payment_agent/common.py:35-40 - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=receiver, - // asset_amount=amount, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - -pay_coupon_after_if_else@4: - // modules/core_financial/coupon.py:63 - // self.account[holding_address].paid_coupons += 1 - dig 2 - dup - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - intc_1 // 1 - + - itob - pushint 48 - swap - box_replace - // modules/core_financial/coupon.py:64 - // self.paid_coupon_units += units - intc_0 // 0 - bytec 28 // "paid_coupon_units" - app_global_get_ex - assert // check self.paid_coupon_units exists - dig 2 - + - bytec 28 // "paid_coupon_units" - swap - app_global_put - // modules/payment_agent/coupon.py:17 - // contract_id=Global.current_application_id.id, - global CurrentApplicationID - // modules/payment_agent/coupon.py:20 - // time=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/coupon.py:22 - // currency_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 24 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/payment_agent/coupon.py:23 - // currency_unit=self.denomination_asset_id.unit_name, - dup - asset_params_get AssetUnitName - assert // asset exists - // modules/payment_agent/coupon.py:24 - // nominal_value=self.circulating_units * self.unit_value, - intc_0 // 0 - bytec 4 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 7 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - * - // modules/payment_agent/coupon.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - uncover 4 - itob - pushbytes 0x080037 - concat - uncover 4 - itob - concat - dig 4 - itob - swap - dig 1 - concat - uncover 4 - itob - concat - dig 3 - len - itob - extract 6 2 - uncover 4 - concat - swap - pushbytes 0x003b - concat - uncover 3 - itob - concat - // modules/payment_agent/coupon.py:25 - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - bytec 33 // 0x0000 - // modules/payment_agent/coupon.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - concat - // modules/payment_agent/coupon.py:26 - // nominal_accrued=UInt64(0), - intc_0 // 0 - // modules/payment_agent/coupon.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - itob - concat - pushbytes 0x00024950 - concat - swap - concat - // modules/payment_agent/coupon.py:15-28 - // arc4.emit( - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_IP), - // type_name=String("IP"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), # TODO: Add interest rate - // nominal_accrued=UInt64(0), - // ) - // ) - pushbytes 0x8c29904e // method "Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)" - swap - concat - log - // modules/payment_agent/coupon.py:70 - // timestamp=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/coupon.py:68-72 - // return typ.PaymentResult( - // amount=payment_amount, - // timestamp=Global.latest_timestamp, - // context=payment_info, # TODO: Add info on failed payment - // ) - itob - concat - dig 4 - dup - len - itob - extract 6 2 - swap - concat - swap - pushbytes 0x0012 - concat - swap - concat - // modules/payment_agent/coupon.py:30 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -pay_coupon_else_body@3: - // modules/payment_agent/coupon.py:63-64 - // # Accounts suspended or not opted in at the time of payments must not stall the D-ASA - // payment_amount = UInt64() - intc_0 // 0 - bury 1 - b pay_coupon_after_if_else@4 - -pay_coupon_bool_false@27: - intc_0 // 0 - b pay_coupon_bool_merge@28 - -pay_coupon_bool_false@20: - intc_0 // 0 - b pay_coupon_bool_merge@21 - - -// modules.transfer_agent.coupon.CouponTransferAgentMixin.asset_transfer[routing]() -> void: -asset_transfer: - intc_0 // 0 - dupn 2 - pushbytes "" - dup - // modules/transfer_agent/coupon.py:9 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:153-158 - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - bz asset_transfer_bool_false@6 - // modules/core_financial/common.py:154 - // and self.secondary_market_opening_date <= Global.latest_timestamp - intc_0 // 0 - bytec 16 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - global LatestTimestamp - <= - // modules/core_financial/common.py:153-158 - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - bz asset_transfer_bool_false@6 - // modules/core_financial/common.py:156 - // not self.secondary_market_closure_date - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:156-157 - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - bz asset_transfer_bool_true@5 - // modules/core_financial/common.py:157 - // or Global.latest_timestamp < self.secondary_market_closure_date - global LatestTimestamp - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - < - // modules/core_financial/common.py:156-157 - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - bz asset_transfer_bool_false@6 - -asset_transfer_bool_true@5: - intc_1 // 1 - -asset_transfer_bool_merge@7: - // modules/core_financial/common.py:152-159 - // assert ( - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - // ), err.SECONDARY_MARKET_CLOSED - assert // Secondary market is closed - // modules/core_financial/common.py:169-171 - // # The reference implementation grants transfer right to D-ASA owners. Other implementations may relay on other - // # roles, external Apps through C2C calls (e.g., an order book), or off-chain transfer agents. - // assert Txn.sender == sender_holding_address, err.UNAUTHORIZED - txn Sender - dig 3 - dup - cover 2 - == - assert // Not authorized - // modules/core_financial/common.py:172 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:173 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - bury 9 - dup - box_len - bury 1 - assert // Invalid account holding address - bytec_1 // 0x52333023 - dig 4 - dup - cover 2 - concat - dup - bury 10 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/common.py:176 - // self.assert_is_not_account_suspended(sender_holding_address) - dig 3 - callsub assert_is_not_account_suspended - // modules/core_financial/common.py:177 - // self.assert_is_not_account_suspended(receiver_holding_address) - dig 1 - callsub assert_is_not_account_suspended - // modules/core_financial/common.py:190 - // assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER - uncover 3 - uncover 2 - != - assert // Sender and receiver must be different - // modules/core_financial/common.py:191 - // assert units > 0, err.NULL_TRANSFER - dig 2 - dup - assert // Transfer units must be greater than zero - // modules/core_financial/common.py:192 - // assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER - uncover 2 - box_get - assert // check self.account entry exists - dup - intc_2 // 32 - extract_uint64 - uncover 2 - >= - assert // Insufficient sender units to transfer - // modules/accounting.py:63 - // sender_unit_value = self.account[sender].unit_value - extract 40 8 - bury 9 - // modules/accounting.py:64 - // if self.account[receiver].units > UInt64(0): - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - bz asset_transfer_else_body@9 - // modules/accounting.py:58 - // self.account[sender].unit_value == self.account[receiver].unit_value - dig 6 - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - dig 6 - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - == - // modules/accounting.py:58-59 - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - bz asset_transfer_bool_false@20 - // modules/accounting.py:59 - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - dig 6 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - dig 6 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - == - // modules/accounting.py:58-59 - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - bz asset_transfer_bool_false@20 - intc_1 // 1 - -asset_transfer_bool_merge@21: - // modules/accounting.py:57-60 - // assert ( - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - // ), err.NON_FUNGIBLE_UNITS - assert // Sender and receiver units are not fungible - -asset_transfer_after_if_else@10: - // modules/transfer_agent/coupon.py:46-47 - // # Transferred units value (must be computed before the transfer) - // sender_unit_value = self.account[sender_holding_address].unit_value - dig 6 - dup - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - bury 5 - // modules/core_financial/coupon.py:69-70 - // # Transfer is forbidden in case of pending coupon payments - // due_coupons = self.count_due_coupons() - callsub count_due_coupons - // modules/core_financial/coupon.py:71 - // self.assert_no_pending_coupon_payment(sender_holding_address, due_coupons) - dig 4 - dup - cover 2 - dig 1 - callsub assert_no_pending_coupon_payment - // modules/core_financial/coupon.py:72 - // return self.accrued_interest_amount(sender_holding_address, units, due_coupons) - swap - dig 3 - dup - cover 3 - uncover 2 - callsub accrued_interest_amount - bury 7 - // modules/accounting.py:71 - // assert units <= self.account[holding_address].units, err.OVER_TRANSFER - dig 1 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dup2 - <= - assert // Insufficient sender units to transfer - // modules/accounting.py:72 - // self.account[holding_address].units -= units - swap - - - itob - dig 1 - intc_2 // 32 - uncover 2 - box_replace - // modules/accounting.py:52 - // if self.account[holding_address].units == UInt64(0): - box_get - pop - intc_2 // 32 - extract_uint64 - bnz asset_transfer_after_if_else@16 - // modules/accounting.py:53 - // self.account[holding_address].unit_value = UInt64(0) - intc_0 // 0 - itob - dig 7 - dup - cover 2 - pushint 40 - dig 2 - box_replace - // modules/accounting.py:54 - // self.account[holding_address].paid_coupons = UInt64(0) - pushint 48 - swap - box_replace - -asset_transfer_after_if_else@16: - // modules/accounting.py:76 - // self.account[holding_address].units += units - dig 5 - dup - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dig 2 - dup - cover 2 - + - itob - uncover 2 - intc_2 // 32 - uncover 2 - box_replace - // modules/transfer_agent/coupon.py:53 - // return units * sender_unit_value + accrued_interest - dig 4 - * - dig 5 - + - // modules/transfer_agent/coupon.py:9 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -asset_transfer_bool_false@20: - intc_0 // 0 - b asset_transfer_bool_merge@21 - -asset_transfer_else_body@9: - // modules/accounting.py:67 - // self.account[receiver].unit_value = sender_unit_value - dig 5 - dup - pushint 40 - dig 10 - box_replace - // modules/accounting.py:68 - // self.account[receiver].paid_coupons = self.account[sender].paid_coupons - dig 7 - box_get - assert // check self.account entry exists - extract 48 8 - pushint 48 - swap - box_replace - b asset_transfer_after_if_else@10 - -asset_transfer_bool_false@6: - intc_0 // 0 - b asset_transfer_bool_merge@7 - - -// modules.core_financial.common.CoreFinancialCommonMixin.asset_create[routing]() -> void: -asset_create: - // modules/core_financial/common.py:267 - // @arc4.abimethod(create="require") - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - dig 1 - pushint 38 - extract_uint16 // on error: invalid tuple encoding - dup - pushint 40 - == - assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[])) - dig 2 - swap - dig 2 - substring3 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 42 - + - == - assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata - // modules/core_financial/common.py:276 - // self.arranger.value = arranger - bytec 6 // 0x52323023 - uncover 2 - app_global_put - // modules/core_financial/common.py:277 - // self.metadata = metadata.bytes - bytec 25 // "metadata" - swap - app_global_put - // modules/core_financial/common.py:267 - // @arc4.abimethod(create="require") - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.asset_update[routing]() -> void: -asset_update: - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txna ApplicationArgs 1 - dup - len - dig 1 - pushint 38 - extract_uint16 // on error: invalid tuple encoding - dup - pushint 40 - == - assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[])) - dig 2 - swap - dig 2 - substring3 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 42 - + - == - assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata - // modules/core_financial/common.py:284-287 - // # The reference implementation grants the update permissions to the Arranger. - // # Other implementations may disable D-ASA application updatability or change its authorizations. - // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/core_financial/common.py:288 - // self.metadata = metadata.bytes - bytec 25 // "metadata" - swap - app_global_put - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.set_secondary_time_events[routing]() -> void: -set_secondary_time_events: - intc_0 // 0 - // modules/core_financial/common.py:290 - // @arc4.abimethod - txna ApplicationArgs 1 - dupn 2 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - intc_3 // 8 - * - pushint 2 - + - uncover 2 - len - == - assert // invalid number of bytes for arc4.dynamic_array - // modules/core_financial/common.py:311 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 5 // 200 - == - // modules/core_financial/common.py:312 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/core_financial/common.py:313 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:315 - // assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH - dup - assert // Time events length is invalid - // modules/core_financial/common.py:316 - // if secondary_market_time_events.length > 1: - intc_1 // 1 - > - bz set_secondary_time_events_after_if_else@3 - // modules/core_financial/common.py:317 - // self.assert_time_events_sorted(secondary_market_time_events) - dup - callsub assert_time_events_sorted - bury 1 - -set_secondary_time_events_after_if_else@3: - // modules/core_financial/common.py:320 - // self.issuance_date - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/common.py:321 - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - dig 1 - dup - extract 2 0 - bury 4 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:320-321 - // self.issuance_date - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - swap - dig 1 - <= - // modules/core_financial/common.py:319-322 - // assert ( - // self.issuance_date - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - // ), err.INVALID_SECONDARY_OPENING_DATE - assert // Invalid secondary market opening date - // modules/core_financial/common.py:323 - // self.secondary_market_opening_date = secondary_market_time_events[ - bytec 16 // "secondary_market_opening_date" - // modules/core_financial/common.py:323-325 - // self.secondary_market_opening_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_OPENING_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:326 - // if self.maturity_date: - intc_0 // 0 - bytec 10 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - bz set_secondary_time_events_after_if_else@5 - // modules/core_financial/common.py:328 - // self.maturity_date - intc_0 // 0 - bytec 10 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // modules/core_financial/common.py:329 - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - dig 1 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_3 // 8 - * - dig 3 - swap - extract_uint64 - // modules/core_financial/common.py:328-329 - // self.maturity_date - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - swap - dig 1 - >= - // modules/core_financial/common.py:327-330 - // assert ( - // self.maturity_date - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - // ), err.INVALID_SECONDARY_CLOSURE_DATE - assert // Invalid secondary market closure date - // modules/core_financial/common.py:331 - // self.secondary_market_closure_date = secondary_market_time_events[ - bytec 9 // "secondary_market_closure_date" - // modules/core_financial/common.py:331-333 - // self.secondary_market_closure_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - // ] - swap - app_global_put - -set_secondary_time_events_after_if_else@5: - // modules/core_financial/common.py:335 - // secondary_market_opening_date=self.secondary_market_opening_date, - intc_0 // 0 - bytec 16 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - // modules/core_financial/common.py:336 - // secondary_market_closure_date=self.secondary_market_closure_date, - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:334-337 - // return typ.SecondaryMarketSchedule( - // secondary_market_opening_date=self.secondary_market_opening_date, - // secondary_market_closure_date=self.secondary_market_closure_date, - // ) - swap - itob - swap - itob - concat - // modules/core_financial/common.py:290 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.set_default_status[routing]() -> void: -set_default_status: - // modules/core_financial/common.py:339 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:74 - // assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED - bytec 19 // 0x52363023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/core_financial/common.py:352 - // self.asset_defaulted = defaulted - bytec 23 // "asset_defaulted" - swap - app_global_put - // modules/core_financial/common.py:353 - // return Global.latest_timestamp - global LatestTimestamp - // modules/core_financial/common.py:339 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.primary_distribution[routing]() -> void: -primary_distribution: - pushbytes "" - // modules/core_financial/common.py:355 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:145-148 - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // modules/core_financial/common.py:146 - // and self.primary_distribution_opening_date - intc_0 // 0 - bytec 8 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/common.py:147 - // <= Global.latest_timestamp - global LatestTimestamp - dup - bury 5 - // modules/core_financial/common.py:146-147 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - <= - // modules/core_financial/common.py:146-148 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // modules/core_financial/common.py:148 - // < self.primary_distribution_closure_date - intc_0 // 0 - bytec 27 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // modules/core_financial/common.py:147-148 - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - dig 3 - > - // modules/core_financial/common.py:146-148 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - intc_1 // 1 - -primary_distribution_bool_merge@6: - // modules/core_financial/common.py:144-149 - // assert ( - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - // ), err.PRIMARY_DISTRIBUTION_CLOSED - assert // Primary distribution is closed - // modules/rbac.py:71 - // assert self._role_is_active(self.primary_dealer, Txn.sender), err.UNAUTHORIZED - bytec 20 // 0x52353023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/common.py:383 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:384 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/core_financial/common.py:385 - // assert units > 0, err.ZERO_UNITS - dig 1 - dup - assert // Can not distribute zero units - // modules/core_financial/common.py:386 - // assert self.circulating_units + units <= self.total_units, err.OVER_DISTRIBUTION - intc_0 // 0 - bytec 4 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 1 - + - intc_0 // 0 - bytec 13 // "total_units" - app_global_get_ex - assert // check self.total_units exists - dig 1 - >= - assert // Insufficient remaining D-ASA units - // modules/core_financial/common.py:388 - // self.circulating_units += units - bytec 4 // "circulating_units" - dig 1 - app_global_put - // modules/core_financial/common.py:389 - // self.account[holding_address].units += units - dig 2 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - uncover 2 - + - itob - dig 2 - intc_2 // 32 - uncover 2 - box_replace - // modules/core_financial/common.py:390 - // self.account[holding_address].unit_value = self.unit_value - intc_0 // 0 - bytec 7 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - itob - uncover 2 - pushint 40 - uncover 2 - box_replace - // modules/core_financial/common.py:391 - // return self.total_units - self.circulating_units - intc_0 // 0 - bytec 13 // "total_units" - app_global_get_ex - assert // check self.total_units exists - swap - - - // modules/core_financial/common.py:355 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -primary_distribution_bool_false@5: - intc_0 // 0 - b primary_distribution_bool_merge@6 - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_asset_info[routing]() -> void: -get_asset_info: - // modules/core_financial/common.py:403 - // performance = UInt64(cst.PRF_PERFORMANT) - intc_0 // 0 - // modules/core_financial/common.py:404 - // if Global.latest_timestamp > self.maturity_date > 0: - global LatestTimestamp - intc_0 // 0 - bytec 10 // "maturity_date" - app_global_get_ex - swap - dup - cover 2 - cover 3 - assert // check self.maturity_date exists - > - bz get_asset_info_after_if_else@4 - dup - bz get_asset_info_after_if_else@4 - // modules/core_financial/common.py:405 - // performance = UInt64(cst.PRF_MATURED) - pushint 4 - bury 2 - -get_asset_info_after_if_else@4: - // modules/core_financial/common.py:406-407 - // # The reference implementation has no grace or delinquency periods - // if self.asset_defaulted: - intc_0 // 0 - bytec 23 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - bz get_asset_info_after_if_else@6 - // modules/core_financial/common.py:408 - // performance = UInt64(cst.PRF_DEFAULTED) - pushint 3 - bury 2 - -get_asset_info_after_if_else@6: - // modules/core_financial/common.py:411 - // denomination_asset_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 24 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/core_financial/common.py:412 - // settlement_asset_id=self.settlement_asset_id.id, - intc_0 // 0 - bytec 14 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // modules/accounting.py:45 - // return self.circulating_units * self.unit_value - intc_0 // 0 - bytec 4 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 7 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - dup2 - * - // modules/core_financial/common.py:415 - // day_count_convention=arc4.UInt8(self.day_count_convention), - intc_0 // 0 - bytec 15 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - itob - dup - bitlen - intc_3 // 8 - <= - assert // overflow - extract 7 1 - // modules/core_financial/common.py:416 - // principal_discount=arc4.UInt16(self.principal_discount), - intc_0 // 0 - bytec 26 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - itob - dup - bitlen - pushint 16 - <= - assert // overflow - extract 6 2 - // modules/core_financial/common.py:417 - // interest_rate=arc4.UInt16(self.interest_rate), - intc_0 // 0 - bytec 5 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - itob - dup - bitlen - pushint 16 - <= - assert // overflow - extract 6 2 - // modules/core_financial/common.py:418 - // total_supply=self.total_units, - intc_0 // 0 - bytec 13 // "total_units" - app_global_get_ex - assert // check self.total_units exists - // modules/core_financial/common.py:420 - // primary_distribution_opening_date=self.primary_distribution_opening_date, - intc_0 // 0 - bytec 8 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/common.py:421 - // primary_distribution_closure_date=self.primary_distribution_closure_date, - intc_0 // 0 - bytec 27 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // modules/core_financial/common.py:422 - // issuance_date=self.issuance_date, - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/common.py:423 - // maturity_date=self.maturity_date, - intc_0 // 0 - bytec 10 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // modules/core_financial/common.py:424 - // suspended=self.asset_suspended, - intc_0 // 0 - bytec 22 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - // modules/core_financial/common.py:425 - // performance=arc4.UInt8(performance), - dig 15 - itob - dup - bitlen - intc_3 // 8 - <= - assert // overflow - extract 7 1 - // modules/core_financial/common.py:410-426 - // return typ.AssetInfo( - // denomination_asset_id=self.denomination_asset_id.id, - // settlement_asset_id=self.settlement_asset_id.id, - // outstanding_principal=self.outstanding_principal(), - // unit_value=self.unit_value, - // day_count_convention=arc4.UInt8(self.day_count_convention), - // principal_discount=arc4.UInt16(self.principal_discount), - // interest_rate=arc4.UInt16(self.interest_rate), - // total_supply=self.total_units, - // circulating_supply=self.circulating_units, - // primary_distribution_opening_date=self.primary_distribution_opening_date, - // primary_distribution_closure_date=self.primary_distribution_closure_date, - // issuance_date=self.issuance_date, - // maturity_date=self.maturity_date, - // suspended=self.asset_suspended, - // performance=arc4.UInt8(performance), - // ) - uncover 14 - itob - uncover 14 - itob - concat - uncover 11 - itob - concat - uncover 11 - itob - concat - uncover 10 - concat - uncover 9 - concat - uncover 8 - concat - uncover 7 - itob - concat - uncover 7 - itob - concat - uncover 6 - itob - concat - uncover 5 - itob - concat - uncover 4 - itob - concat - uncover 3 - itob - concat - bytec 30 // 0x00 - intc_0 // 0 - uncover 4 - setbit - concat - swap - concat - // modules/core_financial/common.py:393 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_time_events[routing]() -> void: -get_time_events: - // modules/core_financial/common.py:436 - // time_events = typ.TimeEvents() - bytec 33 // 0x0000 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:437 - // if self.status_is_active(): - bz get_time_events_after_if_else@3 - // modules/core_financial/common.py:438 - // time_events = self.time_events.value.copy() - bytec 32 // 0x74696d654576656e7473 - box_get - swap - bury 2 - assert // check self.time_events exists - -get_time_events_after_if_else@3: - // modules/core_financial/common.py:428 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - dig 1 - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_secondary_market_schedule[routing]() -> void: -get_secondary_market_schedule: - // modules/core_financial/common.py:450 - // (self.secondary_market_opening_date, self.secondary_market_closure_date) - intc_0 // 0 - bytec 16 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:449-451 - // return typ.TimeEvents( - // (self.secondary_market_opening_date, self.secondary_market_closure_date) - // ) - swap - itob - pushbytes 0x0002 - swap - concat - swap - itob - concat - // modules/core_financial/common.py:441 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_asset_metadata[routing]() -> void: -get_asset_metadata: - // modules/core_financial/common.py:462 - // return typ.AssetMetadata.from_bytes(self.metadata) - intc_0 // 0 - bytec 25 // "metadata" - app_global_get_ex - assert // check self.metadata exists - // modules/core_financial/common.py:453 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_gov_suspension[routing]() -> void: -account_gov_suspension: - // modules/accounting.py:94 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 11 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:114 - // self.account[holding_address].suspended = suspended - dup - pushint 56 - intc_1 // 1 - box_extract - intc_0 // 0 - uncover 3 - setbit - pushint 56 - swap - box_replace - // modules/accounting.py:115 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:94 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_open[routing]() -> void: -account_open: - // modules/accounting.py:117 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 12 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 5 // 200 - == - // modules/accounting.py:139 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/accounting.py:140 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:141 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:142 - // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - ! - assert // Invalid account holding address - // modules/accounting.py:146 - // units=UInt64(0), - intc_0 // 0 - // modules/accounting.py:144-150 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=UInt64(0), - // unit_value=UInt64(0), - // paid_coupons=UInt64(0), - // suspended=False, - // ) - itob - uncover 2 - dig 1 - concat - dig 1 - concat - swap - concat - bytec 30 // 0x00 - concat - box_put - // modules/accounting.py:151 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:117 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_close[routing]() -> void: -account_close: - // modules/accounting.py:153 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 12 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:171 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:174 - // closed_units = self.account[holding_address].units - dup - box_get - pop - intc_2 // 32 - extract_uint64 - dup - uncover 2 - // modules/accounting.py:175 - // del self.account[holding_address] - box_del - pop - // modules/accounting.py:176 - // self.circulating_units -= closed_units - intc_0 // 0 - bytec 4 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - swap - - - bytec 4 // "circulating_units" - dig 1 - app_global_put - // modules/accounting.py:48 - // if self.circulating_units == UInt64(0): - bnz account_close_after_if_else@3 - // modules/accounting.py:49 - // self.status = UInt64(enm.STATUS_ENDED) - bytec_2 // "status" - intc 5 // 200 - app_global_put - -account_close_after_if_else@3: - // modules/accounting.py:178 - // return closed_units, Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:153 - // @arc4.abimethod - dig 1 - itob - swap - itob - concat - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_update_payment_address[routing]() -> void: -account_update_payment_address: - // modules/accounting.py:180 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:200 - // assert Txn.sender == holding_address, err.UNAUTHORIZED - txn Sender - dig 2 - == - assert // Not authorized - // modules/accounting.py:201 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:202 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:204 - // self.account[holding_address].payment_address = payment_address - intc_0 // 0 - uncover 2 - box_replace - // modules/accounting.py:205 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:180 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_get_info[routing]() -> void: -account_get_info: - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:222 - // return self.account[holding_address] - box_get - pop - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: -rbac_rotate_arranger: - // modules/rbac.py:147 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:158 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:159 - // self.arranger.value = new_arranger - bytec 6 // 0x52323023 - swap - app_global_put - // modules/rbac.py:160 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:147 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: -rbac_set_op_daemon: - // modules/rbac.py:162 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:173 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:174 - // self.op_daemon.value = address - bytec 21 // 0x52323523 - swap - app_global_put - // modules/rbac.py:175 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:162 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: -rbac_assign_role: - // modules/rbac.py:177 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/rbac.py:199 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:200 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:201 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:101 - // if role_id == UInt64(cst.ROLE_ARRANGER): - pushint 20 - == - bz rbac_assign_role_after_if_else@3 - // modules/rbac.py:102 - // self.arranger.value = role_address - bytec 6 // 0x52323023 - dig 3 - app_global_put - -rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14: - // modules/rbac.py:203 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:177 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_assign_role_after_if_else@3: - // modules/rbac.py:105 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - dup - pushint 40 - == - bz rbac_assign_role_after_if_else@5 - // modules/rbac.py:106 - // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 12 // 0x52343023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:107 - // self.account_manager[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@5: - // modules/rbac.py:109 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_assign_role_after_if_else@7 - // modules/rbac.py:110 - // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 20 // 0x52353023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:111 - // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@7: - // modules/rbac.py:113 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_assign_role_after_if_else@9 - // modules/rbac.py:114 - // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 19 // 0x52363023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:115 - // self.trustee[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@9: - // modules/rbac.py:117 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_assign_role_after_if_else@11 - // modules/rbac.py:118 - // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec 11 // 0x52373023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:119 - // self.authority[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@11: - // modules/rbac.py:121 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - // modules/rbac.py:122 - // assert role_address not in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 18 // 0x52383023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:123 - // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - - -// modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: -rbac_revoke_role: - // modules/rbac.py:205 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:224 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:225 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:226 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:126 - // assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE - dup - pushint 20 - != - assert // Invalid role identifier - // modules/rbac.py:127 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushint 40 - == - bz rbac_revoke_role_after_if_else@3 - // modules/rbac.py:128 - // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 12 // 0x52343023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:129 - // del self.account_manager[role_address] - box_del - pop - -rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:228 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:205 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_revoke_role_after_if_else@3: - // modules/rbac.py:131 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_revoke_role_after_if_else@5 - // modules/rbac.py:132 - // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 20 // 0x52353023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:133 - // del self.primary_dealer[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@5: - // modules/rbac.py:135 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_revoke_role_after_if_else@7 - // modules/rbac.py:136 - // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 19 // 0x52363023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:137 - // del self.trustee[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@7: - // modules/rbac.py:139 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_revoke_role_after_if_else@9 - // modules/rbac.py:140 - // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec 11 // 0x52373023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:141 - // del self.authority[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@9: - // modules/rbac.py:143 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - // modules/rbac.py:144 - // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 18 // 0x52383023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:145 - // del self.interest_oracle[role_address] - box_del - pop - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - - -// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: -rbac_gov_asset_suspension: - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 11 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/rbac.py:246 - // self.asset_suspended = suspended - bytec 22 // "asset_suspended" - swap - app_global_put - // modules/rbac.py:247 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: -rbac_get_arranger: - // modules/rbac.py:257 - // return self.arranger.value - intc_0 // 0 - bytec 6 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - // modules/rbac.py:249 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: -rbac_get_address_roles: - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:273 - // self._role_is_active(self.account_manager, address), - bytec 12 // 0x52343023 - dig 1 - callsub _role_is_active - // modules/rbac.py:274 - // self._role_is_active(self.primary_dealer, address), - bytec 20 // 0x52353023 - dig 2 - callsub _role_is_active - // modules/rbac.py:275 - // self._role_is_active(self.trustee, address), - bytec 19 // 0x52363023 - dig 3 - callsub _role_is_active - // modules/rbac.py:276 - // self._role_is_active(self.authority, address), - bytec 11 // 0x52373023 - dig 4 - callsub _role_is_active - // modules/rbac.py:277 - // self._role_is_active(self.interest_oracle, address), - bytec 18 // 0x52383023 - uncover 5 - callsub _role_is_active - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - bytec 30 // 0x00 - intc_0 // 0 - uncover 6 - setbit - intc_1 // 1 - uncover 5 - setbit - pushint 2 - uncover 4 - setbit - pushint 3 - uncover 3 - setbit - pushint 4 - uncover 2 - setbit - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_role_config[routing]() -> void: -rbac_get_role_config: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:294 - // role = role_id.as_uint64() - btoi - // modules/rbac.py:295 - // self._assert_valid_role(role) - dup - callsub _assert_valid_role - // modules/rbac.py:297 - // case UInt64(cst.ROLE_ARRANGER): - pushints 20 40 50 60 70 80 - // modules/rbac.py:296-327 - // match role: - // case UInt64(cst.ROLE_ARRANGER): - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.account_manager[role_address] - // case UInt64(cst.ROLE_PRIMARY_DEALER): - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.primary_dealer[role_address] - // case UInt64(cst.ROLE_TRUSTEE): - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.trustee[role_address] - // case UInt64(cst.ROLE_AUTHORITY): - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.authority[role_address] - // case UInt64(cst.ROLE_INTEREST_ORACLE): - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.interest_oracle[role_address] - // case _: - // op.err(err.INVALID_ROLE) - uncover 6 - match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7 - // modules/rbac.py:327 - // op.err(err.INVALID_ROLE) - err // Invalid role identifier - -rbac_get_role_config_switch_case_5@7: - // modules/rbac.py:323 - // self.interest_oracle, role_address - bytec 18 // 0x52383023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:322-324 - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:325 - // return self.interest_oracle[role_address] - box_get - pop - -rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_get_role_config_switch_case_4@6: - // modules/rbac.py:318 - // self.authority, role_address - bytec 11 // 0x52373023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:317-319 - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:320 - // return self.authority[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_3@5: - // modules/rbac.py:313 - // self.trustee, role_address - bytec 19 // 0x52363023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:312-314 - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:315 - // return self.trustee[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_2@4: - // modules/rbac.py:308 - // self.primary_dealer, role_address - bytec 20 // 0x52353023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:307-309 - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:310 - // return self.primary_dealer[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_1@3: - // modules/rbac.py:303 - // self.account_manager, role_address - bytec 12 // 0x52343023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:302-304 - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:305 - // return self.account_manager[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_0@2: - // modules/rbac.py:298-300 - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.count_due_coupons() -> uint64: -count_due_coupons: - // modules/core_financial/coupon.py:351 - // def count_due_coupons(self) -> UInt64: - proto 0 1 - // modules/core_financial/coupon.py:352 - // due_coupons = UInt64(0) - intc_0 // 0 - // modules/core_financial/coupon.py:353 - // current_ts = Global.latest_timestamp - global LatestTimestamp - dup - // modules/core_financial/coupon.py:354 - // if current_ts > self.issuance_date: - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - > - bz count_due_coupons_after_if_else@2 - // modules/core_financial/coupon.py:355 - // due_coupons = (current_ts - self.issuance_date) // self.coupon_period - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - frame_dig 1 - swap - - - intc_0 // 0 - bytec 17 // "coupon_period" - app_global_get_ex - assert // check self.coupon_period exists - / - frame_bury 0 - -count_due_coupons_after_if_else@2: - // modules/core_financial/coupon.py:356-357 - // # div-by-zero: coupon_period != 0 due to assert_time_periods checks - // return due_coupons - retsub - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.coupon_due_date(coupon: uint64) -> uint64: -coupon_due_date: - // modules/core_financial/coupon.py:359 - // def coupon_due_date(self, coupon: UInt64) -> UInt64: - proto 1 1 - // modules/core_financial/coupon.py:360 - // return self.issuance_date + coupon * self.coupon_period - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - intc_0 // 0 - bytec 17 // "coupon_period" - app_global_get_ex - assert // check self.coupon_period exists - frame_dig -1 - * - + - retsub - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.day_count_factor(due_coupons: uint64) -> bytes: -day_count_factor: - // modules/core_financial/coupon.py:376 - // def day_count_factor(self, due_coupons: UInt64) -> typ.DayCountFactor: - proto 1 1 - pushbytes "" - dup - // modules/core_financial/coupon.py:377-378 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // if not due_coupons: - frame_dig -1 - bnz day_count_factor_else_body@2 - // modules/core_financial/coupon.py:379 - // accruing_start_time = self.issuance_date - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - -day_count_factor_after_if_else@3: - // modules/core_financial/coupon.py:382 - // coupon_accrued_period = Global.latest_timestamp - accruing_start_time - global LatestTimestamp - swap - - - frame_bury 0 - // modules/core_financial/coupon.py:383 - // coupon_period = self.coupon_period - intc_0 // 0 - bytec 17 // "coupon_period" - app_global_get_ex - assert // check self.coupon_period exists - // modules/core_financial/coupon.py:384 - // if self.day_count_convention == UInt64(cst.DCC_A_A): - intc_0 // 0 - bytec 15 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - bnz day_count_factor_after_if_else@5 - // modules/core_financial/common.py:162 - // return time_period // UInt64(cst.DAY_2_SEC) - frame_dig 0 - intc 6 // 86400 - / - frame_bury 0 - intc 6 // 86400 - / - -day_count_factor_after_if_else@5: - // modules/core_financial/coupon.py:387-390 - // return typ.DayCountFactor( - // numerator=coupon_accrued_period, - // denominator=coupon_period, - // ) - frame_dig 0 - itob - swap - itob - concat - frame_bury 0 - retsub - -day_count_factor_else_body@2: - // modules/core_financial/coupon.py:363 - // coupon_due_date = UInt64() - intc_0 // 0 - frame_bury 1 - // modules/core_financial/coupon.py:364 - // if due_coupons >= UInt64(1): - frame_dig -1 - bz day_count_factor_after_if_else@8 - // modules/core_financial/coupon.py:365 - // coupon_due_date = self.coupon_due_date(due_coupons) - frame_dig -1 - callsub coupon_due_date - frame_bury 1 - -day_count_factor_after_if_else@8: - frame_dig 1 - b day_count_factor_after_if_else@3 - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.is_accruing_interest(_due_coupons: uint64) -> uint64: -is_accruing_interest: - // modules/core_financial/coupon.py:392 - // def is_accruing_interest(self, _due_coupons: UInt64) -> bool: - proto 1 1 - // modules/core_financial/coupon.py:393 - // return self.issuance_date != 0 and Global.latest_timestamp > self.issuance_date - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - bz is_accruing_interest_bool_false@3 - global LatestTimestamp - intc_0 // 0 - bytec_3 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - > - bz is_accruing_interest_bool_false@3 - intc_1 // 1 - retsub - -is_accruing_interest_bool_false@3: - intc_0 // 0 - // modules/core_financial/coupon.py:393 - // return self.issuance_date != 0 and Global.latest_timestamp > self.issuance_date - retsub - - -// modules.core_financial.coupon.PerpetualCouponCashflowMixin.accrued_interest_amount(holding_address: bytes, units: uint64, due_coupons: uint64) -> uint64: -accrued_interest_amount: - // modules/core_financial/coupon.py:395-397 - // def accrued_interest_amount( - // self, holding_address: Account, units: UInt64, due_coupons: UInt64 - // ) -> UInt64: - proto 3 1 - // modules/core_financial/coupon.py:398-399 - // # The following assert safeguards the subroutine from forbidden invocations - // self.assert_no_pending_coupon_payment(holding_address, due_coupons) - frame_dig -3 - frame_dig -1 - callsub assert_no_pending_coupon_payment - // modules/core_financial/coupon.py:400 - // day_count_factor = self.day_count_factor(due_coupons) - frame_dig -1 - callsub day_count_factor - // modules/core_financial/coupon.py:401 - // coupon_accrued_period = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - // modules/core_financial/coupon.py:402 - // coupon_period = day_count_factor.denominator - swap - intc_3 // 8 - extract_uint64 - // modules/core_financial/coupon.py:404 - // self.account_units_value(holding_address, units) - frame_dig -3 - frame_dig -2 - callsub account_units_value - // modules/core_financial/coupon.py:405 - // * self.interest_rate - intc_0 // 0 - bytec 5 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - // modules/core_financial/coupon.py:404-405 - // self.account_units_value(holding_address, units) - // * self.interest_rate - * - // modules/core_financial/coupon.py:404-406 - // self.account_units_value(holding_address, units) - // * self.interest_rate - // * coupon_accrued_period - uncover 2 - * - // modules/core_financial/coupon.py:407 - // // (cst.BPS * coupon_period) - intc 4 // 10000 - uncover 2 - * - // modules/core_financial/coupon.py:404-407 - // self.account_units_value(holding_address, units) - // * self.interest_rate - // * coupon_accrued_period - // // (cst.BPS * coupon_period) - / - // modules/core_financial/coupon.py:403-408 - // return ( - // self.account_units_value(holding_address, units) - // * self.interest_rate - // * coupon_accrued_period - // // (cst.BPS * coupon_period) - // ) # div-by-zero: coupon_period != 0 due to assert_time_periods checks - retsub - - -// modules.core_financial.coupon.CouponCashflowMixin.all_due_coupons_paid(due_coupons: uint64) -> uint64: -all_due_coupons_paid: - // modules/core_financial/coupon.py:26 - // def all_due_coupons_paid(self, due_coupons: UInt64) -> bool: - proto 1 1 - // modules/core_financial/coupon.py:27 - // return self.paid_coupon_units >= self.circulating_units * due_coupons - intc_0 // 0 - bytec 28 // "paid_coupon_units" - app_global_get_ex - assert // check self.paid_coupon_units exists - intc_0 // 0 - bytec 4 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - frame_dig -1 - * - >= - retsub - - -// modules.core_financial.coupon.CouponCashflowMixin.assert_no_pending_coupon_payment(holding_address: bytes, due_coupons: uint64) -> void: -assert_no_pending_coupon_payment: - // modules/core_financial/coupon.py:29-31 - // def assert_no_pending_coupon_payment( - // self, holding_address: Account, due_coupons: UInt64 - // ) -> None: - proto 2 0 - // modules/core_financial/coupon.py:33 - // self.account[holding_address].paid_coupons == due_coupons - bytec_1 // 0x52333023 - frame_dig -2 - concat - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - frame_dig -1 - == - // modules/core_financial/coupon.py:32-34 - // assert ( - // self.account[holding_address].paid_coupons == due_coupons - // ), err.PENDING_COUPON_PAYMENT - assert // Pending due coupon payment - retsub - - -// modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted(time_events: bytes) -> bytes: -assert_time_events_sorted: - // modules/core_financial/common.py:107 - // def assert_time_events_sorted(self, time_events: typ.TimeEvents) -> None: - proto 1 1 - pushbytes "" - dupn 2 - // modules/core_financial/common.py:109 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - frame_dig -1 - extract 2 0 - frame_dig -1 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:110 - // > Global.latest_timestamp - global LatestTimestamp - // modules/core_financial/common.py:109-110 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - // > Global.latest_timestamp - > - // modules/core_financial/common.py:108-111 - // assert ( - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - // > Global.latest_timestamp - // ), err.INVALID_TIME - assert // Time events must be set in the future - // modules/core_financial/common.py:112 - // for idx in urange(time_events.length - 1): - frame_dig -1 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_0 // 0 - -assert_time_events_sorted_for_header@1: - // modules/core_financial/common.py:112 - // for idx in urange(time_events.length - 1): - frame_dig 5 - frame_dig 4 - < - bz assert_time_events_sorted_after_for@6 - -assert_time_events_sorted_while_top@8: - pushint 75 - global OpcodeBudget - > - bz assert_time_events_sorted_after_while@13 - itxn_begin - pushint 6 // appl - itxn_field TypeEnum - pushint 5 // DeleteApplication - itxn_field OnCompletion - bytec 34 // 0x068101 - itxn_field ApprovalProgram - bytec 34 // 0x068101 - itxn_field ClearStateProgram - global MinTxnFee - itxn_field Fee - itxn_submit - b assert_time_events_sorted_while_top@8 - -assert_time_events_sorted_after_while@13: - // modules/core_financial/common.py:117 - // time_i = time_events[idx] - frame_dig 5 - dup - intc_3 // 8 - * - frame_dig 3 - dup - cover 3 - swap - extract_uint64 - dup - cover 3 - frame_bury 1 - // modules/core_financial/common.py:118 - // time_f = time_events[idx + 1] - intc_1 // 1 - + - dup - frame_bury 2 - intc_3 // 8 - * - extract_uint64 - dup - frame_bury 0 - // modules/core_financial/common.py:119 - // assert time_f > time_i, err.INVALID_SORTING - < - assert // Time events must be sorted in strictly ascending order - // modules/core_financial/common.py:120 - // if self.day_count_convention != UInt64(cst.DCC_CONT): - intc_0 // 0 - bytec 15 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - pushint 255 - != - bz assert_time_events_sorted_after_if_else@4 - // modules/core_financial/common.py:121-122 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - frame_dig 0 - frame_dig 1 - - - // modules/core_financial/common.py:121-124 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - // cst.DAY_2_SEC - // ) == 0, err.INVALID_TIME_PERIOD - intc 6 // 86400 - % - ! - assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds) - -assert_time_events_sorted_after_if_else@4: - frame_dig 2 - frame_bury 5 - b assert_time_events_sorted_for_header@1 - -assert_time_events_sorted_after_for@6: - frame_dig -1 - frame_bury 0 - retsub - - -// modules.accounting.AccountingModule.assert_is_not_account_suspended(holding_address: bytes) -> void: -assert_is_not_account_suspended: - // modules/accounting.py:33 - // def assert_is_not_account_suspended(self, holding_address: Account) -> None: - proto 1 0 - // modules/accounting.py:34 - // assert not self.account[holding_address].suspended, err.SUSPENDED - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - pushint 448 - getbit - ! - assert // Suspended operations - retsub - - -// modules.accounting.AccountingModule.account_units_value(holding_address: bytes, units: uint64) -> uint64: -account_units_value: - // modules/accounting.py:36 - // def account_units_value(self, holding_address: Account, units: UInt64) -> UInt64: - proto 2 1 - // modules/accounting.py:37 - // return units * self.account[holding_address].unit_value - bytec_1 // 0x52333023 - frame_dig -2 - concat - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - frame_dig -1 - * - retsub - - -// modules.accounting.AccountingModule.account_total_units_value(holding_address: bytes) -> uint64: -account_total_units_value: - // modules/accounting.py:39 - // def account_total_units_value(self, holding_address: Account) -> UInt64: - proto 1 1 - // modules/accounting.py:41 - // holding_address, self.account[holding_address].units - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - // modules/accounting.py:40-42 - // return self.account_units_value( - // holding_address, self.account[holding_address].units - // ) - frame_dig -1 - swap - callsub account_units_value - retsub - - -// modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: -_role_is_active: - // modules/rbac.py:57 - // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: - proto 2 1 - pushbytes "" - // modules/rbac.py:55 - // return role_address in role_map - frame_dig -2 - frame_dig -1 - concat - dup - box_len - bury 1 - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - bz _role_is_active_bool_false@4 - // modules/rbac.py:59 - // role_map[role_address].role_validity_start - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_0 // 0 - extract_uint64 - // modules/rbac.py:60 - // <= Global.latest_timestamp - global LatestTimestamp - dup - frame_bury 0 - // modules/rbac.py:59-60 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - <= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - // modules/rbac.py:61 - // <= role_map[role_address].role_validity_end - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_3 // 8 - extract_uint64 - // modules/rbac.py:60-61 - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - frame_dig 0 - >= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - intc_1 // 1 - -_role_is_active_bool_merge@5: - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - frame_bury 0 - retsub - -_role_is_active_bool_false@4: - intc_0 // 0 - b _role_is_active_bool_merge@5 - - -// modules.rbac.RbacModule.assert_caller_is_arranger() -> void: -assert_caller_is_arranger: - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - txn Sender - // modules/rbac.py:52 - // return role_address == self.arranger.value - intc_0 // 0 - bytec 6 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - == - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - assert // Not authorized - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_defaulted() -> void: -assert_is_not_asset_defaulted: - // modules/rbac.py:83 - // assert not self.asset_defaulted, err.DEFAULTED - intc_0 // 0 - bytec 23 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - ! - assert // Defaulted - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_suspended() -> void: -assert_is_not_asset_suspended: - // modules/rbac.py:86 - // assert not self.asset_suspended, err.SUSPENDED - intc_0 // 0 - bytec 22 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - ! - assert // Suspended operations - retsub - - -// modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: -_assert_valid_role: - // modules/rbac.py:88 - // def _assert_valid_role(self, role_id: UInt64) -> None: - proto 1 0 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - frame_dig -1 - // modules/rbac.py:90 - // UInt64(cst.ROLE_ARRANGER), - pushint 20 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:91 - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - pushint 40 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:92 - // UInt64(cst.ROLE_PRIMARY_DEALER), - pushint 50 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:93 - // UInt64(cst.ROLE_TRUSTEE), - pushint 60 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:94 - // UInt64(cst.ROLE_AUTHORITY), - pushint 70 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:95 - // UInt64(cst.ROLE_INTEREST_ORACLE), - pushint 80 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bz _assert_valid_role_bool_false@7 - -_assert_valid_role_bool_true@6: - intc_1 // 1 - -_assert_valid_role_bool_merge@8: - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - assert // Invalid role identifier - retsub - -_assert_valid_role_bool_false@7: - intc_0 // 0 - b _assert_valid_role_bool_merge@8 diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json deleted file mode 100644 index 8df11bb5..00000000 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json +++ /dev/null @@ -1,1985 +0,0 @@ -{ - "name": "PerpetualBond", - "structs": { - "AccountInfo": [ - { - "name": "payment_address", - "type": "address" - }, - { - "name": "units", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "paid_coupons", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - } - ], - "AssetInfo": [ - { - "name": "denomination_asset_id", - "type": "uint64" - }, - { - "name": "settlement_asset_id", - "type": "uint64" - }, - { - "name": "outstanding_principal", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "day_count_convention", - "type": "uint8" - }, - { - "name": "principal_discount", - "type": "uint16" - }, - { - "name": "interest_rate", - "type": "uint16" - }, - { - "name": "total_supply", - "type": "uint64" - }, - { - "name": "circulating_supply", - "type": "uint64" - }, - { - "name": "primary_distribution_opening_date", - "type": "uint64" - }, - { - "name": "primary_distribution_closure_date", - "type": "uint64" - }, - { - "name": "issuance_date", - "type": "uint64" - }, - { - "name": "maturity_date", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - }, - { - "name": "performance", - "type": "uint8" - } - ], - "AssetMetadata": [ - { - "name": "contract_type", - "type": "uint8" - }, - { - "name": "calendar", - "type": "uint8" - }, - { - "name": "business_day_convention", - "type": "uint8" - }, - { - "name": "end_of_month_convention", - "type": "uint8" - }, - { - "name": "prepayment_effect", - "type": "uint8" - }, - { - "name": "penalty_type", - "type": "uint8" - }, - { - "name": "prospectus_hash", - "type": "byte[32]" - }, - { - "name": "prospectus_url", - "type": "string" - } - ], - "CouponsInfo": [ - { - "name": "total_coupons", - "type": "uint64" - }, - { - "name": "due_coupons", - "type": "uint64" - }, - { - "name": "next_coupon_due_date", - "type": "uint64" - }, - { - "name": "day_count_factor", - "type": "DayCountFactor" - }, - { - "name": "all_due_coupons_paid", - "type": "bool" - } - ], - "CurrentUnitsValue": [ - { - "name": "units_value", - "type": "uint64" - }, - { - "name": "accrued_interest", - "type": "uint64" - }, - { - "name": "day_count_factor", - "type": "DayCountFactor" - } - ], - "DayCountFactor": [ - { - "name": "numerator", - "type": "uint64" - }, - { - "name": "denominator", - "type": "uint64" - } - ], - "PaymentAmounts": [ - { - "name": "interest", - "type": "uint64" - }, - { - "name": "principal", - "type": "uint64" - } - ], - "PaymentResult": [ - { - "name": "amount", - "type": "uint64" - }, - { - "name": "timestamp", - "type": "uint64" - }, - { - "name": "context", - "type": "byte[]" - } - ], - "RoleConfig": [ - { - "name": "role_validity_start", - "type": "uint64" - }, - { - "name": "role_validity_end", - "type": "uint64" - } - ], - "SecondaryMarketSchedule": [ - { - "name": "secondary_market_opening_date", - "type": "uint64" - }, - { - "name": "secondary_market_closure_date", - "type": "uint64" - } - ] - }, - "methods": [ - { - "name": "asset_config", - "args": [ - { - "type": "uint64", - "name": "denomination_asset_id", - "desc": "Denomination asset identifier" - }, - { - "type": "uint64", - "name": "settlement_asset_id", - "desc": "Settlement asset identifier" - }, - { - "type": "uint64", - "name": "principal", - "desc": "Principal, expressed in denomination asset" - }, - { - "type": "uint64", - "name": "principal_discount", - "desc": "Principal discount in bps" - }, - { - "type": "uint64", - "name": "minimum_denomination", - "desc": "Minimum denomination, expressed in denomination asset" - }, - { - "type": "uint8", - "name": "day_count_convention", - "desc": "Day-count convention for interests calculation" - }, - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rate in bps" - }, - { - "type": "uint16[]", - "name": "coupon_rates", - "desc": "Coupon interest rates in bps" - }, - { - "type": "uint64[]", - "name": "time_events", - "desc": "Time events (strictly ascending order)" - }, - { - "type": "(uint64,uint64)[]", - "name": "time_periods", - "desc": "Time periods of recurring time events" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Configure the Debt Algorand Standard Application", - "events": [], - "recommendations": {} - }, - { - "name": "update_interest_rate", - "args": [ - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rate in bps" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the update" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Update variable interest rates in bps", - "events": [], - "recommendations": {} - }, - { - "name": "get_account_units_current_value", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Account's units for the current value calculation" - } - ], - "returns": { - "type": "(uint64,uint64,(uint64,uint64))", - "struct": "CurrentUnitsValue", - "desc": "Units current value in denomination asset, Accrued interest in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account's units current value and accrued interest", - "events": [], - "recommendations": {} - }, - { - "name": "get_payment_amount", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "PaymentAmounts", - "desc": "Interest amount in denomination asset, Principal amount in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get the next payment amount", - "events": [], - "recommendations": {} - }, - { - "name": "get_coupons_status", - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,(uint64,uint64),bool)", - "struct": "CouponsInfo", - "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA coupons status", - "events": [], - "recommendations": {} - }, - { - "name": "get_time_periods", - "args": [], - "returns": { - "type": "(uint64,uint64)[]", - "desc": "Time periods" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA time periods", - "events": [], - "recommendations": {} - }, - { - "name": "pay_coupon", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "returns": { - "type": "(uint64,uint64,byte[])", - "struct": "PaymentResult", - "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Pay due coupon to an account", - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "recommendations": {} - }, - { - "name": "asset_transfer", - "args": [ - { - "type": "address", - "name": "sender_holding_address", - "desc": "Sender Account Holding Address" - }, - { - "type": "address", - "name": "receiver_holding_address", - "desc": "Receiver Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to transfer" - } - ], - "returns": { - "type": "uint64", - "desc": "Transferred actualized value in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Transfer D-ASA units between accounts", - "events": [], - "recommendations": {} - }, - { - "name": "asset_create", - "args": [ - { - "type": "address", - "name": "arranger", - "desc": "D-ASA Arranger Address" - }, - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "name": "metadata", - "desc": "D-ASA metadata" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [ - "NoOp" - ], - "call": [] - }, - "readonly": false, - "desc": "Create a new D-ASA", - "events": [], - "recommendations": {} - }, - { - "name": "asset_update", - "args": [ - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "name": "metadata" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "UpdateApplication" - ] - }, - "readonly": false, - "desc": "Update D-ASA application.", - "events": [], - "recommendations": {} - }, - { - "name": "set_secondary_time_events", - "args": [ - { - "type": "uint64[]", - "name": "secondary_market_time_events", - "desc": "Secondary market time events (strictly ascending order)" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "SecondaryMarketSchedule", - "desc": "Secondary Market Opening Date, Secondary Market Closure Date" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set secondary market time schedule", - "events": [], - "recommendations": {} - }, - { - "name": "set_default_status", - "args": [ - { - "type": "bool", - "name": "defaulted", - "desc": "Default status" - } - ], - "returns": { - "type": "uint64" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set D-ASA default status", - "events": [], - "recommendations": {} - }, - { - "name": "primary_distribution", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to distribute" - } - ], - "returns": { - "type": "uint64", - "desc": "Remaining D-ASA units to be distributed" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Distribute D-ASA units to accounts according the primary market", - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_info", - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "struct": "AssetInfo", - "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA info", - "events": [], - "recommendations": {} - }, - { - "name": "get_time_events", - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Time events" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA time events", - "events": [], - "recommendations": {} - }, - { - "name": "get_secondary_market_schedule", - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Secondary market schedule" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get secondary market schedule", - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_metadata", - "args": [], - "returns": { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA metadata", - "events": [], - "recommendations": {} - }, - { - "name": "account_gov_suspension", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set account suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set account suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "account_open", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account opening" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Open D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_close", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "desc": "Closed units, Timestamp of the account closing" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Close D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_update_payment_address", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account update" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Update the Payment Address of an account", - "events": [], - "recommendations": {} - }, - { - "name": "account_get_info", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(address,uint64,uint64,uint64,bool)", - "struct": "AccountInfo", - "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account info", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_rotate_arranger", - "args": [ - { - "type": "address", - "name": "new_arranger", - "desc": "New Arranger address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Rotate the Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_set_op_daemon", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Operation Daemon address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Non-Normative: Set the Operation Daemon address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_assign_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Assign a role to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_revoke_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role revocation" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Revoke a role from an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_gov_asset_suspension", - "args": [ - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set asset suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set asset suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_arranger", - "args": [], - "returns": { - "type": "address", - "desc": "Arranger address" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_address_roles", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Address to get roles for" - } - ], - "returns": { - "type": "(bool,bool,bool,bool,bool)", - "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Non-normative - Get roles assigned to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_role_config", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "RoleConfig", - "desc": "Role configuration" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get role configuration", - "events": [], - "recommendations": {} - } - ], - "arcs": [ - 22, - 28 - ], - "networks": {}, - "state": { - "schema": { - "global": { - "ints": 20, - "bytes": 3 - }, - "local": { - "ints": 0, - "bytes": 0 - } - }, - "keys": { - "global": { - "arranger": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjIwIw==" - }, - "op_daemon": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjI1Iw==" - }, - "asset_suspended": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfc3VzcGVuZGVk" - }, - "asset_defaulted": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfZGVmYXVsdGVk" - }, - "total_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfdW5pdHM=" - }, - "circulating_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "Y2lyY3VsYXRpbmdfdW5pdHM=" - }, - "unit_value": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dW5pdF92YWx1ZQ==" - }, - "status": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c3RhdHVz" - }, - "denomination_asset_id": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk" - }, - "settlement_asset_id": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2V0dGxlbWVudF9hc3NldF9pZA==" - }, - "day_count_convention": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=" - }, - "metadata": { - "keyType": "AVMString", - "valueType": "AVMBytes", - "key": "bWV0YWRhdGE=" - }, - "principal_discount": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbmNpcGFsX2Rpc2NvdW50" - }, - "interest_rate": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "aW50ZXJlc3RfcmF0ZQ==" - }, - "total_coupons": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfY291cG9ucw==" - }, - "primary_distribution_opening_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl" - }, - "primary_distribution_closure_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl" - }, - "issuance_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "aXNzdWFuY2VfZGF0ZQ==" - }, - "secondary_market_opening_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=" - }, - "secondary_market_closure_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=" - }, - "maturity_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "bWF0dXJpdHlfZGF0ZQ==" - }, - "paid_coupon_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cGFpZF9jb3Vwb25fdW5pdHM=" - }, - "coupon_period": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "Y291cG9uX3BlcmlvZA==" - } - }, - "local": {}, - "box": { - "time_events": { - "keyType": "AVMBytes", - "valueType": "uint64[]", - "key": "dGltZUV2ZW50cw==" - }, - "time_periods": { - "keyType": "AVMBytes", - "valueType": "(uint64,uint64)[]", - "key": "dGltZVBlcmlvZHM=" - } - } - }, - "maps": { - "global": {}, - "local": {}, - "box": { - "account_manager": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjQwIw==" - }, - "primary_dealer": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjUwIw==" - }, - "trustee": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjYwIw==" - }, - "authority": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjcwIw==" - }, - "interest_oracle": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjgwIw==" - }, - "account": { - "keyType": "address", - "valueType": "AccountInfo", - "prefix": "UjMwIw==" - } - } - } - }, - "bareActions": { - "create": [], - "call": [] - }, - "sourceInfo": { - "approval": { - "sourceInfo": [ - { - "pc": [ - 2626 - ], - "errorMessage": "Can not distribute zero units" - }, - { - "pc": [ - 1106 - ], - "errorMessage": "Coupon rates are not properly defined" - }, - { - "pc": [ - 990 - ], - "errorMessage": "D-ASA already configured" - }, - { - "pc": [ - 4367 - ], - "errorMessage": "Defaulted" - }, - { - "pc": [ - 997 - ], - "errorMessage": "Denomination asset is not properly set" - }, - { - "pc": [ - 1008 - ], - "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" - }, - { - "pc": [ - 2643 - ], - "errorMessage": "Insufficient remaining D-ASA units" - }, - { - "pc": [ - 2112, - 2207 - ], - "errorMessage": "Insufficient sender units to transfer" - }, - { - "pc": [ - 1096 - ], - "errorMessage": "Interest rate is not properly defined" - }, - { - "pc": [ - 1308, - 1435, - 1640, - 2066, - 2081, - 2616, - 3001, - 3072, - 3124, - 3204, - 3233 - ], - "errorMessage": "Invalid account holding address" - }, - { - "pc": [ - 3375, - 3399, - 3423, - 3447, - 3471, - 3528, - 3556, - 3578, - 3600, - 3622, - 3801, - 3819, - 3834, - 3849, - 3864 - ], - "errorMessage": "Invalid account role address" - }, - { - "pc": [ - 1326 - ], - "errorMessage": "Invalid amount of units for the account" - }, - { - "pc": [ - 1075 - ], - "errorMessage": "Invalid day-count convention ID" - }, - { - "pc": [ - 3512, - 3791, - 4429 - ], - "errorMessage": "Invalid role identifier" - }, - { - "pc": [ - 2487 - ], - "errorMessage": "Invalid secondary market closure date" - }, - { - "pc": [ - 2453 - ], - "errorMessage": "Invalid secondary market opening date" - }, - { - "pc": [ - 1041 - ], - "errorMessage": "Minimum denomination is not a divisor of principal" - }, - { - "pc": [ - 1649 - ], - "errorMessage": "No D-ASA units" - }, - { - "pc": [ - 1663 - ], - "errorMessage": "No due coupon to pay" - }, - { - "pc": [ - 1227, - 1622, - 1724, - 2048, - 2417, - 2530, - 2607, - 2992, - 3047, - 3056, - 3113, - 3189, - 3645, - 4359 - ], - "errorMessage": "Not authorized" - }, - { - "pc": [ - 1778 - ], - "errorMessage": "Not enough funds for the payment" - }, - { - "pc": [ - 1240, - 1667, - 4114 - ], - "errorMessage": "Pending due coupon payment" - }, - { - "pc": [ - 2599 - ], - "errorMessage": "Primary distribution is closed" - }, - { - "pc": [ - 1297 - ], - "errorMessage": "Primary distribution not yet executed" - }, - { - "pc": [ - 2039 - ], - "errorMessage": "Secondary market is closed" - }, - { - "pc": [ - 2097 - ], - "errorMessage": "Sender and receiver must be different" - }, - { - "pc": [ - 2162 - ], - "errorMessage": "Sender and receiver units are not fungible" - }, - { - "pc": [ - 4263, - 4375 - ], - "errorMessage": "Suspended operations" - }, - { - "pc": [ - 1118, - 2422 - ], - "errorMessage": "Time events length is invalid" - }, - { - "pc": [ - 4136 - ], - "errorMessage": "Time events must be set in the future" - }, - { - "pc": [ - 4214 - ], - "errorMessage": "Time events must be sorted in strictly ascending order" - }, - { - "pc": [ - 1177 - ], - "errorMessage": "Time period durations must be strictly greater than zero" - }, - { - "pc": [ - 1179 - ], - "errorMessage": "Time period repetitions are not properly defined" - }, - { - "pc": [ - 1163 - ], - "errorMessage": "Time periods are not properly defined" - }, - { - "pc": [ - 4236 - ], - "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" - }, - { - "pc": [ - 2101 - ], - "errorMessage": "Transfer units must be greater than zero" - }, - { - "pc": [ - 587 - ], - "errorMessage": "Wrong Global Bytes allocation" - }, - { - "pc": [ - 593 - ], - "errorMessage": "Wrong Global UInts allocation" - }, - { - "pc": [ - 597 - ], - "errorMessage": "Wrong Local Bytes allocation" - }, - { - "pc": [ - 601 - ], - "errorMessage": "Wrong Local UInts allocation" - }, - { - "pc": [ - 1771 - ], - "errorMessage": "account opted into asset" - }, - { - "pc": [ - 1845 - ], - "errorMessage": "asset exists" - }, - { - "pc": [ - 4319, - 4334 - ], - "errorMessage": "check BoxMap entry exists" - }, - { - "pc": [ - 1316, - 1655, - 1715, - 1728, - 1747, - 1782, - 1810, - 2105, - 2119, - 2128, - 2135, - 2146, - 2153, - 2167, - 2202, - 2244, - 2288, - 2652, - 4107, - 4257, - 4273, - 4289 - ], - "errorMessage": "check self.account entry exists" - }, - { - "pc": [ - 3663, - 4357 - ], - "errorMessage": "check self.arranger exists" - }, - { - "pc": [ - 2726, - 4365 - ], - "errorMessage": "check self.asset_defaulted exists" - }, - { - "pc": [ - 2828, - 4373 - ], - "errorMessage": "check self.asset_suspended exists" - }, - { - "pc": [ - 1850, - 2631, - 2748, - 3139, - 4093 - ], - "errorMessage": "check self.circulating_units exists" - }, - { - "pc": [ - 3918, - 3934, - 3965 - ], - "errorMessage": "check self.coupon_period exists" - }, - { - "pc": [ - 2760, - 3970, - 4219 - ], - "errorMessage": "check self.day_count_convention exists" - }, - { - "pc": [ - 1841, - 2738 - ], - "errorMessage": "check self.denomination_asset_id exists" - }, - { - "pc": [ - 1443, - 1675, - 2789, - 4069 - ], - "errorMessage": "check self.interest_rate exists" - }, - { - "pc": [ - 2437, - 2818, - 3901, - 3909, - 3929, - 3954, - 4019, - 4028 - ], - "errorMessage": "check self.issuance_date exists" - }, - { - "pc": [ - 2462, - 2470, - 2709, - 2823 - ], - "errorMessage": "check self.maturity_date exists" - }, - { - "pc": [ - 2960 - ], - "errorMessage": "check self.metadata exists" - }, - { - "pc": [ - 1684, - 1697 - ], - "errorMessage": "check self.op_daemon exists" - }, - { - "pc": [ - 1825, - 4088 - ], - "errorMessage": "check self.paid_coupon_units exists" - }, - { - "pc": [ - 2591, - 2814 - ], - "errorMessage": "check self.primary_distribution_closure_date exists" - }, - { - "pc": [ - 1281, - 1291, - 2577, - 2809 - ], - "errorMessage": "check self.primary_distribution_opening_date exists" - }, - { - "pc": [ - 1090, - 2774 - ], - "errorMessage": "check self.principal_discount exists" - }, - { - "pc": [ - 2023, - 2033, - 2501, - 2938 - ], - "errorMessage": "check self.secondary_market_closure_date exists" - }, - { - "pc": [ - 2012, - 2496, - 2933 - ], - "errorMessage": "check self.secondary_market_opening_date exists" - }, - { - "pc": [ - 1736, - 1765, - 2743 - ], - "errorMessage": "check self.settlement_asset_id exists" - }, - { - "pc": [ - 988, - 1465, - 1567, - 1618, - 2001, - 2412, - 2566, - 2908, - 3051 - ], - "errorMessage": "check self.status exists" - }, - { - "pc": [ - 2921 - ], - "errorMessage": "check self.time_events exists" - }, - { - "pc": [ - 1580 - ], - "errorMessage": "check self.time_periods exists" - }, - { - "pc": [ - 1523 - ], - "errorMessage": "check self.total_coupons exists" - }, - { - "pc": [ - 2639, - 2682, - 2804 - ], - "errorMessage": "check self.total_units exists" - }, - { - "pc": [ - 1855, - 2669, - 2753 - ], - "errorMessage": "check self.unit_value exists" - }, - { - "pc": [ - 925, - 947, - 968, - 1602, - 2333, - 2372, - 2394, - 2474, - 3313, - 4140 - ], - "errorMessage": "invalid array length header" - }, - { - "pc": [ - 2520, - 2982, - 3635 - ], - "errorMessage": "invalid number of bytes for arc4.bool" - }, - { - "pc": [ - 938 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1610, - 3321 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 981 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array>" - }, - { - "pc": [ - 959, - 2405 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1267, - 1427, - 1596, - 1980, - 1988, - 2310, - 2553, - 2974, - 3031, - 3039, - 3105, - 3175, - 3183, - 3225, - 3249, - 3273, - 3307, - 3495, - 3677, - 3761 - ], - "errorMessage": "invalid number of bytes for arc4.static_array" - }, - { - "pc": [ - 919, - 1219 - ], - "errorMessage": "invalid number of bytes for arc4.uint16" - }, - { - "pc": [ - 863, - 872, - 881, - 890, - 899, - 1275, - 1996, - 2561 - ], - "errorMessage": "invalid number of bytes for arc4.uint64" - }, - { - "pc": [ - 908, - 3297, - 3485, - 3751 - ], - "errorMessage": "invalid number of bytes for arc4.uint8" - }, - { - "pc": [ - 2338, - 2377 - ], - "errorMessage": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata" - }, - { - "pc": [ - 2325, - 2364 - ], - "errorMessage": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))" - }, - { - "pc": [ - 2320, - 2359 - ], - "errorMessage": "invalid tuple encoding" - }, - { - "pc": [ - 2766, - 2781, - 2796, - 2836 - ], - "errorMessage": "overflow" - } - ], - "pcOffsetMethod": "none" - }, - "clear": { - "sourceInfo": [], - "pcOffsetMethod": "none" - } - }, - "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgOCAxMDAwMCAyMDAgODY0MDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzMzMDIzICJzdGF0dXMiICJpc3N1YW5jZV9kYXRlIiAiY2lyY3VsYXRpbmdfdW5pdHMiICJpbnRlcmVzdF9yYXRlIiAweDUyMzIzMDIzICJ1bml0X3ZhbHVlIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJtYXR1cml0eV9kYXRlIiAweDUyMzczMDIzIDB4NTIzNDMwMjMgInRvdGFsX3VuaXRzIiAic2V0dGxlbWVudF9hc3NldF9pZCIgImRheV9jb3VudF9jb252ZW50aW9uIiAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiICJjb3Vwb25fcGVyaW9kIiAweDUyMzgzMDIzIDB4NTIzNjMwMjMgMHg1MjM1MzAyMyAweDUyMzIzNTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtZXRhZGF0YSIgInByaW5jaXBhbF9kaXNjb3VudCIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgInBhaWRfY291cG9uX3VuaXRzIiAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMgMHgwMCAidG90YWxfY291cG9ucyIgMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MyAweDAwMDAgMHgwNjgxMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMC0zMQogICAgLy8gIyBSQkFDIFJvbGVzCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDYgLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgMjEgLy8gMHg1MjMyMzUyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIEQtQVNBIEdvdmVybmFuY2UKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDIyIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0OQogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBGYWxzZQogICAgYnl0ZWMgMjMgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjIKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVubS5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxLTMyCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgMjQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE0IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzctMzgKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MC00MQogICAgLy8gIyBQcmluY2lwYWwgLyBSYXRlcwogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjYgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9jb3Vwb25zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjUxCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MgogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMzNwogICAgLy8gc2VsZi5jb3Vwb25fcGVyaW9kID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAyMAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNS0yOAogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBQQk5Db3JlTWl4aW4sCiAgICAvLyAgICAgUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBOb1ByaW5jaXBhbFBheW1lbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4MjVkYmE5NWIgLy8gbWV0aG9kICJhc3NldF91cGRhdGUoKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE1LTI4CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIFBCTkNvcmVNaXhpbiwKICAgIC8vICAgICBQZXJwZXR1YWxDb3Vwb25DYXNoZmxvd01peGluLAogICAgLy8gICAgIE5vUHJpbmNpcGFsUGF5bWVudE1peGluLAogICAgLy8gICAgIENvdXBvblBheW1lbnRBZ2VudE1peGluLAogICAgLy8gICAgIENvdXBvblRyYW5zZmVyQWdlbnRNaXhpbiwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDM2CiAgICBwdXNoYnl0ZXNzIDB4ODk0NzQxMzQgMHg5MzE2Mjk4ZCAweDQ0MzYzZDQ5IDB4NjdkYjRmMjAgMHhmNmE5NmM4ZCAweDIyOWI3MDZmIDB4OGNmMTRiNTEgMHg0ZmQ2YTNjYyAweDFkNmZjMjU1IDB4MjVlOTk5N2YgMHg2Yzg1ZTNlZSAweDQwMmRiYTQ3IDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IDB4ZGMwNjNiMzUgMHgxNGZjMTBlZiAweDRjMTEzZWQ1IDB4NzRhNzI5N2YgMHgxMDVjMTg0ZSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAidXBkYXRlX2ludGVyZXN0X3JhdGUodWludDE2KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldF9jb3Vwb25zX3N0YXR1cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfcGVyaW9kcygpKHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgInBheV9jb3Vwb24oYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jb25maWcgdXBkYXRlX2ludGVyZXN0X3JhdGUgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSBnZXRfcGF5bWVudF9hbW91bnQgZ2V0X2NvdXBvbnNfc3RhdHVzIGdldF90aW1lX3BlcmlvZHMgcGF5X2NvdXBvbiBhc3NldF90cmFuc2ZlciBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzIHNldF9kZWZhdWx0X3N0YXR1cyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbiBnZXRfYXNzZXRfaW5mbyBnZXRfdGltZV9ldmVudHMgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUgZ2V0X2Fzc2V0X21ldGFkYXRhIGFjY291bnRfZ292X3N1c3BlbnNpb24gYWNjb3VudF9vcGVuIGFjY291bnRfY2xvc2UgYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X2luZm8gcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV9jb25maWcKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNS0yOAogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBQQk5Db3JlTWl4aW4sCiAgICAvLyAgICAgUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBOb1ByaW5jaXBhbFBheW1lbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4M2YwZWZjNmMgLy8gbWV0aG9kICJhc3NldF9jcmVhdGUoYWRkcmVzcywodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYXNzZXRfY3JlYXRlCiAgICBlcnIKCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGFzc2V0X3VwZGF0ZQoKCi8vIG1vZHVsZXMuYWN0dXMucGJuLlBCTkNvcmVNaXhpbi5hc3NldF9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBjb3ZlciA3CiAgICBsZW4KICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MTYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDE2PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBjb3ZlciA3CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDgKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAxNgogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx0dXBsZTx1aW50NjQsdWludDY0Pj4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gZW51bXMuU1RBVFVTX0lOQUNUSVZFLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU1LTU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDUKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU3CiAgICAvLyBhc3NlcnQgZXhpc3RzLCBlcnIuSU5WQUxJRF9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBEZW5vbWluYXRpb24gYXNzZXQgaXMgbm90IHByb3Blcmx5IHNldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAyNCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo2NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZGlnIDQKICAgIHVuY292ZXIgNgogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjYzLTY2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjkKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE0IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIzOC0yMzkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCBwcmluY2lwYWwgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbiA9PSAwLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgZGlnIDMKICAgIGRpZyAyCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24KICAgIGJ5dGVjIDcgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbCAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNDIKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gcHJpbmNpcGFsX2Rpc2NvdW50CiAgICBieXRlYyAyNiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ0LTI0NQogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjgyCiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzktODMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo4NgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxNSAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0OC0yNDkKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5hc191aW50NjQoKSkKICAgIGRpZyA2CiAgICBidG9pCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojg5LTkwCiAgICAvLyAjIFRoaXMgc3Vicm91dGluZSBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIHByaW5jaXBhbCBkaXNjb3VudCBoYXMgYmVlbiBzZXQKICAgIC8vIGlmIG5vdCBzZWxmLnByaW5jaXBhbF9kaXNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo5MQogICAgLy8gYXNzZXJ0IGludGVyZXN0X3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGRpZyA3CiAgICBhc3NlcnQgLy8gSW50ZXJlc3QgcmF0ZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojk0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGRpZyA1CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDAKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9jb3Vwb25zIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToxOAogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIDMKICAgIHB1c2hpbnQgMwogICAgKwogICAgZGlnIDQKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToxNi0xOQogICAgLy8gIyBQQk4gaGFzIG5vIG1hdHVyaXR5IGRhdGUgaW4gdGhlIHN0YXRpYyBzY2hlZHVsZQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgMwogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI1OAogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzKQogICAgZGlnIDQKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjIKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDMyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMzIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjIzLTI1CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdCiAgICBkdXAKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjIzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjMtMjUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToyNi0yOAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXQogICAgZHVwCiAgICBwdXNoaW50IDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAyNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjYtMjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToyOQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLklTU1VBTkNFX0RBVEVfSURYXQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0MC0zNDEKICAgIC8vICMgVGhlIHBlcnBldHVhbCBib25kIGRlZmluZXMgYSBzaW5nbGUgdGltZSBwZXJpb2QgZm9yIHRoZSBjb3Vwb24gZHVyYXRpb24gd2l0aCB1bmxpbWl0ZWQgcmVwZXRpdGlvbnMKICAgIC8vIGFzc2VydCB0aW1lX3BlcmlvZHMubGVuZ3RoID09IFVJbnQ2NCgxKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzQyCiAgICAvLyBjb3Vwb25fcGVyaW9kX2R1cmF0aW9uID0gdGltZV9wZXJpb2RzWzBdWzBdCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDIgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0NAogICAgLy8gYXNzZXJ0IGNvdXBvbl9wZXJpb2RfZHVyYXRpb24gPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1RJTUVfUEVSSU9EX0RVUkFUSU9OCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2QgZHVyYXRpb25zIG11c3QgYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0NQogICAgLy8gYXNzZXJ0IHJlcGV0aXRpb25zID09IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RfUkVQRVRJVElPTlMKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZCByZXBldGl0aW9ucyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0OAogICAgLy8gc2VsZi50aW1lX3BlcmlvZHMudmFsdWUgPSB0aW1lX3BlcmlvZHMuY29weSgpCiAgICBieXRlYyAyOSAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjkgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNDkKICAgIC8vIHNlbGYuY291cG9uX3BlcmlvZCA9IHNlbGYudGltZV9wZXJpb2RzLnZhbHVlWzBdWzBdCiAgICBieXRlYyAyOSAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIHB1c2hpbnRzIDIgMTYKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLmFjdHVzLnBibi5QQk5Db3JlTWl4aW4udXBkYXRlX2ludGVyZXN0X3JhdGVbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVfaW50ZXJlc3RfcmF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDE2CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDE4IC8vIDB4NTIzODMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjEwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToxMDgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MTA5CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MTEwCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucyksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjExMi0xMTMKICAgIC8vICMgVXBkYXRlIGludGVyZXN0IHJhdGUKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIGJ5dGVjIDUgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MTE0CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5QZXJwZXR1YWxDb3Vwb25DYXNoZmxvd01peGluLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MzgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQzOC00MzkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MzkKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDM4LTQzOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQzNy00NDAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDQyCiAgICAvLyBhc3NlcnQgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuSU5WQUxJRF9VTklUUwogICAgZHVwCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAOAogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NDIKICAgIC8vIGFzc2VydCAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NDQtNDQ1CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbgogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlID0gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBkaWcgMQogICAgZHVwCiAgICBkaWcgMgogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0Ni00NDcKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0OAogICAgLy8gbnVtZXJhdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0OQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDUxLTQ1MgogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTQKICAgIC8vIGlmIHNlbGYuaXNfYWNjcnVpbmdfaW50ZXJlc3QoZHVlX2NvdXBvbnMpOgogICAgY2FsbHN1YiBpc19hY2NydWluZ19pbnRlcmVzdAogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTUKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ1Ni00NTgKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMsIGR1ZV9jb3Vwb25zCiAgICAvLyApCiAgICBkaWcgMwogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTkKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NjAKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDUKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ2NS00NjgKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1udW1lcmF0b3IsCiAgICAvLyAgICAgZGVub21pbmF0b3I9ZGVub21pbmF0b3IsCiAgICAvLyApLAogICAgZGlnIDIKICAgIGl0b2IKICAgIGRpZyA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ2Mi00NjkKICAgIC8vIHJldHVybiB0eXAuQ3VycmVudFVuaXRzVmFsdWUoCiAgICAvLyAgICAgdW5pdHNfdmFsdWU9YWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9YWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPW51bWVyYXRvciwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9ZGVub21pbmF0b3IsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGRpZyA3CiAgICBpdG9iCiAgICBkaWcgNwogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA5CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfcGF5bWVudF9hbW91bnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfcGF5bWVudF9hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDg3CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0ODgKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDg3LTQ4OAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0ODkKICAgIC8vIC8vIGNzdC5CUFMKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDg3LTQ4OQogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAvLyBjc3QuQlBTCiAgICAvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0OTEtNDk0CiAgICAvLyByZXR1cm4gdHlwLlBheW1lbnRBbW91bnRzKAogICAgLy8gICAgIGludGVyZXN0PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDkzCiAgICAvLyBwcmluY2lwYWw9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ5MS00OTQKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfY291cG9uc19zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfY291cG9uc19zdGF0dXM6CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDUKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpIGVsc2UgVUludDY0KCkKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c190ZXJuYXJ5X2ZhbHNlQDMKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGJ1cnkgMwoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfbWVyZ2VANDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM2OQogICAgLy8gcmV0dXJuIHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zICsgMSkKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgYnVyeSAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDcKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkID0gc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucykKICAgIGR1cAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDgKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDkKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUxMAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTEKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBkaWcgMgogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTIKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTMKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDQKCmdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTUKICAgIC8vIHRvdGFsX2NvdXBvbnM9c2VsZi50b3RhbF9jb3Vwb25zLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTgtNTIxCiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWRlbm9taW5hdG9yLAogICAgLy8gKSwKICAgIGRpZyAxCiAgICBpdG9iCiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTQtNTIzCiAgICAvLyByZXR1cm4gdHlwLkNvdXBvbnNJbmZvKAogICAgLy8gICAgIHRvdGFsX2NvdXBvbnM9c2VsZi50b3RhbF9jb3Vwb25zLAogICAgLy8gICAgIGR1ZV9jb3Vwb25zPWR1ZV9jb3Vwb25zLAogICAgLy8gICAgIG5leHRfY291cG9uX2R1ZV9kYXRlPW5leHRfY291cG9uX2R1ZV9kYXRlLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICAgICApLAogICAgLy8gICAgIGFsbF9kdWVfY291cG9uc19wYWlkPWFsbF9kdWVfY291cG9uc19wYWlkLAogICAgLy8gKQogICAgc3dhcAogICAgaXRvYgogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAzMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDcKICAgIHNldGJpdAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUwNQogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkgaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkgZWxzZSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMwogICAgYiBnZXRfY291cG9uc19zdGF0dXNfdGVybmFyeV9tZXJnZUA0CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfdGltZV9wZXJpb2RzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3RpbWVfcGVyaW9kczoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUzMwogICAgLy8gdGltZV9wZXJpb2RzID0gdHlwLlRpbWVQZXJpb2RzKCkKICAgIGJ5dGVjIDMzIC8vIDB4MDAwMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MzQKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUzNQogICAgLy8gdGltZV9wZXJpb2RzID0gc2VsZi50aW1lX3BlcmlvZHMudmFsdWUuY29weSgpCiAgICBieXRlYyAyOSAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9wZXJpb2RzIGV4aXN0cwoKZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuY291cG9uLkNvdXBvblBheW1lbnRBZ2VudE1peGluLnBheV9jb3Vwb25bcm91dGluZ10oKSAtPiB2b2lkOgpwYXlfY291cG9uOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOQogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDQKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ1CiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDcKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0OAogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDkKICAgIC8vIGFzc2VydCBkdWVfY291cG9ucyA+IGFjY291bnRfcGFpZF9jb3Vwb25zLCBlcnIuTk9fRFVFX0NPVVBPTgogICAgc3dhcAogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBObyBkdWUgY291cG9uIHRvIHBheQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NTAtNTMKICAgIC8vICMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHZlcmlmeSBpZiBvdGhlciBhY2NvdW50cyBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHBheW1lbnQgb2YgcHJldmlvdXMgY291cG9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQxNAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksIFVJbnQ2NCgxKQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNzQKICAgIC8vIHJldHVybiBwcmluY2lwYWxfYW1vdW50ICogc2VsZi5pbnRlcmVzdF9yYXRlIC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAqCiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTMKICAgIC8vIGlmIHNlbGYub3BfZGFlbW9uLnZhbHVlICE9IEdsb2JhbC56ZXJvX2FkZHJlc3M6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gMHg1MjMyMzUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IHBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogcGF5X2NvdXBvbl9ib29sX3RydWVAMTkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTYKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTUtMTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IHBheV9jb3Vwb25fYm9vbF90cnVlQDE5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE3CiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE1LTE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IHBheV9jb3Vwb25fYm9vbF9mYWxzZUAyMAoKcGF5X2NvdXBvbl9ib29sX3RydWVAMTk6CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNC0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjItMjQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyLTI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDI3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI1CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICBibnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDI3CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDI4OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo1NwogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzAKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjMwLTMxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI5LTMyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NjAtNjEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNS00MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzkKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo2MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zICs9IDEKICAgIGRpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo2NAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGRpZyAyCiAgICArCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNwogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjAKICAgIC8vIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjIyCiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjMKICAgIC8vIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjQKICAgIC8vIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfSVApLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIklQIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLCAgIyBUT0RPOiBBZGQgaW50ZXJlc3QgcmF0ZQogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDA4MDAzNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9JUCksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToyNgogICAgLy8gbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfSVApLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIklQIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLCAgIyBUT0RPOiBBZGQgaW50ZXJlc3QgcmF0ZQogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI0OTUwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX0lQKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4OGMyOTkwNGUgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo3MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo2OC03MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcGF5X2NvdXBvbl9lbHNlX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NjMtNjQKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKICAgIGIgcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDQKCnBheV9jb3Vwb25fYm9vbF9mYWxzZUAyNzoKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9jb3Vwb25fYm9vbF9tZXJnZUAyOAoKcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9ib29sX21lcmdlQDIxCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5jb3Vwb24uQ291cG9uVHJhbnNmZXJBZ2VudE1peGluLmFzc2V0X3RyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfdHJhbnNmZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9jb3Vwb24ucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTMtMTU4CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIGFuZCAoCiAgICAvLyAgICAgbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICkKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU0CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTMtMTU4CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIGFuZCAoCiAgICAvLyAgICAgbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICkKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU2CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU2LTE1NwogICAgLy8gbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF90cnVlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1NwogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1Mi0xNTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIGFuZCAoCiAgICAvLyAgICAgICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICkKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNjktMTcxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAyCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICB1bmNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZQogICAgZXh0cmFjdCA0MCA4CiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NAogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0cyA+IFVJbnQ2NCgwKToKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU3LTYwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjQ2LTQ3CiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjktNzAKICAgIC8vICMgVHJhbnNmZXIgaXMgZm9yYmlkZGVuIGluIGNhc2Ugb2YgcGVuZGluZyBjb3Vwb24gcGF5bWVudHMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMsIGR1ZV9jb3Vwb25zKQogICAgc3dhcAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MQogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAyCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgLT0gdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1MgogICAgLy8gaWYgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPT0gVUludDY0KDApOgogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MAogICAgZGlnIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IFVJbnQ2NCgwKQogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjUzCiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZW5kZXJfdW5pdF92YWx1ZSArIGFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyA0CiAgICAqCiAgICBkaWcgNQogICAgKwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9jb3Vwb24ucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAyMQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDk6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBkaWcgNQogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICBkaWcgMTAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zCiAgICBkaWcgNwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA3CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA3IG9mICh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0MgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Bc3NldE1ldGFkYXRhCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgNiAvLyAweDUyMzIzMDIzCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzcKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBwdXNoaW50IDM4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDcgb2YgKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4WzMyXSwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDQyCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkFzc2V0TWV0YWRhdGEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4NC0yODcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4OAogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzExCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNSAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE1CiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE2CiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBkdXAKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICBkaWcgMQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgYnVyeSA0CiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjAtMzIxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWF0KICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE5LTMyMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfT1BFTklOR19EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IG9wZW5pbmcgZGF0ZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIzCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMy0zMjUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYXQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI4LTMyOQogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFhdCiAgICBzd2FwCiAgICBkaWcgMQogICAgPj0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyNy0zMzAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyAgICAgPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYXQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzMS0zMzMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzYKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPXNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPXNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uc2V0X2RlZmF1bHRfc3RhdHVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzQKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxOSAvLyAweDUyMzYzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTIKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gZGVmYXVsdGVkCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1MwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NS0xNDgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NwogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDYtMTQ3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2LTE0OAogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDgKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ny0xNDgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBkaWcgMwogICAgPgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2LTE0OAogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ0LTE0OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4MwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODQKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg1CiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuWkVST19VTklUUwogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODYKICAgIC8vIGFzc2VydCBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4OAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArPSB1bml0cwogICAgYnl0ZWMgNCAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4OQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgKz0gdW5pdHMKICAgIGRpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozOTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBzZWxmLnVuaXRfdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MQogICAgLy8gcmV0dXJuIHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfYXNzZXRfaW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hc3NldF9pbmZvOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDAzCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX1BFUkZPUk1BTlQpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA0CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IHNlbGYubWF0dXJpdHlfZGF0ZSA+IDA6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0CiAgICBkdXAKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA1CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQKICAgIGJ1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA2LTQwNwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBubyBncmFjZSBvciBkZWxpbnF1ZW5jeSBwZXJpb2RzCiAgICAvLyBpZiBzZWxmLmFzc2V0X2RlZmF1bHRlZDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA4CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX0RFRkFVTFRFRCkKICAgIHB1c2hpbnQgMwogICAgYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTEKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMgogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NQogICAgLy8gcmV0dXJuIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBkdXAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTUKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMyAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE2CiAgICAvLyBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTcKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxOAogICAgLy8gdG90YWxfc3VwcGx5PXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyMQogICAgLy8gcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPXNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIyCiAgICAvLyBpc3N1YW5jZV9kYXRlPXNlbGYuaXNzdWFuY2VfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjMKICAgIC8vIG1hdHVyaXR5X2RhdGU9c2VsZi5tYXR1cml0eV9kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjQKICAgIC8vIHN1c3BlbmRlZD1zZWxmLmFzc2V0X3N1c3BlbmRlZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyNQogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBkaWcgMTUKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMC00MjYKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5pZCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPXNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgLy8gICAgIHByaW5jaXBhbF9kaXNjb3VudD1hcmM0LlVJbnQxNihzZWxmLnByaW5jaXBhbF9kaXNjb3VudCksCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgLy8gICAgIHRvdGFsX3N1cHBseT1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUsCiAgICAvLyAgICAgaXNzdWFuY2VfZGF0ZT1zZWxmLmlzc3VhbmNlX2RhdGUsCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1zZWxmLm1hdHVyaXR5X2RhdGUsCiAgICAvLyAgICAgc3VzcGVuZGVkPXNlbGYuYXNzZXRfc3VzcGVuZGVkLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDMwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF90aW1lX2V2ZW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzNgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDM3CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzOAogICAgLy8gdGltZV9ldmVudHMgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMzIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKCmdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ1MAogICAgLy8gKHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDQ5LTQ1MQogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKQogICAgLy8gKQogICAgc3dhcAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF9hc3NldF9tZXRhZGF0YVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hc3NldF9tZXRhZGF0YToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ2MgogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhLmZyb21fYnl0ZXMoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ292X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dvdl9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTEgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBwdXNoaW50IDU2CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA1NgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjgKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA1IC8vIDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MgogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0NgogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQtMTUwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICkKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAzMCAvLyAweDAwCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9jbG9zZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfY2xvc2U6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxMiAvLyAweDUyMzQzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTcxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NAogICAgLy8gY2xvc2VkX3VuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NQogICAgLy8gZGVsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyA0IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ4CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIGJueiBhY2NvdW50X2Nsb3NlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ5CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA1IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmFjY291bnRfY2xvc2VfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3OAogICAgLy8gcmV0dXJuIGNsb3NlZF91bml0cywgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgZGlnIDEKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwMgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMjIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDYgLy8gMHg1MjMyMzAyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzQKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjEgLy8gMHg1MjMyMzUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnQgMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE5IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxMSAvLyAweDUyMzczMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzODMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjAgLy8gMHg1MjM1MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxOSAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzODMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gZGVsIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTEgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDIyIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMTIgLy8gMHg1MjM0MzAyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDE5IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMTEgLy8gMHg1MjM3MzAyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgYWRkcmVzcyksCiAgICBieXRlYyAxOCAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDMwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX2NvbmZpZzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTQKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NwogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYtMzI3CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI3CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMTggLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNzMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMAogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMwogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE5IC8vIDB4NTIzNjMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTUKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDItMzA0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OC0zMDAKICAgIC8vIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLlBlcnBldHVhbENvdXBvbkNhc2hmbG93TWl4aW4uY291bnRfZHVlX2NvdXBvbnMoKSAtPiB1aW50NjQ6CmNvdW50X2R1ZV9jb3Vwb25zOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzUxCiAgICAvLyBkZWYgY291bnRfZHVlX2NvdXBvbnMoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNTIKICAgIC8vIGR1ZV9jb3Vwb25zID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzUzCiAgICAvLyBjdXJyZW50X3RzID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzU0CiAgICAvLyBpZiBjdXJyZW50X3RzID4gc2VsZi5pc3N1YW5jZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzU1CiAgICAvLyBkdWVfY291cG9ucyA9IChjdXJyZW50X3RzIC0gc2VsZi5pc3N1YW5jZV9kYXRlKSAvLyBzZWxmLmNvdXBvbl9wZXJpb2QKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgLQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9wZXJpb2QgZXhpc3RzCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM1Ni0zNTcKICAgIC8vICAgICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX3BlcmlvZHMgY2hlY2tzCiAgICAvLyByZXR1cm4gZHVlX2NvdXBvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLlBlcnBldHVhbENvdXBvbkNhc2hmbG93TWl4aW4uY291cG9uX2R1ZV9kYXRlKGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9kdWVfZGF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM1OQogICAgLy8gZGVmIGNvdXBvbl9kdWVfZGF0ZShzZWxmLCBjb3Vwb246IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNjAKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgKyBjb3Vwb24gKiBzZWxmLmNvdXBvbl9wZXJpb2QKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgKwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6Mzc2CiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNzctMzc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM3OQogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzgyCiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCAtIGFjY3J1aW5nX3N0YXJ0X3RpbWUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHN3YXAKICAgIC0KICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzgzCiAgICAvLyBjb3Vwb25fcGVyaW9kID0gc2VsZi5jb3Vwb25fcGVyaW9kCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM4NAogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9PSBVSW50NjQoY3N0LkRDQ19BX0EpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGJueiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTYyCiAgICAvLyByZXR1cm4gdGltZV9wZXJpb2QgLy8gVUludDY0KGNzdC5EQVlfMl9TRUMpCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozODctMzkwCiAgICAvLyByZXR1cm4gdHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1jb3Vwb25fYWNjcnVlZF9wZXJpb2QsCiAgICAvLyAgICAgZGVub21pbmF0b3I9Y291cG9uX3BlcmlvZCwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzYzCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzY0CiAgICAvLyBpZiBkdWVfY291cG9ucyA+PSBVSW50NjQoMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNjUKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAxCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAxCiAgICBiIGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5pc19hY2NydWluZ19pbnRlcmVzdChfZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0Ogppc19hY2NydWluZ19pbnRlcmVzdDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM5MgogICAgLy8gZGVmIGlzX2FjY3J1aW5nX2ludGVyZXN0KHNlbGYsIF9kdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOTMKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCmlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOTMKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLlBlcnBldHVhbENvdXBvbkNhc2hmbG93TWl4aW4uYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCwgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM5NS0zOTcKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIHVuaXRzOiBVSW50NjQsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOTgtMzk5CiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IHNhZmVndWFyZHMgdGhlIHN1YnJvdXRpbmUgZnJvbSBmb3JiaWRkZW4gaW52b2NhdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDAxCiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQwMgogICAgLy8gY291cG9uX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDA0CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQwNQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDQtNDA1CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDQtNDA2CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDcKICAgIC8vIC8vIChjc3QuQlBTICogY291cG9uX3BlcmlvZCkKICAgIGludGMgNCAvLyAxMDAwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDQtNDA3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kKQogICAgLwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDAzLTQwOAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gICAgICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAgICAgLy8gKGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kKQogICAgLy8gKSAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uQ291cG9uQ2FzaGZsb3dNaXhpbi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmFsbF9kdWVfY291cG9uc19wYWlkOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjYKICAgIC8vIGRlZiBhbGxfZHVlX2NvdXBvbnNfcGFpZChzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNwogICAgLy8gcmV0dXJuIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgPj0gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIGR1ZV9jb3Vwb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBhaWRfY291cG9uX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICA+PQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uQ291cG9uQ2FzaGZsb3dNaXhpbi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI5LTMxCiAgICAvLyBkZWYgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzItMzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID09IGR1ZV9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA3CiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDkKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTAKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwOS0xMTAKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA4LTExMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0KICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTEyCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4OgogICAgcHVzaGludCA3NQogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxMwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDEzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE3CiAgICAvLyB0aW1lX2kgPSB0aW1lX2V2ZW50c1tpZHhdCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTgKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW2lkeCArIDFdCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExOQogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTIwCiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMzCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM2CiAgICAvLyBkZWYgYWNjb3VudF91bml0c192YWx1ZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIHVuaXRzOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM3CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzkKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDEKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDAtNDIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDcKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOAo=", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" - }, - "byteCode": { - "approval": "DCAHAAEgCJBOyAGAowUmIwQVH3x1BFIzMCMGc3RhdHVzDWlzc3VhbmNlX2RhdGURY2lyY3VsYXRpbmdfdW5pdHMNaW50ZXJlc3RfcmF0ZQRSMjAjCnVuaXRfdmFsdWUhcHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlHXNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlDW1hdHVyaXR5X2RhdGUEUjcwIwRSNDAjC3RvdGFsX3VuaXRzE3NldHRsZW1lbnRfYXNzZXRfaWQUZGF5X2NvdW50X2NvbnZlbnRpb24dc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUNY291cG9uX3BlcmlvZARSODAjBFI2MCMEUjUwIwRSMjUjD2Fzc2V0X3N1c3BlbmRlZA9hc3NldF9kZWZhdWx0ZWQVZGVub21pbmF0aW9uX2Fzc2V0X2lkCG1ldGFkYXRhEnByaW5jaXBhbF9kaXNjb3VudCFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGURcGFpZF9jb3Vwb25fdW5pdHMLdGltZVBlcmlvZHMBAA10b3RhbF9jb3Vwb25zCnRpbWVFdmVudHMCAAADBoEBMRhAAHUnBjIDZycVMgNnJxYiZycXImcnDSJnJwQiZycHImcqImcnGCJnJw4iZycHImcnDyJnJxmAAGcnGiJnJwUiZycfImcnCCJnJxsiZysiZycQImcnCSJnJwoiZyccImcnESJnMTWBAxJEMTSBFBJEMTcURDE2FESABCXbqVs2GgCOAQDjMRkURDEYQQDMghwEiUdBNASTFimNBEQ2PUkEZ9tPIAT2qWyNBCKbcG8EjPFLUQRP1qPMBB1vwlUEJemZfwRshePuBEAtukcE+tIXPgQI7+o1BOSlq1QE3AY7NQQU/BDvBEwRPtUEdKcpfwQQXBhOBIL3Gy0E7wT10wQDuDMpBD2+gL0E31ToLAQBDIKZBHQGrNIEw+SylzYaAI4cABsBgAGsAlECdwLfAvkEdAYYBpYGtQdNCBwINghRCFwIlQjfCSUJVwlvCYcJnwpbCvELEAsbC2UAgAQ/DvxsNhoAjgEFtgAxGYEEEjEYEERCBdiAADYaAUkVJRJEFzYaAkkVJRJEFzYaA0kVJRJEFzYaBEkVJRJEFzYaBUkVJRJEFzYaBkkVIxJENhoHSU4HFYECEkQ2GghJIllJTgiBAguBAghMFRJENhoJSU4HSSJZSU4IJQuBAghMFRJENhoKSU4HSSJZSU4IgRALgQIITBUSRIgNJiIqZUQUREsFcQtFAUQnGEsGZ0sETwYSRCcOSwVnsTIAMgoishKyFE8FshGBBLIQsgGzSwNLAhgURCcHSwJnTwNPAgonDUxnJxpPAmcXSUEACEmB/wESQQCFI0QnD0sBZ0sGF0UIIicaZURAAANLB0QnBUsIZ0sFSRREJx9LAWeBAwhLBBJESwSIC7AnILxIJyBLAb9JgQJbJwhMZ0mBClsnG0xngRJbK0xnJwoiZ0sBIxJESwJJVwIQSSJbTCVbTEQURCcdvEgnHUy/Jx2DAgIQuiJbJxFMZyqBZGcjQyJC/3g2GgFJFYECEkQnEjEAiAwARIgMOogMP4gKXogLGUQXJwVMZzIHFihMULAjQyKAAEcENhoBSRUkEkQ2GgJJFSUSRBciJwhlREEAgzIHIicIZUQPQQB4I0QpSwJQSUUJvUUBRElBAGNLB75EJFtLAQ9BAFcjREsBSUsCiAtyRQgiRQciRQQiRQaICe5JRQZMSwGICrWIClxBABpLA0mICgpLA0sDTwOICmJFB0kiW0UEJVtFBUsCFksFFlBLBxZLBxZQTFAoTFCwI0MiQv+mIkL/hTYaAUkVJBJEKUsBUL1FAUSICxoiJwVlRAshBAoWIhZQKExQsCNDgABHBCIqZUSBZBJBAFSICXBFA0sCSSMIiAmGRQNJiAoeRQYiRQIiRQWICc9BAA5LAogJfkkiW0UCJVtFBCInH2VESwEWSwUWUEwWSwQWUEsDFlBMUCceIksHVFAoTFCwI0MiRQNC/6snISIqZUSBZBJBAAcnHb5MRQJEKEsBULAjQzYaAUcCFSQSRDYaAkkiWYECCEsBFRJEVwIATCIqZUSBZBJEiAqviAq0KUsBUElOAkm9RQFESb5IJFtJTgNEiAi+TL5EgTBbTEsBDUSICW5EiAoyIicFZUQLIQQKIicVZUQyAxNBACIxACInFWVEEkAAFTEASwUSQAANMQBLA75EVwAgEkEA8CNESwK+RFcAICInDmVEcABFAUEA10sCvkSBwANTQADMI0EAwjIKIicOZURMSwFwAERLAklOAg9ESwS+RFcAILEyAE8CshJMshRMshGBBLIQsgGzSwJJvkSBMFsjCBaBMEy7IiccZURLAggnHExnMggyByInGGVESXEDRCInBGVEIicHZUQLTwQWgAMIADdQTwQWUEsEFkxLAVBPBBZQSwMVFlcGAk8EUEyAAgA7UE8DFlAnIVAiFlCABAACSVBQTFCABIwpkE5MULAyBxZQSwRJFRZXBgJMUEyAAgASUExQKExQsCNDIkUBQv9nIkL/MSJC/w0iRwKAAEk2GgFJFSQSRDYaAkkVJBJENhoDSRUlEkQXIiplRIFkEkEBIyInEGVEMgcOQQEYIicJZURBAAsyByInCWVEDEEBBSNEMQBLA0lOAhJEiAkFiAkKKUsBUElFCUm9RQFEKUsESU4CUElFCkm9RQFESwOICHJLAYgIbU8DTwITREsCSURPAr5ESSRbTwIPRFcoCEUJvkQkW0EAmEsGvkSBKFtLBr5EgShbEkEAgksGvkSBMFtLBr5EgTBbEkEAcCNESwZJvkSBKFtFBYgGs0sESU4CSwGIB3lMSwNJTgNPAogHMEUHSwG+RCRbSg5ETAkWSwEkTwK7vkgkW0AAECIWSwdJTgKBKEsCu4EwTLtLBUm+RCRbSwJJTgIIFk8CJE8Cu0sEC0sFCBYoTFCwI0MiQv+NSwVJgShLCrtLB75EVzAIgTBMu0L/eCJC/vg2GgFJFSQSRDYaAkkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkQnBk8CZycZTGcjQzYaAUkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkSIB7InGUxnI0MiNhoBRwIiWUklC4ECCE8CFRJEiAeWIiplRCEFEhREiAeUSUQjDUEABkmIBpRFASIrZURLAUlXAgBFBIECW0xLAQ5EJxBMZyInCmVEQQAaIicKZURLASJZIwklC0sDTFtMSwEPRCcJTGciJxBlRCInCWVETBZMFlAoTFCwI0M2GgFJFSMSRCJTJxMxAIgG6UQnF0xnMgcWKExQsCNDgAA2GgFJFSQSRDYaAkkVJRJEFyIqZUSBZBJBAHciJwhlRDIHSUUFDkEAaSInG2VESwMNQQBeI0QnFDEAiAacRClLAlBJvUUBRIgGzYgG0ksBSUQiJwRlREsBCCInDWVESwEPRCcESwFnSwK+RCRbTwIIFksCJE8CuyInB2VEFk8CgShPArsiJw1lREwJFihMULAjQyJC/58iMgciJwplTElOAk4DRA1BAAhJQQAEgQRFAiInF2VEQQAEgQNFAiInGGVEIicOZUQiJwRlRCInB2VESgsiJw9lRBZJkyUORFcHASInGmVEFkmTgRAORFcGAiInBWVEFkmTgRAORFcGAiInDWVEIicIZUQiJxtlRCIrZUQiJwplRCInFmVESw8WSZMlDkRXBwFPDhZPDhZQTwsWUE8LFlBPClBPCVBPCFBPBxZQTwcWUE8GFlBPBRZQTwQWUE8DFlAnHiJPBFRQTFAoTFCwI0MnISIqZUSBZBJBAAcnIL5MRQJEKEsBULAjQyInEGVEIicJZURMFoACAAJMUEwWUChMULAjQyInGWVEKExQsCNDNhoBSRUkEkQ2GgJJFSMSRCJTJwsxAIgFG0QpTwJQSb1FAURJgTgjuiJPA1SBOEy7MgcWKExQsCNDNhoBSRUkEkQ2GgJJFSQSRCcMMQCIBOREIiplRCEFEhREiAUViAUaKU8CUEm9RQEURCIWTwJLAVBLAVBMUCceUL8yBxYoTFCwI0M2GgFJFSQSRCcMMQCIBKJEiATcKUxQSb1FAURJvkgkW0lPArxIIicEZURMCScESwFnQAAEKiEFZzIHSwEWTBZQKExQsCNDNhoBSRUkEkQ2GgJJFSQSRDEASwISRIgEkIgElSlPAlBJvUUBRCJPArsyBxYoTFCwI0M2GgFJFSQSRClMUEm9RQFEvkgoTFCwI0M2GgFJFSQSRIgESicGTGcyBxYoTFCwI0M2GgFJFSQSRIgEMicVTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUkEkQ2GgNJIlmBAghLARUSRFcCAEyIA/6IBAUXRwKIBA+BFBJBAA4nBksDZzIHFihMULAjQ0mBKBJBABEnDEsDUEm9RQEUREsCv0L/30mBMhJBABEnFEsDUEm9RQEUREsCv0L/x0mBPBJBABEnE0sDUEm9RQEUREsCv0L/r0mBRhJBABEnC0sDUEm9RQEUREsCv0L/l0mBUBJB/5AnEksDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSQSRIgDVIgDWxdHAogDZUmBFBNEgSgSQQAVJwxLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycUSwJQSb1FAUS8SEL/4UmBPBJBAA8nE0sCUEm9RQFEvEhC/8tJgUYSQQAPJwtLAlBJvUUBRLxIQv+1SYFQEkH/ricSSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnCzEAiAKORCcWTGcyBxYoTFCwI0MiJwZlRChMULAjQzYaAUkVJBJEJwxLAYgCZicUSwKIAl8nE0sDiAJYJwtLBIgCUScSTwWIAkonHiJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJBJEF0mIAmKDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxJLAVBJvUUBRL5IKExQsCNDJwtLAVBJvUUBRL5IQv/rJxNLAVBJvUUBRL5IQv/cJxRLAVBJvUUBRL5IQv/NJwxLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigABIjIHSSIrZUQNQQAQIitlRIsBTAkiJxFlRAqMAImKAQEiK2VEIicRZUSL/wsIiYoBAYAASYv/QAAqIitlRDIHTAmMACInEWVEIicPZURAAAqLACEGCowAIQYKiwAWTBZQjACJIowBi/9BAAeL/4j/rYwBiwFC/8aKAQEiK2VEQQAMMgciK2VEDUEAAiOJIomKAwGL/Yv/iAA0i/+I/5BJIltMJVuL/Yv+iADIIicFZUQLTwILIQRPAgsKiYoBASInHGVEIicEZUSL/wsPiYoCACmL/lC+RIEwW4v/EkSJigEBgABHAov/VwIAi/+BAlsyBw1Ei/8iWSMJIosFiwQMQQBcgUsyDA1BABmxgQayEIEFshknIrIeJyKyHzIAsgGzQv/fiwVJJQuLA0lOA0xbSU4DjAEjCEmMAiULW0mMAAxEIicPZUSB/wETQQAKiwCLAQkhBhgURIsCjAVC/5yL/4wAiYoBACmL/1C+RIHAA1MURImKAgEpi/5QvkSBKFuL/wuJigEBKYv/UL5EJFuL/0yI/9+JigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJVuLAA9BAAQjjACJIkL/+TEAIicGZUQSRIkiJxdlRBREiSInFmVEFESJigEAi/+BFBJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", - "clear": "DIEBQw==" - }, - "compilerInfo": { - "compiler": "puya", - "compilerVersion": { - "major": 5, - "minor": 7, - "patch": 1 - } - }, - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "templateVariables": {} -} \ No newline at end of file diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.puya.map b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.puya.map deleted file mode 100644 index d580b5c4..00000000 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.puya.map +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 3, - "sources": [], - "mappings": ";;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "pushint 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3": { - "op": "return", - "stack_out": [] - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.teal b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.teal deleted file mode 100644 index a87aa802..00000000 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.clear.teal +++ /dev/null @@ -1,7 +0,0 @@ -#pragma version 12 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: -main: - pushint 1 - return diff --git a/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py b/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py deleted file mode 100644 index c63b6d06..00000000 --- a/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py +++ /dev/null @@ -1,3965 +0,0 @@ -# flake8: noqa -# fmt: off -# mypy: ignore-errors -# This file was automatically generated by algokit-client-generator. -# DO NOT MODIFY IT BY HAND. -# requires: algokit-utils@^3.0.0 - -# common -import dataclasses -import typing -# core algosdk -import algosdk -from algosdk.transaction import OnComplete -from algosdk.atomic_transaction_composer import TransactionSigner -from algosdk.source_map import SourceMap -from algosdk.transaction import Transaction -from algosdk.v2client.models import SimulateTraceConfig -# utils -import algokit_utils -from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient - -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}], "name": "update_interest_rate", "returns": {"type": "uint64", "desc": "Timestamp of the update"}, "desc": "Update variable interest rates in bps", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Account's units for the current value calculation", "name": "units"}], "name": "get_account_units_current_value", "returns": {"type": "(uint64,uint64,(uint64,uint64))", "desc": "Units current value in denomination asset, Accrued interest in denomination asset", "struct": "CurrentUnitsValue"}, "desc": "Get account's units current value and accrued interest", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_payment_amount", "returns": {"type": "(uint64,uint64)", "desc": "Interest amount in denomination asset, Principal amount in denomination asset", "struct": "PaymentAmounts"}, "desc": "Get the next payment amount", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_coupons_status", "returns": {"type": "(uint64,uint64,uint64,(uint64,uint64),bool)", "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid", "struct": "CouponsInfo"}, "desc": "Get D-ASA coupons status", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_periods", "returns": {"type": "(uint64,uint64)[]", "desc": "Time periods"}, "desc": "Get D-ASA time periods", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_coupon", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay due coupon to an account", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Sender Account Holding Address", "name": "sender_holding_address"}, {"type": "address", "desc": "Receiver Account Holding Address", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to transfer", "name": "units"}], "name": "asset_transfer", "returns": {"type": "uint64", "desc": "Transferred actualized value in denomination asset"}, "desc": "Transfer D-ASA units between accounts", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_close", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_config", "returns": {"type": "(uint64,uint64)", "desc": "Role configuration", "struct": "RoleConfig"}, "desc": "Get role configuration", "events": [], "readonly": true, "recommendations": {}}], "name": "PerpetualBond", "state": {"keys": {"box": {"time_events": {"key": "dGltZUV2ZW50cw==", "keyType": "AVMBytes", "valueType": "uint64[]"}, "time_periods": {"key": "dGltZVBlcmlvZHM=", "keyType": "AVMBytes", "valueType": "(uint64,uint64)[]"}}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjI1Iw==", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "paid_coupon_units": {"key": "cGFpZF9jb3Vwb25fdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "coupon_period": {"key": "Y291cG9uX3BlcmlvZA==", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}, "account": {"keyType": "address", "valueType": "AccountInfo", "prefix": "UjMwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 3, "ints": 20}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "CouponsInfo": [{"name": "total_coupons", "type": "uint64"}, {"name": "due_coupons", "type": "uint64"}, {"name": "next_coupon_due_date", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}, {"name": "all_due_coupons_paid", "type": "bool"}], "CurrentUnitsValue": [{"name": "units_value", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}], "DayCountFactor": [{"name": "numerator", "type": "uint64"}, {"name": "denominator", "type": "uint64"}], "PaymentAmounts": [{"name": "interest", "type": "uint64"}, {"name": "principal", "type": "uint64"}], "PaymentResult": [{"name": "amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}]}, "byteCode": {"approval": "DCAHAAEgCJBOyAGAowUmIwQVH3x1BFIzMCMGc3RhdHVzDWlzc3VhbmNlX2RhdGURY2lyY3VsYXRpbmdfdW5pdHMNaW50ZXJlc3RfcmF0ZQRSMjAjCnVuaXRfdmFsdWUhcHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlHXNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlDW1hdHVyaXR5X2RhdGUEUjcwIwRSNDAjC3RvdGFsX3VuaXRzE3NldHRsZW1lbnRfYXNzZXRfaWQUZGF5X2NvdW50X2NvbnZlbnRpb24dc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUNY291cG9uX3BlcmlvZARSODAjBFI2MCMEUjUwIwRSMjUjD2Fzc2V0X3N1c3BlbmRlZA9hc3NldF9kZWZhdWx0ZWQVZGVub21pbmF0aW9uX2Fzc2V0X2lkCG1ldGFkYXRhEnByaW5jaXBhbF9kaXNjb3VudCFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGURcGFpZF9jb3Vwb25fdW5pdHMLdGltZVBlcmlvZHMBAA10b3RhbF9jb3Vwb25zCnRpbWVFdmVudHMCAAADBoEBMRhAAHUnBjIDZycVMgNnJxYiZycXImcnDSJnJwQiZycHImcqImcnGCJnJw4iZycHImcnDyJnJxmAAGcnGiJnJwUiZycfImcnCCJnJxsiZysiZycQImcnCSJnJwoiZyccImcnESJnMTWBAxJEMTSBFBJEMTcURDE2FESABCXbqVs2GgCOAQDjMRkURDEYQQDMghwEiUdBNASTFimNBEQ2PUkEZ9tPIAT2qWyNBCKbcG8EjPFLUQRP1qPMBB1vwlUEJemZfwRshePuBEAtukcE+tIXPgQI7+o1BOSlq1QE3AY7NQQU/BDvBEwRPtUEdKcpfwQQXBhOBIL3Gy0E7wT10wQDuDMpBD2+gL0E31ToLAQBDIKZBHQGrNIEw+SylzYaAI4cABsBgAGsAlECdwLfAvkEdAYYBpYGtQdNCBwINghRCFwIlQjfCSUJVwlvCYcJnwpbCvELEAsbC2UAgAQ/DvxsNhoAjgEFtgAxGYEEEjEYEERCBdiAADYaAUkVJRJEFzYaAkkVJRJEFzYaA0kVJRJEFzYaBEkVJRJEFzYaBUkVJRJEFzYaBkkVIxJENhoHSU4HFYECEkQ2GghJIllJTgiBAguBAghMFRJENhoJSU4HSSJZSU4IJQuBAghMFRJENhoKSU4HSSJZSU4IgRALgQIITBUSRIgNJiIqZUQUREsFcQtFAUQnGEsGZ0sETwYSRCcOSwVnsTIAMgoishKyFE8FshGBBLIQsgGzSwNLAhgURCcHSwJnTwNPAgonDUxnJxpPAmcXSUEACEmB/wESQQCFI0QnD0sBZ0sGF0UIIicaZURAAANLB0QnBUsIZ0sFSRREJx9LAWeBAwhLBBJESwSIC7AnILxIJyBLAb9JgQJbJwhMZ0mBClsnG0xngRJbK0xnJwoiZ0sBIxJESwJJVwIQSSJbTCVbTEQURCcdvEgnHUy/Jx2DAgIQuiJbJxFMZyqBZGcjQyJC/3g2GgFJFYECEkQnEjEAiAwARIgMOogMP4gKXogLGUQXJwVMZzIHFihMULAjQyKAAEcENhoBSRUkEkQ2GgJJFSUSRBciJwhlREEAgzIHIicIZUQPQQB4I0QpSwJQSUUJvUUBRElBAGNLB75EJFtLAQ9BAFcjREsBSUsCiAtyRQgiRQciRQQiRQaICe5JRQZMSwGICrWIClxBABpLA0mICgpLA0sDTwOICmJFB0kiW0UEJVtFBUsCFksFFlBLBxZLBxZQTFAoTFCwI0MiQv+mIkL/hTYaAUkVJBJEKUsBUL1FAUSICxoiJwVlRAshBAoWIhZQKExQsCNDgABHBCIqZUSBZBJBAFSICXBFA0sCSSMIiAmGRQNJiAoeRQYiRQIiRQWICc9BAA5LAogJfkkiW0UCJVtFBCInH2VESwEWSwUWUEwWSwQWUEsDFlBMUCceIksHVFAoTFCwI0MiRQNC/6snISIqZUSBZBJBAAcnHb5MRQJEKEsBULAjQzYaAUcCFSQSRDYaAkkiWYECCEsBFRJEVwIATCIqZUSBZBJEiAqviAq0KUsBUElOAkm9RQFESb5IJFtJTgNEiAi+TL5EgTBbTEsBDUSICW5EiAoyIicFZUQLIQQKIicVZUQyAxNBACIxACInFWVEEkAAFTEASwUSQAANMQBLA75EVwAgEkEA8CNESwK+RFcAICInDmVEcABFAUEA10sCvkSBwANTQADMI0EAwjIKIicOZURMSwFwAERLAklOAg9ESwS+RFcAILEyAE8CshJMshRMshGBBLIQsgGzSwJJvkSBMFsjCBaBMEy7IiccZURLAggnHExnMggyByInGGVESXEDRCInBGVEIicHZUQLTwQWgAMIADdQTwQWUEsEFkxLAVBPBBZQSwMVFlcGAk8EUEyAAgA7UE8DFlAnIVAiFlCABAACSVBQTFCABIwpkE5MULAyBxZQSwRJFRZXBgJMUEyAAgASUExQKExQsCNDIkUBQv9nIkL/MSJC/w0iRwKAAEk2GgFJFSQSRDYaAkkVJBJENhoDSRUlEkQXIiplRIFkEkEBIyInEGVEMgcOQQEYIicJZURBAAsyByInCWVEDEEBBSNEMQBLA0lOAhJEiAkFiAkKKUsBUElFCUm9RQFEKUsESU4CUElFCkm9RQFESwOICHJLAYgIbU8DTwITREsCSURPAr5ESSRbTwIPRFcoCEUJvkQkW0EAmEsGvkSBKFtLBr5EgShbEkEAgksGvkSBMFtLBr5EgTBbEkEAcCNESwZJvkSBKFtFBYgGs0sESU4CSwGIB3lMSwNJTgNPAogHMEUHSwG+RCRbSg5ETAkWSwEkTwK7vkgkW0AAECIWSwdJTgKBKEsCu4EwTLtLBUm+RCRbSwJJTgIIFk8CJE8Cu0sEC0sFCBYoTFCwI0MiQv+NSwVJgShLCrtLB75EVzAIgTBMu0L/eCJC/vg2GgFJFSQSRDYaAkkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkQnBk8CZycZTGcjQzYaAUkVSwGBJllJgSgSREsCTEsCUiJZgSoIEkSIB7InGUxnI0MiNhoBRwIiWUklC4ECCE8CFRJEiAeWIiplRCEFEhREiAeUSUQjDUEABkmIBpRFASIrZURLAUlXAgBFBIECW0xLAQ5EJxBMZyInCmVEQQAaIicKZURLASJZIwklC0sDTFtMSwEPRCcJTGciJxBlRCInCWVETBZMFlAoTFCwI0M2GgFJFSMSRCJTJxMxAIgG6UQnF0xnMgcWKExQsCNDgAA2GgFJFSQSRDYaAkkVJRJEFyIqZUSBZBJBAHciJwhlRDIHSUUFDkEAaSInG2VESwMNQQBeI0QnFDEAiAacRClLAlBJvUUBRIgGzYgG0ksBSUQiJwRlREsBCCInDWVESwEPRCcESwFnSwK+RCRbTwIIFksCJE8CuyInB2VEFk8CgShPArsiJw1lREwJFihMULAjQyJC/58iMgciJwplTElOAk4DRA1BAAhJQQAEgQRFAiInF2VEQQAEgQNFAiInGGVEIicOZUQiJwRlRCInB2VESgsiJw9lRBZJkyUORFcHASInGmVEFkmTgRAORFcGAiInBWVEFkmTgRAORFcGAiInDWVEIicIZUQiJxtlRCIrZUQiJwplRCInFmVESw8WSZMlDkRXBwFPDhZPDhZQTwsWUE8LFlBPClBPCVBPCFBPBxZQTwcWUE8GFlBPBRZQTwQWUE8DFlAnHiJPBFRQTFAoTFCwI0MnISIqZUSBZBJBAAcnIL5MRQJEKEsBULAjQyInEGVEIicJZURMFoACAAJMUEwWUChMULAjQyInGWVEKExQsCNDNhoBSRUkEkQ2GgJJFSMSRCJTJwsxAIgFG0QpTwJQSb1FAURJgTgjuiJPA1SBOEy7MgcWKExQsCNDNhoBSRUkEkQ2GgJJFSQSRCcMMQCIBOREIiplRCEFEhREiAUViAUaKU8CUEm9RQEURCIWTwJLAVBLAVBMUCceUL8yBxYoTFCwI0M2GgFJFSQSRCcMMQCIBKJEiATcKUxQSb1FAURJvkgkW0lPArxIIicEZURMCScESwFnQAAEKiEFZzIHSwEWTBZQKExQsCNDNhoBSRUkEkQ2GgJJFSQSRDEASwISRIgEkIgElSlPAlBJvUUBRCJPArsyBxYoTFCwI0M2GgFJFSQSRClMUEm9RQFEvkgoTFCwI0M2GgFJFSQSRIgESicGTGcyBxYoTFCwI0M2GgFJFSQSRIgEMicVTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUkEkQ2GgNJIlmBAghLARUSRFcCAEyIA/6IBAUXRwKIBA+BFBJBAA4nBksDZzIHFihMULAjQ0mBKBJBABEnDEsDUEm9RQEUREsCv0L/30mBMhJBABEnFEsDUEm9RQEUREsCv0L/x0mBPBJBABEnE0sDUEm9RQEUREsCv0L/r0mBRhJBABEnC0sDUEm9RQEUREsCv0L/l0mBUBJB/5AnEksDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSQSRIgDVIgDWxdHAogDZUmBFBNEgSgSQQAVJwxLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycUSwJQSb1FAUS8SEL/4UmBPBJBAA8nE0sCUEm9RQFEvEhC/8tJgUYSQQAPJwtLAlBJvUUBRLxIQv+1SYFQEkH/ricSSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnCzEAiAKORCcWTGcyBxYoTFCwI0MiJwZlRChMULAjQzYaAUkVJBJEJwxLAYgCZicUSwKIAl8nE0sDiAJYJwtLBIgCUScSTwWIAkonHiJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJBJEF0mIAmKDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxJLAVBJvUUBRL5IKExQsCNDJwtLAVBJvUUBRL5IQv/rJxNLAVBJvUUBRL5IQv/cJxRLAVBJvUUBRL5IQv/NJwxLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigABIjIHSSIrZUQNQQAQIitlRIsBTAkiJxFlRAqMAImKAQEiK2VEIicRZUSL/wsIiYoBAYAASYv/QAAqIitlRDIHTAmMACInEWVEIicPZURAAAqLACEGCowAIQYKiwAWTBZQjACJIowBi/9BAAeL/4j/rYwBiwFC/8aKAQEiK2VEQQAMMgciK2VEDUEAAiOJIomKAwGL/Yv/iAA0i/+I/5BJIltMJVuL/Yv+iADIIicFZUQLTwILIQRPAgsKiYoBASInHGVEIicEZUSL/wsPiYoCACmL/lC+RIEwW4v/EkSJigEBgABHAov/VwIAi/+BAlsyBw1Ei/8iWSMJIosFiwQMQQBcgUsyDA1BABmxgQayEIEFshknIrIeJyKyHzIAsgGzQv/fiwVJJQuLA0lOA0xbSU4DjAEjCEmMAiULW0mMAAxEIicPZUSB/wETQQAKiwCLAQkhBhgURIsCjAVC/5yL/4wAiYoBACmL/1C+RIHAA1MURImKAgEpi/5QvkSBKFuL/wuJigEBKYv/UL5EJFuL/0yI/9+JigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJVuLAA9BAAQjjACJIkL/+TEAIicGZUQSRIkiJxdlRBREiSInFmVEFESJigEAi/+BFBJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", "clear": "DIEBQw=="}, "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgOCAxMDAwMCAyMDAgODY0MDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzMzMDIzICJzdGF0dXMiICJpc3N1YW5jZV9kYXRlIiAiY2lyY3VsYXRpbmdfdW5pdHMiICJpbnRlcmVzdF9yYXRlIiAweDUyMzIzMDIzICJ1bml0X3ZhbHVlIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJtYXR1cml0eV9kYXRlIiAweDUyMzczMDIzIDB4NTIzNDMwMjMgInRvdGFsX3VuaXRzIiAic2V0dGxlbWVudF9hc3NldF9pZCIgImRheV9jb3VudF9jb252ZW50aW9uIiAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiICJjb3Vwb25fcGVyaW9kIiAweDUyMzgzMDIzIDB4NTIzNjMwMjMgMHg1MjM1MzAyMyAweDUyMzIzNTIzICJhc3NldF9zdXNwZW5kZWQiICJhc3NldF9kZWZhdWx0ZWQiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtZXRhZGF0YSIgInByaW5jaXBhbF9kaXNjb3VudCIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgInBhaWRfY291cG9uX3VuaXRzIiAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMgMHgwMCAidG90YWxfY291cG9ucyIgMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MyAweDAwMDAgMHgwNjgxMDEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMC0zMQogICAgLy8gIyBSQkFDIFJvbGVzCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDYgLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgMjEgLy8gMHg1MjMyMzUyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIEQtQVNBIEdvdmVybmFuY2UKICAgIC8vIHNlbGYuYXNzZXRfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDIyIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo0OQogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBGYWxzZQogICAgYnl0ZWMgMjMgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjIKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVubS5TVEFUVVNfSU5BQ1RJVkUpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxLTMyCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgMjQgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDE0IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDcgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzctMzgKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MC00MQogICAgLy8gIyBQcmluY2lwYWwgLyBSYXRlcwogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjYgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9jb3Vwb25zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjUxCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MgogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMzNwogICAgLy8gc2VsZi5jb3Vwb25fcGVyaW9kID0gVUludDY0KCkKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAyMAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzQKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNS0yOAogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBQQk5Db3JlTWl4aW4sCiAgICAvLyAgICAgUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBOb1ByaW5jaXBhbFBheW1lbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4MjVkYmE5NWIgLy8gbWV0aG9kICJhc3NldF91cGRhdGUoKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE1LTI4CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIFBCTkNvcmVNaXhpbiwKICAgIC8vICAgICBQZXJwZXR1YWxDb3Vwb25DYXNoZmxvd01peGluLAogICAgLy8gICAgIE5vUHJpbmNpcGFsUGF5bWVudE1peGluLAogICAgLy8gICAgIENvdXBvblBheW1lbnRBZ2VudE1peGluLAogICAgLy8gICAgIENvdXBvblRyYW5zZmVyQWdlbnRNaXhpbiwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDM2CiAgICBwdXNoYnl0ZXNzIDB4ODk0NzQxMzQgMHg5MzE2Mjk4ZCAweDQ0MzYzZDQ5IDB4NjdkYjRmMjAgMHhmNmE5NmM4ZCAweDIyOWI3MDZmIDB4OGNmMTRiNTEgMHg0ZmQ2YTNjYyAweDFkNmZjMjU1IDB4MjVlOTk5N2YgMHg2Yzg1ZTNlZSAweDQwMmRiYTQ3IDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IDB4ZGMwNjNiMzUgMHgxNGZjMTBlZiAweDRjMTEzZWQ1IDB4NzRhNzI5N2YgMHgxMDVjMTg0ZSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAidXBkYXRlX2ludGVyZXN0X3JhdGUodWludDE2KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldF9jb3Vwb25zX3N0YXR1cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfcGVyaW9kcygpKHVpbnQ2NCx1aW50NjQpW10iLCBtZXRob2QgInBheV9jb3Vwb24oYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jb25maWcgdXBkYXRlX2ludGVyZXN0X3JhdGUgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSBnZXRfcGF5bWVudF9hbW91bnQgZ2V0X2NvdXBvbnNfc3RhdHVzIGdldF90aW1lX3BlcmlvZHMgcGF5X2NvdXBvbiBhc3NldF90cmFuc2ZlciBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzIHNldF9kZWZhdWx0X3N0YXR1cyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbiBnZXRfYXNzZXRfaW5mbyBnZXRfdGltZV9ldmVudHMgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUgZ2V0X2Fzc2V0X21ldGFkYXRhIGFjY291bnRfZ292X3N1c3BlbnNpb24gYWNjb3VudF9vcGVuIGFjY291bnRfY2xvc2UgYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X2luZm8gcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV9jb25maWcKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNS0yOAogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBQQk5Db3JlTWl4aW4sCiAgICAvLyAgICAgUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBOb1ByaW5jaXBhbFBheW1lbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25QYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBDb3Vwb25UcmFuc2ZlckFnZW50TWl4aW4sCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4M2YwZWZjNmMgLy8gbWV0aG9kICJhc3NldF9jcmVhdGUoYWRkcmVzcywodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYXNzZXRfY3JlYXRlCiAgICBlcnIKCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGFzc2V0X3VwZGF0ZQoKCi8vIG1vZHVsZXMuYWN0dXMucGJuLlBCTkNvcmVNaXhpbi5hc3NldF9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBjb3ZlciA3CiAgICBsZW4KICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MTYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAyCiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDE2PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBjb3ZlciA3CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDgKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAxNgogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx0dXBsZTx1aW50NjQsdWludDY0Pj4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gZW51bXMuU1RBVFVTX0lOQUNUSVZFLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU1LTU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDUKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU3CiAgICAvLyBhc3NlcnQgZXhpc3RzLCBlcnIuSU5WQUxJRF9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBEZW5vbWluYXRpb24gYXNzZXQgaXMgbm90IHByb3Blcmx5IHNldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAyNCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo2NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZGlnIDQKICAgIHVuY292ZXIgNgogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjYzLTY2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjkKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE0IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIzOC0yMzkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCBwcmluY2lwYWwgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbiA9PSAwLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgZGlnIDMKICAgIGRpZyAyCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24KICAgIGJ5dGVjIDcgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbCAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNDIKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gcHJpbmNpcGFsX2Rpc2NvdW50CiAgICBieXRlYyAyNiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ0LTI0NQogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjgyCiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzktODMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo4NgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxNSAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0OC0yNDkKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5hc191aW50NjQoKSkKICAgIGRpZyA2CiAgICBidG9pCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojg5LTkwCiAgICAvLyAjIFRoaXMgc3Vicm91dGluZSBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIHByaW5jaXBhbCBkaXNjb3VudCBoYXMgYmVlbiBzZXQKICAgIC8vIGlmIG5vdCBzZWxmLnByaW5jaXBhbF9kaXNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo5MQogICAgLy8gYXNzZXJ0IGludGVyZXN0X3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGRpZyA3CiAgICBhc3NlcnQgLy8gSW50ZXJlc3QgcmF0ZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojk0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgZGlnIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGRpZyA1CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDAKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9jb3Vwb25zIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToxOAogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIDMKICAgIHB1c2hpbnQgMwogICAgKwogICAgZGlnIDQKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToxNi0xOQogICAgLy8gIyBQQk4gaGFzIG5vIG1hdHVyaXR5IGRhdGUgaW4gdGhlIHN0YXRpYyBzY2hlZHVsZQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgMwogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI1OAogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzKQogICAgZGlnIDQKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjIKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDMyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMzIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjIzLTI1CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdCiAgICBkdXAKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjIzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjMtMjUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToyNi0yOAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXQogICAgZHVwCiAgICBwdXNoaW50IDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAyNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MjYtMjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToyOQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLklTU1VBTkNFX0RBVEVfSURYXQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjXzMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MzAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0MC0zNDEKICAgIC8vICMgVGhlIHBlcnBldHVhbCBib25kIGRlZmluZXMgYSBzaW5nbGUgdGltZSBwZXJpb2QgZm9yIHRoZSBjb3Vwb24gZHVyYXRpb24gd2l0aCB1bmxpbWl0ZWQgcmVwZXRpdGlvbnMKICAgIC8vIGFzc2VydCB0aW1lX3BlcmlvZHMubGVuZ3RoID09IFVJbnQ2NCgxKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzQyCiAgICAvLyBjb3Vwb25fcGVyaW9kX2R1cmF0aW9uID0gdGltZV9wZXJpb2RzWzBdWzBdCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDIgMTYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0NAogICAgLy8gYXNzZXJ0IGNvdXBvbl9wZXJpb2RfZHVyYXRpb24gPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1RJTUVfUEVSSU9EX0RVUkFUSU9OCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2QgZHVyYXRpb25zIG11c3QgYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0NQogICAgLy8gYXNzZXJ0IHJlcGV0aXRpb25zID09IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RfUkVQRVRJVElPTlMKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZCByZXBldGl0aW9ucyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM0OAogICAgLy8gc2VsZi50aW1lX3BlcmlvZHMudmFsdWUgPSB0aW1lX3BlcmlvZHMuY29weSgpCiAgICBieXRlYyAyOSAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjkgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNDkKICAgIC8vIHNlbGYuY291cG9uX3BlcmlvZCA9IHNlbGYudGltZV9wZXJpb2RzLnZhbHVlWzBdWzBdCiAgICBieXRlYyAyOSAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIHB1c2hpbnRzIDIgMTYKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLmFjdHVzLnBibi5QQk5Db3JlTWl4aW4udXBkYXRlX2ludGVyZXN0X3JhdGVbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVfaW50ZXJlc3RfcmF0ZToKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDE2CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDE4IC8vIDB4NTIzODMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjEwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3Bibi5weToxMDgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MTA5CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MTEwCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucyksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5OjExMi0xMTMKICAgIC8vICMgVXBkYXRlIGludGVyZXN0IHJhdGUKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIGJ5dGVjIDUgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYm4ucHk6MTE0CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGJuLnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvdXBvbi5QZXJwZXR1YWxDb3Vwb25DYXNoZmxvd01peGluLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MzgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQzOC00MzkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MzkKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDM4LTQzOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQzNy00NDAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDQyCiAgICAvLyBhc3NlcnQgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuSU5WQUxJRF9VTklUUwogICAgZHVwCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAOAogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDk6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NDIKICAgIC8vIGFzc2VydCAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NDQtNDQ1CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbgogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlID0gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBkaWcgMQogICAgZHVwCiAgICBkaWcgMgogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0Ni00NDcKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0OAogICAgLy8gbnVtZXJhdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ0OQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDUxLTQ1MgogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTQKICAgIC8vIGlmIHNlbGYuaXNfYWNjcnVpbmdfaW50ZXJlc3QoZHVlX2NvdXBvbnMpOgogICAgY2FsbHN1YiBpc19hY2NydWluZ19pbnRlcmVzdAogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTUKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ1Ni00NTgKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMsIGR1ZV9jb3Vwb25zCiAgICAvLyApCiAgICBkaWcgMwogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NTkKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NjAKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDUKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ2NS00NjgKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1udW1lcmF0b3IsCiAgICAvLyAgICAgZGVub21pbmF0b3I9ZGVub21pbmF0b3IsCiAgICAvLyApLAogICAgZGlnIDIKICAgIGl0b2IKICAgIGRpZyA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ2Mi00NjkKICAgIC8vIHJldHVybiB0eXAuQ3VycmVudFVuaXRzVmFsdWUoCiAgICAvLyAgICAgdW5pdHNfdmFsdWU9YWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9YWNjcnVlZF9pbnRlcmVzdCwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPW51bWVyYXRvciwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9ZGVub21pbmF0b3IsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGRpZyA3CiAgICBpdG9iCiAgICBkaWcgNwogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA5CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfcGF5bWVudF9hbW91bnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfcGF5bWVudF9hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDg3CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0ODgKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDg3LTQ4OAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0ODkKICAgIC8vIC8vIGNzdC5CUFMKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDg3LTQ4OQogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAvLyBjc3QuQlBTCiAgICAvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0OTEtNDk0CiAgICAvLyByZXR1cm4gdHlwLlBheW1lbnRBbW91bnRzKAogICAgLy8gICAgIGludGVyZXN0PWludGVyZXN0X2Ftb3VudCwKICAgIC8vICAgICBwcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDkzCiAgICAvLyBwcmluY2lwYWw9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ5MS00OTQKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfY291cG9uc19zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfY291cG9uc19zdGF0dXM6CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDUKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpIGVsc2UgVUludDY0KCkKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c190ZXJuYXJ5X2ZhbHNlQDMKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGJ1cnkgMwoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfbWVyZ2VANDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM2OQogICAgLy8gcmV0dXJuIHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zICsgMSkKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgYnVyeSAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDcKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkID0gc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucykKICAgIGR1cAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDgKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MDkKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUxMAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTEKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBkaWcgMgogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTIKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTMKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDQKCmdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTUKICAgIC8vIHRvdGFsX2NvdXBvbnM9c2VsZi50b3RhbF9jb3Vwb25zLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDMxIC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTgtNTIxCiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWRlbm9taW5hdG9yLAogICAgLy8gKSwKICAgIGRpZyAxCiAgICBpdG9iCiAgICBkaWcgNQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MTQtNTIzCiAgICAvLyByZXR1cm4gdHlwLkNvdXBvbnNJbmZvKAogICAgLy8gICAgIHRvdGFsX2NvdXBvbnM9c2VsZi50b3RhbF9jb3Vwb25zLAogICAgLy8gICAgIGR1ZV9jb3Vwb25zPWR1ZV9jb3Vwb25zLAogICAgLy8gICAgIG5leHRfY291cG9uX2R1ZV9kYXRlPW5leHRfY291cG9uX2R1ZV9kYXRlLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICAgICApLAogICAgLy8gICAgIGFsbF9kdWVfY291cG9uc19wYWlkPWFsbF9kdWVfY291cG9uc19wYWlkLAogICAgLy8gKQogICAgc3dhcAogICAgaXRvYgogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAzMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDcKICAgIHNldGJpdAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUwNQogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkgaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkgZWxzZSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMwogICAgYiBnZXRfY291cG9uc19zdGF0dXNfdGVybmFyeV9tZXJnZUA0CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5nZXRfdGltZV9wZXJpb2RzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3RpbWVfcGVyaW9kczoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUzMwogICAgLy8gdGltZV9wZXJpb2RzID0gdHlwLlRpbWVQZXJpb2RzKCkKICAgIGJ5dGVjIDMzIC8vIDB4MDAwMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MzQKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjUzNQogICAgLy8gdGltZV9wZXJpb2RzID0gc2VsZi50aW1lX3BlcmlvZHMudmFsdWUuY29weSgpCiAgICBieXRlYyAyOSAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9wZXJpb2RzIGV4aXN0cwoKZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo1MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuY291cG9uLkNvdXBvblBheW1lbnRBZ2VudE1peGluLnBheV9jb3Vwb25bcm91dGluZ10oKSAtPiB2b2lkOgpwYXlfY291cG9uOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOQogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDQKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQ1CiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDcKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0OAogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDkKICAgIC8vIGFzc2VydCBkdWVfY291cG9ucyA+IGFjY291bnRfcGFpZF9jb3Vwb25zLCBlcnIuTk9fRFVFX0NPVVBPTgogICAgc3dhcAogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBObyBkdWUgY291cG9uIHRvIHBheQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NTAtNTMKICAgIC8vICMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHZlcmlmeSBpZiBvdGhlciBhY2NvdW50cyBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHBheW1lbnQgb2YgcHJldmlvdXMgY291cG9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQxNAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksIFVJbnQ2NCgxKQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNzQKICAgIC8vIHJldHVybiBwcmluY2lwYWxfYW1vdW50ICogc2VsZi5pbnRlcmVzdF9yYXRlIC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAqCiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTMKICAgIC8vIGlmIHNlbGYub3BfZGFlbW9uLnZhbHVlICE9IEdsb2JhbC56ZXJvX2FkZHJlc3M6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gMHg1MjMyMzUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IHBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogcGF5X2NvdXBvbl9ib29sX3RydWVAMTkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTYKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNQogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTUtMTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IHBheV9jb3Vwb25fYm9vbF90cnVlQDE5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE3CiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE1LTE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IHBheV9jb3Vwb25fYm9vbF9mYWxzZUAyMAoKcGF5X2NvdXBvbl9ib29sX3RydWVAMTk6CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNC0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBkaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjItMjQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyLTI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDI3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI1CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICBibnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDI3CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDI4OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo1NwogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzAKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjMwLTMxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI5LTMyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NjAtNjEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNS00MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzkKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo2MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zICs9IDEKICAgIGRpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo2NAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGRpZyAyCiAgICArCiAgICBieXRlYyAyOCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNwogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjAKICAgIC8vIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjIyCiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjMKICAgIC8vIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjQKICAgIC8vIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfSVApLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIklQIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLCAgIyBUT0RPOiBBZGQgaW50ZXJlc3QgcmF0ZQogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDA4MDAzNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9JUCksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToyNgogICAgLy8gbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY291cG9uLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfSVApLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIklQIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLCAgIyBUT0RPOiBBZGQgaW50ZXJlc3QgcmF0ZQogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI0OTUwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX0lQKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiSVAiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksICAjIFRPRE86IEFkZCBpbnRlcmVzdCByYXRlCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4OGMyOTkwNGUgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo3MAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvdXBvbi5weTo2OC03MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcGF5X2NvdXBvbl9lbHNlX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb3Vwb24ucHk6NjMtNjQKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKICAgIGIgcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDQKCnBheV9jb3Vwb25fYm9vbF9mYWxzZUAyNzoKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9jb3Vwb25fYm9vbF9tZXJnZUAyOAoKcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9ib29sX21lcmdlQDIxCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5jb3Vwb24uQ291cG9uVHJhbnNmZXJBZ2VudE1peGluLmFzc2V0X3RyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfdHJhbnNmZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9jb3Vwb24ucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTMtMTU4CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIGFuZCAoCiAgICAvLyAgICAgbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICkKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU0CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTMtMTU4CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIGFuZCAoCiAgICAvLyAgICAgbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICkKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU2CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU2LTE1NwogICAgLy8gbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF90cnVlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1NwogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDYKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1Mi0xNTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIGFuZCAoCiAgICAvLyAgICAgICAgIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICkKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNjktMTcxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMwogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICAhPQogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgbXVzdCBiZSBkaWZmZXJlbnQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5VTExfVFJBTlNGRVIKICAgIGRpZyAyCiAgICBkdXAKICAgIGFzc2VydCAvLyBUcmFuc2ZlciB1bml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5PVkVSX1RSQU5TRkVSCiAgICB1bmNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjMKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZQogICAgZXh0cmFjdCA0MCA4CiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2NAogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0cyA+IFVJbnQ2NCgwKToKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDYKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1OC01OQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMjAKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU3LTYwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjQ2LTQ3CiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NjktNzAKICAgIC8vICMgVHJhbnNmZXIgaXMgZm9yYmlkZGVuIGluIGNhc2Ugb2YgcGVuZGluZyBjb3Vwb24gcGF5bWVudHMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMsIGR1ZV9jb3Vwb25zKQogICAgc3dhcAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBidXJ5IDcKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MQogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAyCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgLT0gdW5pdHMKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1MgogICAgLy8gaWYgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPT0gVUludDY0KDApOgogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MAogICAgZGlnIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IFVJbnQ2NCgwKQogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzICs9IHVuaXRzCiAgICBkaWcgNQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvY291cG9uLnB5OjUzCiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZW5kZXJfdW5pdF92YWx1ZSArIGFjY3J1ZWRfaW50ZXJlc3QKICAgIGRpZyA0CiAgICAqCiAgICBkaWcgNQogICAgKwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9jb3Vwb24ucHk6OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAyMQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDk6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBkaWcgNQogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICBkaWcgMTAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NjgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zCiAgICBkaWcgNwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOAogICAgcHVzaGludCA0OAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA3CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X2NyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA3IG9mICh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0MgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Bc3NldE1ldGFkYXRhCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzYKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlcgogICAgYnl0ZWMgNiAvLyAweDUyMzIzMDIzCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzcKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmFzc2V0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBwdXNoaW50IDM4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDcgb2YgKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4WzMyXSwobGVuK3V0ZjhbXSkpCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDQyCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkFzc2V0TWV0YWRhdGEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4NC0yODcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI4OAogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBwdXNoaW50IDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzExCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNSAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE1CiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE2CiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBkdXAKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICBkaWcgMQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgYnVyeSA0CiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjAtMzIxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWF0KICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzE5LTMyMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfT1BFTklOR19EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IG9wZW5pbmcgZGF0ZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIzCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMy0zMjUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYXQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI4LTMyOQogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFhdCiAgICBzd2FwCiAgICBkaWcgMQogICAgPj0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyNy0zMzAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyAgICAgPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYXQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzMS0zMzMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzYKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPXNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPXNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uc2V0X2RlZmF1bHRfc3RhdHVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzQKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxOSAvLyAweDUyMzYzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTIKICAgIC8vIHNlbGYuYXNzZXRfZGVmYXVsdGVkID0gZGVmYXVsdGVkCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1MwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NS0xNDgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0NwogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDYtMTQ3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2LTE0OAogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDgKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ny0xNDgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBkaWcgMwogICAgPgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2LTE0OAogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ0LTE0OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4MwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODQKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg1CiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuWkVST19VTklUUwogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODYKICAgIC8vIGFzc2VydCBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMgPD0gc2VsZi50b3RhbF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4OAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArPSB1bml0cwogICAgYnl0ZWMgNCAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4OQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgKz0gdW5pdHMKICAgIGRpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozOTAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBzZWxmLnVuaXRfdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MQogICAgLy8gcmV0dXJuIHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfYXNzZXRfaW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hc3NldF9pbmZvOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDAzCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX1BFUkZPUk1BTlQpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA0CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IHNlbGYubWF0dXJpdHlfZGF0ZSA+IDA6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0CiAgICBkdXAKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA1CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQKICAgIGJ1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA2LTQwNwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBubyBncmFjZSBvciBkZWxpbnF1ZW5jeSBwZXJpb2RzCiAgICAvLyBpZiBzZWxmLmFzc2V0X2RlZmF1bHRlZDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2RlZmF1bHRlZCBleGlzdHMKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDA4CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX0RFRkFVTFRFRCkKICAgIHB1c2hpbnQgMwogICAgYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTEKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMgogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0NQogICAgLy8gcmV0dXJuIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBkdXAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTUKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMyAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE2CiAgICAvLyBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTcKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxOAogICAgLy8gdG90YWxfc3VwcGx5PXNlbGYudG90YWxfdW5pdHMsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyMQogICAgLy8gcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPXNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIyCiAgICAvLyBpc3N1YW5jZV9kYXRlPXNlbGYuaXNzdWFuY2VfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjMKICAgIC8vIG1hdHVyaXR5X2RhdGU9c2VsZi5tYXR1cml0eV9kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjQKICAgIC8vIHN1c3BlbmRlZD1zZWxmLmFzc2V0X3N1c3BlbmRlZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiYXNzZXRfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X3N1c3BlbmRlZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyNQogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBkaWcgMTUKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxMC00MjYKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5pZCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPXNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgLy8gICAgIHByaW5jaXBhbF9kaXNjb3VudD1hcmM0LlVJbnQxNihzZWxmLnByaW5jaXBhbF9kaXNjb3VudCksCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgLy8gICAgIHRvdGFsX3N1cHBseT1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUsCiAgICAvLyAgICAgaXNzdWFuY2VfZGF0ZT1zZWxmLmlzc3VhbmNlX2RhdGUsCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1zZWxmLm1hdHVyaXR5X2RhdGUsCiAgICAvLyAgICAgc3VzcGVuZGVkPXNlbGYuYXNzZXRfc3VzcGVuZGVkLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgdW5jb3ZlciAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDMwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF90aW1lX2V2ZW50c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzNgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDM3CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzOAogICAgLy8gdGltZV9ldmVudHMgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMzIgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKCmdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ1MAogICAgLy8gKHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUsIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDQ5LTQ1MQogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKQogICAgLy8gKQogICAgc3dhcAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF9hc3NldF9tZXRhZGF0YVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hc3NldF9tZXRhZGF0YToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ2MgogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhLmZyb21fYnl0ZXMoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ292X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2dvdl9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTEgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBwdXNoaW50IDU2CiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA1NgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjgKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA1IC8vIDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MgogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0NgogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDQtMTUwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPVVJbnQ2NCgwKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICkKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAzMCAvLyAweDAwCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9jbG9zZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfY2xvc2U6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxMiAvLyAweDUyMzQzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTcxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NAogICAgLy8gY2xvc2VkX3VuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NQogICAgLy8gZGVsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlYyA0IC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ4CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIGJueiBhY2NvdW50X2Nsb3NlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ5CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbm0uU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA1IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmFjY291bnRfY2xvc2VfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3OAogICAgLy8gcmV0dXJuIGNsb3NlZF91bml0cywgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgZGlnIDEKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwMgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMjIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDYgLy8gMHg1MjMyMzAyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzQKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMjEgLy8gMHg1MjMyMzUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnQgMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNiAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE5IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxMSAvLyAweDUyMzczMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzODMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjAgLy8gMHg1MjM1MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxOSAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzODMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gZGVsIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTEgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDIyIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMTIgLy8gMHg1MjM0MzAyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDE5IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMTEgLy8gMHg1MjM3MzAyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgYWRkcmVzcyksCiAgICBieXRlYyAxOCAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDMwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX2NvbmZpZzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTQKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NwogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYtMzI3CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI3CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMTggLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNzMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMAogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMwogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE5IC8vIDB4NTIzNjMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTUKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIwIC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDEyIC8vIDB4NTIzNDMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDItMzA0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OC0zMDAKICAgIC8vIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLlBlcnBldHVhbENvdXBvbkNhc2hmbG93TWl4aW4uY291bnRfZHVlX2NvdXBvbnMoKSAtPiB1aW50NjQ6CmNvdW50X2R1ZV9jb3Vwb25zOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzUxCiAgICAvLyBkZWYgY291bnRfZHVlX2NvdXBvbnMoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNTIKICAgIC8vIGR1ZV9jb3Vwb25zID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzUzCiAgICAvLyBjdXJyZW50X3RzID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzU0CiAgICAvLyBpZiBjdXJyZW50X3RzID4gc2VsZi5pc3N1YW5jZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzU1CiAgICAvLyBkdWVfY291cG9ucyA9IChjdXJyZW50X3RzIC0gc2VsZi5pc3N1YW5jZV9kYXRlKSAvLyBzZWxmLmNvdXBvbl9wZXJpb2QKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgLQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9wZXJpb2QgZXhpc3RzCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM1Ni0zNTcKICAgIC8vICAgICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX3BlcmlvZHMgY2hlY2tzCiAgICAvLyByZXR1cm4gZHVlX2NvdXBvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLlBlcnBldHVhbENvdXBvbkNhc2hmbG93TWl4aW4uY291cG9uX2R1ZV9kYXRlKGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9kdWVfZGF0ZToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM1OQogICAgLy8gZGVmIGNvdXBvbl9kdWVfZGF0ZShzZWxmLCBjb3Vwb246IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNjAKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgKyBjb3Vwb24gKiBzZWxmLmNvdXBvbl9wZXJpb2QKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgKwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6Mzc2CiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNzctMzc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM3OQogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzgyCiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCAtIGFjY3J1aW5nX3N0YXJ0X3RpbWUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHN3YXAKICAgIC0KICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzgzCiAgICAvLyBjb3Vwb25fcGVyaW9kID0gc2VsZi5jb3Vwb25fcGVyaW9kCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM4NAogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9PSBVSW50NjQoY3N0LkRDQ19BX0EpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGJueiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTYyCiAgICAvLyByZXR1cm4gdGltZV9wZXJpb2QgLy8gVUludDY0KGNzdC5EQVlfMl9TRUMpCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozODctMzkwCiAgICAvLyByZXR1cm4gdHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1jb3Vwb25fYWNjcnVlZF9wZXJpb2QsCiAgICAvLyAgICAgZGVub21pbmF0b3I9Y291cG9uX3BlcmlvZCwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzYzCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzY0CiAgICAvLyBpZiBkdWVfY291cG9ucyA+PSBVSW50NjQoMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozNjUKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAxCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAxCiAgICBiIGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uUGVycGV0dWFsQ291cG9uQ2FzaGZsb3dNaXhpbi5pc19hY2NydWluZ19pbnRlcmVzdChfZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0Ogppc19hY2NydWluZ19pbnRlcmVzdDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM5MgogICAgLy8gZGVmIGlzX2FjY3J1aW5nX2ludGVyZXN0KHNlbGYsIF9kdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOTMKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCmlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOTMKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY291cG9uLlBlcnBldHVhbENvdXBvbkNhc2hmbG93TWl4aW4uYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCwgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjM5NS0zOTcKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIHVuaXRzOiBVSW50NjQsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTozOTgtMzk5CiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IHNhZmVndWFyZHMgdGhlIHN1YnJvdXRpbmUgZnJvbSBmb3JiaWRkZW4gaW52b2NhdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDAxCiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQwMgogICAgLy8gY291cG9uX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDA0CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjQwNQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDQtNDA1CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDQtNDA2CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDcKICAgIC8vIC8vIChjc3QuQlBTICogY291cG9uX3BlcmlvZCkKICAgIGludGMgNCAvLyAxMDAwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weTo0MDQtNDA3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kKQogICAgLwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6NDAzLTQwOAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gICAgICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAgICAgLy8gKGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kKQogICAgLy8gKSAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uQ291cG9uQ2FzaGZsb3dNaXhpbi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmFsbF9kdWVfY291cG9uc19wYWlkOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MjYKICAgIC8vIGRlZiBhbGxfZHVlX2NvdXBvbnNfcGFpZChzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvdXBvbi5weToyNwogICAgLy8gcmV0dXJuIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgPj0gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIGR1ZV9jb3Vwb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjggLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBhaWRfY291cG9uX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICA+PQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb3Vwb24uQ291cG9uQ2FzaGZsb3dNaXhpbi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjI5LTMxCiAgICAvLyBkZWYgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY291cG9uLnB5OjMzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb3Vwb24ucHk6MzItMzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID09IGR1ZV9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLmNvbW1vbi5Db3JlRmluYW5jaWFsQ29tbW9uTWl4aW4uYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA3CiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDkKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTAKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwOS0xMTAKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA4LTExMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0KICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTEyCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4OgogICAgcHVzaGludCA3NQogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxMwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDEzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE3CiAgICAvLyB0aW1lX2kgPSB0aW1lX2V2ZW50c1tpZHhdCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTgKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW2lkeCArIDFdCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExOQogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTIwCiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyMS0xMjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2lmX2Vsc2VANDoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDUKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMzCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM2CiAgICAvLyBkZWYgYWNjb3VudF91bml0c192YWx1ZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQsIHVuaXRzOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM3CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzkKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDEKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDAtNDIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDcKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOAo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2626], "errorMessage": "Can not distribute zero units"}, {"pc": [1106], "errorMessage": "Coupon rates are not properly defined"}, {"pc": [990], "errorMessage": "D-ASA already configured"}, {"pc": [4367], "errorMessage": "Defaulted"}, {"pc": [997], "errorMessage": "Denomination asset is not properly set"}, {"pc": [1008], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [2643], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2112, 2207], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1096], "errorMessage": "Interest rate is not properly defined"}, {"pc": [1308, 1435, 1640, 2066, 2081, 2616, 3001, 3072, 3124, 3204, 3233], "errorMessage": "Invalid account holding address"}, {"pc": [3375, 3399, 3423, 3447, 3471, 3528, 3556, 3578, 3600, 3622, 3801, 3819, 3834, 3849, 3864], "errorMessage": "Invalid account role address"}, {"pc": [1326], "errorMessage": "Invalid amount of units for the account"}, {"pc": [1075], "errorMessage": "Invalid day-count convention ID"}, {"pc": [3512, 3791, 4429], "errorMessage": "Invalid role identifier"}, {"pc": [2487], "errorMessage": "Invalid secondary market closure date"}, {"pc": [2453], "errorMessage": "Invalid secondary market opening date"}, {"pc": [1041], "errorMessage": "Minimum denomination is not a divisor of principal"}, {"pc": [1649], "errorMessage": "No D-ASA units"}, {"pc": [1663], "errorMessage": "No due coupon to pay"}, {"pc": [1227, 1622, 1724, 2048, 2417, 2530, 2607, 2992, 3047, 3056, 3113, 3189, 3645, 4359], "errorMessage": "Not authorized"}, {"pc": [1778], "errorMessage": "Not enough funds for the payment"}, {"pc": [1240, 1667, 4114], "errorMessage": "Pending due coupon payment"}, {"pc": [2599], "errorMessage": "Primary distribution is closed"}, {"pc": [1297], "errorMessage": "Primary distribution not yet executed"}, {"pc": [2039], "errorMessage": "Secondary market is closed"}, {"pc": [2097], "errorMessage": "Sender and receiver must be different"}, {"pc": [2162], "errorMessage": "Sender and receiver units are not fungible"}, {"pc": [4263, 4375], "errorMessage": "Suspended operations"}, {"pc": [1118, 2422], "errorMessage": "Time events length is invalid"}, {"pc": [4136], "errorMessage": "Time events must be set in the future"}, {"pc": [4214], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [1177], "errorMessage": "Time period durations must be strictly greater than zero"}, {"pc": [1179], "errorMessage": "Time period repetitions are not properly defined"}, {"pc": [1163], "errorMessage": "Time periods are not properly defined"}, {"pc": [4236], "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)"}, {"pc": [2101], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [587], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [593], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [597], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [601], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1771], "errorMessage": "account opted into asset"}, {"pc": [1845], "errorMessage": "asset exists"}, {"pc": [4319, 4334], "errorMessage": "check BoxMap entry exists"}, {"pc": [1316, 1655, 1715, 1728, 1747, 1782, 1810, 2105, 2119, 2128, 2135, 2146, 2153, 2167, 2202, 2244, 2288, 2652, 4107, 4257, 4273, 4289], "errorMessage": "check self.account entry exists"}, {"pc": [3663, 4357], "errorMessage": "check self.arranger exists"}, {"pc": [2726, 4365], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [2828, 4373], "errorMessage": "check self.asset_suspended exists"}, {"pc": [1850, 2631, 2748, 3139, 4093], "errorMessage": "check self.circulating_units exists"}, {"pc": [3918, 3934, 3965], "errorMessage": "check self.coupon_period exists"}, {"pc": [2760, 3970, 4219], "errorMessage": "check self.day_count_convention exists"}, {"pc": [1841, 2738], "errorMessage": "check self.denomination_asset_id exists"}, {"pc": [1443, 1675, 2789, 4069], "errorMessage": "check self.interest_rate exists"}, {"pc": [2437, 2818, 3901, 3909, 3929, 3954, 4019, 4028], "errorMessage": "check self.issuance_date exists"}, {"pc": [2462, 2470, 2709, 2823], "errorMessage": "check self.maturity_date exists"}, {"pc": [2960], "errorMessage": "check self.metadata exists"}, {"pc": [1684, 1697], "errorMessage": "check self.op_daemon exists"}, {"pc": [1825, 4088], "errorMessage": "check self.paid_coupon_units exists"}, {"pc": [2591, 2814], "errorMessage": "check self.primary_distribution_closure_date exists"}, {"pc": [1281, 1291, 2577, 2809], "errorMessage": "check self.primary_distribution_opening_date exists"}, {"pc": [1090, 2774], "errorMessage": "check self.principal_discount exists"}, {"pc": [2023, 2033, 2501, 2938], "errorMessage": "check self.secondary_market_closure_date exists"}, {"pc": [2012, 2496, 2933], "errorMessage": "check self.secondary_market_opening_date exists"}, {"pc": [1736, 1765, 2743], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [988, 1465, 1567, 1618, 2001, 2412, 2566, 2908, 3051], "errorMessage": "check self.status exists"}, {"pc": [2921], "errorMessage": "check self.time_events exists"}, {"pc": [1580], "errorMessage": "check self.time_periods exists"}, {"pc": [1523], "errorMessage": "check self.total_coupons exists"}, {"pc": [2639, 2682, 2804], "errorMessage": "check self.total_units exists"}, {"pc": [1855, 2669, 2753], "errorMessage": "check self.unit_value exists"}, {"pc": [925, 947, 968, 1602, 2333, 2372, 2394, 2474, 3313, 4140], "errorMessage": "invalid array length header"}, {"pc": [2520, 2982, 3635], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [938], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1610, 3321], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [981], "errorMessage": "invalid number of bytes for arc4.dynamic_array>"}, {"pc": [959, 2405], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1267, 1427, 1596, 1980, 1988, 2310, 2553, 2974, 3031, 3039, 3105, 3175, 3183, 3225, 3249, 3273, 3307, 3495, 3677, 3761], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [919, 1219], "errorMessage": "invalid number of bytes for arc4.uint16"}, {"pc": [863, 872, 881, 890, 899, 1275, 1996, 2561], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [908, 3297, 3485, 3751], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2338, 2377], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata"}, {"pc": [2325, 2364], "errorMessage": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))"}, {"pc": [2320, 2359], "errorMessage": "invalid tuple encoding"}, {"pc": [2766, 2781, 2796, 2836], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" -APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) - -def _parse_abi_args(args: object | None = None) -> list[object] | None: - """Helper to parse ABI args into the format expected by underlying client""" - if args is None: - return None - - def convert_dataclass(value: object) -> object: - if dataclasses.is_dataclass(value): - return tuple(convert_dataclass(getattr(value, field.name)) for field in dataclasses.fields(value)) - elif isinstance(value, (list, tuple)): - return type(value)(convert_dataclass(item) for item in value) - return value - - match args: - case tuple(): - method_args = list(args) - case _ if dataclasses.is_dataclass(args): - method_args = [getattr(args, field.name) for field in dataclasses.fields(args)] - case _: - raise ValueError("Invalid 'args' type. Expected 'tuple' or 'TypedDict' for respective typed arguments.") - - return [ - convert_dataclass(arg) if not isinstance(arg, algokit_utils.AppMethodCallTransactionArgument) else arg - for arg in method_args - ] if method_args else None - -def _init_dataclass(cls: type, data: dict) -> object: - """ - Recursively instantiate a dataclass of type `cls` from `data`. - - For each field on the dataclass, if the field type is also a dataclass - and the corresponding data is a dict, instantiate that field recursively. - """ - field_values = {} - for field in dataclasses.fields(cls): - field_value = data.get(field.name) - # Check if the field expects another dataclass and the value is a dict. - if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict): - field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value) - else: - field_values[field.name] = field_value - return cls(**field_values) - -@dataclasses.dataclass(frozen=True) -class AccountInfo: - """Struct for AccountInfo""" - payment_address: str - units: int - unit_value: int - paid_coupons: int - suspended: bool - -@dataclasses.dataclass(frozen=True) -class AssetInfo: - """Struct for AssetInfo""" - denomination_asset_id: int - settlement_asset_id: int - outstanding_principal: int - unit_value: int - day_count_convention: int - principal_discount: int - interest_rate: int - total_supply: int - circulating_supply: int - primary_distribution_opening_date: int - primary_distribution_closure_date: int - issuance_date: int - maturity_date: int - suspended: bool - performance: int - -@dataclasses.dataclass(frozen=True) -class AssetMetadata: - """Struct for AssetMetadata""" - contract_type: int - calendar: int - business_day_convention: int - end_of_month_convention: int - prepayment_effect: int - penalty_type: int - prospectus_hash: bytes - prospectus_url: str - -@dataclasses.dataclass(frozen=True) -class DayCountFactor: - """Struct for DayCountFactor""" - numerator: int - denominator: int - -@dataclasses.dataclass(frozen=True) -class CouponsInfo: - """Struct for CouponsInfo""" - total_coupons: int - due_coupons: int - next_coupon_due_date: int - day_count_factor: DayCountFactor - all_due_coupons_paid: bool - -@dataclasses.dataclass(frozen=True) -class CurrentUnitsValue: - """Struct for CurrentUnitsValue""" - units_value: int - accrued_interest: int - day_count_factor: DayCountFactor - -@dataclasses.dataclass(frozen=True) -class PaymentAmounts: - """Struct for PaymentAmounts""" - interest: int - principal: int - -@dataclasses.dataclass(frozen=True) -class PaymentResult: - """Struct for PaymentResult""" - amount: int - timestamp: int - context: bytes - -@dataclasses.dataclass(frozen=True) -class RoleConfig: - """Struct for RoleConfig""" - role_validity_start: int - role_validity_end: int - -@dataclasses.dataclass(frozen=True) -class SecondaryMarketSchedule: - """Struct for SecondaryMarketSchedule""" - secondary_market_opening_date: int - secondary_market_closure_date: int - - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetConfigArgs: - """Dataclass for asset_config arguments""" - denomination_asset_id: int - settlement_asset_id: int - principal: int - principal_discount: int - minimum_denomination: int - day_count_convention: int - interest_rate: int - coupon_rates: list[int] - time_events: list[int] - time_periods: list[tuple[int, int]] - - @property - def abi_method_signature(self) -> str: - return "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class UpdateInterestRateArgs: - """Dataclass for update_interest_rate arguments""" - interest_rate: int - - @property - def abi_method_signature(self) -> str: - return "update_interest_rate(uint16)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class GetAccountUnitsCurrentValueArgs: - """Dataclass for get_account_units_current_value arguments""" - holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class GetPaymentAmountArgs: - """Dataclass for get_payment_amount arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "get_payment_amount(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PayCouponArgs: - """Dataclass for pay_coupon arguments""" - holding_address: str - payment_info: bytes | str - - @property - def abi_method_signature(self) -> str: - return "pay_coupon(address,byte[])(uint64,uint64,byte[])" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetTransferArgs: - """Dataclass for asset_transfer arguments""" - sender_holding_address: str - receiver_holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "asset_transfer(address,address,uint64)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class SetSecondaryTimeEventsArgs: - """Dataclass for set_secondary_time_events arguments""" - secondary_market_time_events: list[int] - - @property - def abi_method_signature(self) -> str: - return "set_secondary_time_events(uint64[])(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class SetDefaultStatusArgs: - """Dataclass for set_default_status arguments""" - defaulted: bool - - @property - def abi_method_signature(self) -> str: - return "set_default_status(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PrimaryDistributionArgs: - """Dataclass for primary_distribution arguments""" - holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "primary_distribution(address,uint64)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGovSuspensionArgs: - """Dataclass for account_gov_suspension arguments""" - holding_address: str - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "account_gov_suspension(address,bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountOpenArgs: - """Dataclass for account_open arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_open(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountCloseArgs: - """Dataclass for account_close arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_close(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountUpdatePaymentAddressArgs: - """Dataclass for account_update_payment_address arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_update_payment_address(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGetInfoArgs: - """Dataclass for account_get_info arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_get_info(address)(address,uint64,uint64,uint64,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRotateArrangerArgs: - """Dataclass for rbac_rotate_arranger arguments""" - new_arranger: str - - @property - def abi_method_signature(self) -> str: - return "rbac_rotate_arranger(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacSetOpDaemonArgs: - """Dataclass for rbac_set_op_daemon arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_set_op_daemon(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacAssignRoleArgs: - """Dataclass for rbac_assign_role arguments""" - role_id: int - role_address: str - config: bytes | str - - @property - def abi_method_signature(self) -> str: - return "rbac_assign_role(uint8,address,byte[])uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRevokeRoleArgs: - """Dataclass for rbac_revoke_role arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_revoke_role(uint8,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGovAssetSuspensionArgs: - """Dataclass for rbac_gov_asset_suspension arguments""" - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "rbac_gov_asset_suspension(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetAddressRolesArgs: - """Dataclass for rbac_get_address_roles arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetRoleConfigArgs: - """Dataclass for rbac_get_role_config arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_role_config(uint8,address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetCreateArgs: - """Dataclass for asset_create arguments""" - arranger: str - metadata: AssetMetadata - - @property - def abi_method_signature(self) -> str: - return "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetUpdateArgs: - """Dataclass for asset_update arguments""" - metadata: AssetMetadata - - @property - def abi_method_signature(self) -> str: - return "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - - -class _PerpetualBondUpdate: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppUpdateMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - return self.app_client.params.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - -class PerpetualBondParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_PerpetualBondUpdate": - return _PerpetualBondUpdate(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - })) - - def update_interest_rate( - self, - args: tuple[int] | UpdateInterestRateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "update_interest_rate(uint16)uint64", - "args": method_args, - })) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - })) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - })) - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - })) - - def get_time_periods( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_periods()(uint64,uint64)[]", - })) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - })) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - })) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - })) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - })) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - })) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - })) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - })) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - })) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> algokit_utils.AppCallParams: - return self.app_client.params.bare.clear_state( - params, - - ) - - -class _PerpetualBondUpdateTransaction: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - return self.app_client.create_transaction.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - -class PerpetualBondCreateTransactionParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_PerpetualBondUpdateTransaction": - return _PerpetualBondUpdateTransaction(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - })) - - def update_interest_rate( - self, - args: tuple[int] | UpdateInterestRateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "update_interest_rate(uint16)uint64", - "args": method_args, - })) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - })) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - })) - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - })) - - def get_time_periods( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_periods()(uint64,uint64)[]", - })) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - })) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - })) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - })) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - })) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - })) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - })) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - })) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - })) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> Transaction: - return self.app_client.create_transaction.bare.clear_state( - params, - - ) - - -class _PerpetualBondUpdateSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - response = self.app_client.send.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - }), send_params=send_params, compilation_params=compilation_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppUpdateTransactionResult[None], parsed_response) - - -class PerpetualBondSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_PerpetualBondUpdateSend": - return _PerpetualBondUpdateSend(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[None], parsed_response) - - def update_interest_rate( - self, - args: tuple[int] | UpdateInterestRateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "update_interest_rate(uint16)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[CurrentUnitsValue]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CurrentUnitsValue, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[CurrentUnitsValue], parsed_response) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentAmounts]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentAmounts, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentAmounts], parsed_response) - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[CouponsInfo]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CouponsInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[CouponsInfo], parsed_response) - - def get_time_periods( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[tuple[int, int]]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_periods()(uint64,uint64)[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[tuple[int, int]]], parsed_response) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentResult]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentResult, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentResult], parsed_response) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[SecondaryMarketSchedule]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(SecondaryMarketSchedule, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[SecondaryMarketSchedule], parsed_response) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AssetInfo]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AssetInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AssetInfo], parsed_response) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AssetMetadata]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AssetMetadata, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AssetMetadata], parsed_response) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[int, int]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[int, int]], parsed_response) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AccountInfo]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AccountInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AccountInfo], parsed_response) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[str]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[str], parsed_response) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[RoleConfig]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleConfig, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[RoleConfig], parsed_response) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[None], parsed_response) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[algokit_utils.ABIReturn]: - return self.app_client.send.bare.clear_state( - params, - send_params=send_params, - ) - - -class GlobalStateValue(typing.TypedDict): - """Shape of global_state state key values""" - arranger: str - op_daemon: str - asset_suspended: int - asset_defaulted: int - total_units: int - circulating_units: int - unit_value: int - status: int - denomination_asset_id: int - settlement_asset_id: int - day_count_convention: int - metadata: bytes - principal_discount: int - interest_rate: int - total_coupons: int - primary_distribution_opening_date: int - primary_distribution_closure_date: int - issuance_date: int - secondary_market_opening_date: int - secondary_market_closure_date: int - maturity_date: int - paid_coupon_units: int - coupon_period: int - -class BoxStateValue(typing.TypedDict): - """Shape of box state key values""" - time_events: list[int] - time_periods: list[tuple[int, int]] - -class PerpetualBondState: - """Methods to access state for the current PerpetualBond app""" - - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def global_state( - self - ) -> "_GlobalState": - """Methods to access global_state for the current app""" - return _GlobalState(self.app_client) - - @property - def box( - self - ) -> "_BoxState": - """Methods to access box for the current app""" - return _BoxState(self.app_client) - -class _GlobalState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = {} - - def get_all(self) -> GlobalStateValue: - """Get all current keyed values from global_state state""" - result = self.app_client.state.global_state.get_all() - if not result: - return typing.cast(GlobalStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.global_state.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(GlobalStateValue, converted) - - @property - def arranger(self) -> str: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def op_daemon(self) -> str: - """Get the current value of the op_daemon key in global_state state""" - value = self.app_client.state.global_state.get_value("op_daemon") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def asset_suspended(self) -> int: - """Get the current value of the asset_suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def asset_defaulted(self) -> int: - """Get the current value of the asset_defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def status(self) -> int: - """Get the current value of the status key in global_state state""" - value = self.app_client.state.global_state.get_value("status") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMBytes"], value) # type: ignore - return typing.cast(bytes, value) - - @property - def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def primary_distribution_opening_date(self) -> int: - """Get the current value of the primary_distribution_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def secondary_market_opening_date(self) -> int: - """Get the current value of the secondary_market_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def paid_coupon_units(self) -> int: - """Get the current value of the paid_coupon_units key in global_state state""" - value = self.app_client.state.global_state.get_value("paid_coupon_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def coupon_period(self) -> int: - """Get the current value of the coupon_period key in global_state state""" - value = self.app_client.state.global_state.get_value("coupon_period") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - -class _BoxState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = { - "RoleConfig": RoleConfig, - "AccountInfo": AccountInfo - } - - def get_all(self) -> BoxStateValue: - """Get all current keyed values from box state""" - result = self.app_client.state.box.get_all() - if not result: - return typing.cast(BoxStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.box.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(BoxStateValue, converted) - - @property - def time_events(self) -> list[int]: - """Get the current value of the time_events key in box state""" - value = self.app_client.state.box.get_value("time_events") - if isinstance(value, dict) and "uint64[]" in self._struct_classes: - return _init_dataclass(self._struct_classes["uint64[]"], value) # type: ignore - return typing.cast(list[int], value) - - @property - def time_periods(self) -> list[tuple[int, int]]: - """Get the current value of the time_periods key in box state""" - value = self.app_client.state.box.get_value("time_periods") - if isinstance(value, dict) and "(uint64,uint64)[]" in self._struct_classes: - return _init_dataclass(self._struct_classes["(uint64,uint64)[]"], value) # type: ignore - return typing.cast(list[tuple[int, int]], value) - - @property - def account_manager(self) -> "_MapState[str, RoleConfig]": - """Get values from the account_manager map in box state""" - return _MapState( - self.app_client.state.box, - "account_manager", - self._struct_classes.get("RoleConfig") - ) - - @property - def primary_dealer(self) -> "_MapState[str, RoleConfig]": - """Get values from the primary_dealer map in box state""" - return _MapState( - self.app_client.state.box, - "primary_dealer", - self._struct_classes.get("RoleConfig") - ) - - @property - def trustee(self) -> "_MapState[str, RoleConfig]": - """Get values from the trustee map in box state""" - return _MapState( - self.app_client.state.box, - "trustee", - self._struct_classes.get("RoleConfig") - ) - - @property - def authority(self) -> "_MapState[str, RoleConfig]": - """Get values from the authority map in box state""" - return _MapState( - self.app_client.state.box, - "authority", - self._struct_classes.get("RoleConfig") - ) - - @property - def interest_oracle(self) -> "_MapState[str, RoleConfig]": - """Get values from the interest_oracle map in box state""" - return _MapState( - self.app_client.state.box, - "interest_oracle", - self._struct_classes.get("RoleConfig") - ) - - @property - def account(self) -> "_MapState[str, AccountInfo]": - """Get values from the account map in box state""" - return _MapState( - self.app_client.state.box, - "account", - self._struct_classes.get("AccountInfo") - ) - -_KeyType = typing.TypeVar("_KeyType") -_ValueType = typing.TypeVar("_ValueType") - -class _AppClientStateMethodsProtocol(typing.Protocol): - def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: - ... - def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: - ... - -class _MapState(typing.Generic[_KeyType, _ValueType]): - """Generic class for accessing state maps with strongly typed keys and values""" - - def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, - struct_class: typing.Type[_ValueType] | None = None): - self._state_accessor = state_accessor - self._map_name = map_name - self._struct_class = struct_class - - def get_map(self) -> dict[_KeyType, _ValueType]: - """Get all current values in the map""" - result = self._state_accessor.get_map(self._map_name) - if self._struct_class and result: - return {k: _init_dataclass(self._struct_class, v) if isinstance(v, dict) else v - for k, v in result.items()} # type: ignore - return typing.cast(dict[_KeyType, _ValueType], result or {}) - - def get_value(self, key: _KeyType) -> _ValueType | None: - """Get a value from the map by key""" - key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore - value = self._state_accessor.get_map_value(self._map_name, key_value) - if value is not None and self._struct_class and isinstance(value, dict): - return _init_dataclass(self._struct_class, value) # type: ignore - return typing.cast(_ValueType | None, value) - - -class PerpetualBondClient: - """Client for interacting with PerpetualBond smart contract""" - - @typing.overload - def __init__(self, app_client: algokit_utils.AppClient) -> None: ... - - @typing.overload - def __init__( - self, - *, - algorand: _AlgoKitAlgorandClient, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: ... - - def __init__( - self, - app_client: algokit_utils.AppClient | None = None, - *, - algorand: _AlgoKitAlgorandClient | None = None, - app_id: int | None = None, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: - if app_client: - self.app_client = app_client - elif algorand and app_id: - self.app_client = algokit_utils.AppClient( - algokit_utils.AppClientParams( - algorand=algorand, - app_spec=APP_SPEC, - app_id=app_id, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - else: - raise ValueError("Either app_client or algorand and app_id must be provided") - - self.params = PerpetualBondParams(self.app_client) - self.create_transaction = PerpetualBondCreateTransactionParams(self.app_client) - self.send = PerpetualBondSend(self.app_client) - self.state = PerpetualBondState(self.app_client) - - @staticmethod - def from_creator_and_name( - creator_address: str, - app_name: str, - algorand: _AlgoKitAlgorandClient, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - ) -> "PerpetualBondClient": - return PerpetualBondClient( - algokit_utils.AppClient.from_creator_and_name( - creator_address=creator_address, - app_name=app_name, - app_spec=APP_SPEC, - algorand=algorand, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ignore_cache=ignore_cache, - app_lookup_cache=app_lookup_cache, - ) - ) - - @staticmethod - def from_network( - algorand: _AlgoKitAlgorandClient, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "PerpetualBondClient": - return PerpetualBondClient( - algokit_utils.AppClient.from_network( - app_spec=APP_SPEC, - algorand=algorand, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - @property - def app_id(self) -> int: - return self.app_client.app_id - - @property - def app_address(self) -> str: - return self.app_client.app_address - - @property - def app_name(self) -> str: - return self.app_client.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_client.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_client.algorand - - def clone( - self, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "PerpetualBondClient": - return PerpetualBondClient( - self.app_client.clone( - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - def new_group(self) -> "PerpetualBondComposer": - return PerpetualBondComposer(self) - - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["update_interest_rate(uint16)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))"], - return_value: algokit_utils.ABIReturn | None - ) -> CurrentUnitsValue | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_payment_amount(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentAmounts | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> CouponsInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_time_periods()(uint64,uint64)[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[tuple[int, int]] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["pay_coupon(address,byte[])(uint64,uint64,byte[])"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentResult | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_transfer(address,address,uint64)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["set_secondary_time_events(uint64[])(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> SecondaryMarketSchedule | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["set_default_status(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["primary_distribution(address,uint64)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)"], - return_value: algokit_utils.ABIReturn | None - ) -> AssetInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_time_events()uint64[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_secondary_market_schedule()uint64[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)"], - return_value: algokit_utils.ABIReturn | None - ) -> AssetMetadata | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_gov_suspension(address,bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_open(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_close(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[int, int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_update_payment_address(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_get_info(address)(address,uint64,uint64,uint64,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> AccountInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_rotate_arranger(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_set_op_daemon(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_assign_role(uint8,address,byte[])uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_revoke_role(uint8,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_arranger()address"], - return_value: algokit_utils.ABIReturn | None - ) -> str | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_address_roles(address)(bool,bool,bool,bool,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[bool, bool, bool, bool, bool] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_role_config(uint8,address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> RoleConfig | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None: ... - - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | AccountInfo | AssetInfo | AssetMetadata | CouponsInfo | CurrentUnitsValue | None | PaymentAmounts | PaymentResult | RoleConfig | SecondaryMarketSchedule | int | list[int] | list[tuple[int, int]] | str | tuple[bool, bool, bool, bool, bool] | tuple[int, int]: - """Decode ABI return value for the given method.""" - if return_value is None: - return None - - arc56_method = self.app_spec.get_arc56_method(method) - decoded = return_value.get_arc56_value(arc56_method, self.app_spec.structs) - - # If method returns a struct, convert the dict to appropriate dataclass - if (arc56_method and - arc56_method.returns and - arc56_method.returns.struct and - isinstance(decoded, dict)): - struct_class = globals().get(arc56_method.returns.struct) - if struct_class: - return struct_class(**typing.cast(dict, decoded)) - return decoded - - -@dataclasses.dataclass(frozen=True) -class PerpetualBondMethodCallCreateParams( - algokit_utils.AppClientCreateSchema, algokit_utils.BaseAppClientMethodCallParams[ - AssetCreateArgs, - str | None, - ] -): - """Parameters for creating PerpetualBond contract using ABI""" - on_complete: typing.Literal[OnComplete.NoOpOC] | None = None - method: str | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallCreateParams: - method_args = _parse_abi_args(self.args) - return algokit_utils.AppClientMethodCallCreateParams( - **{ - **self.__dict__, - "method": self.method or getattr(self.args, "abi_method_signature", None), - "args": method_args, - } - ) - -@dataclasses.dataclass(frozen=True) -class PerpetualBondMethodCallUpdateParams( - algokit_utils.BaseAppClientMethodCallParams[ - AssetUpdateArgs, - str | None, - ] -): - """Parameters for calling PerpetualBond contract using ABI""" - on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None - method: str | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallParams: - method_args = _parse_abi_args(self.args) - return algokit_utils.AppClientMethodCallParams( - **{ - **self.__dict__, - "method": self.method or getattr(self.args, "abi_method_signature", None), - "args": method_args, - } - ) - -class PerpetualBondFactory(algokit_utils.TypedAppFactoryProtocol[PerpetualBondMethodCallCreateParams, PerpetualBondMethodCallUpdateParams, None]): - """Factory for deploying and managing PerpetualBondClient smart contracts""" - - def __init__( - self, - algorand: _AlgoKitAlgorandClient, - *, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - version: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ): - self.app_factory = algokit_utils.AppFactory( - params=algokit_utils.AppFactoryParams( - algorand=algorand, - app_spec=APP_SPEC, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - version=version, - compilation_params=compilation_params, - ) - ) - self.params = PerpetualBondFactoryParams(self.app_factory) - self.create_transaction = PerpetualBondFactoryCreateTransaction(self.app_factory) - self.send = PerpetualBondFactorySend(self.app_factory) - - @property - def app_name(self) -> str: - return self.app_factory.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_factory.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_factory.algorand - - def deploy( - self, - *, - on_update: algokit_utils.OnUpdate | None = None, - on_schema_break: algokit_utils.OnSchemaBreak | None = None, - create_params: PerpetualBondMethodCallCreateParams | None = None, - update_params: PerpetualBondMethodCallUpdateParams | None = None, - delete_params: None = None, - existing_deployments: algokit_utils.ApplicationLookup | None = None, - ignore_cache: bool = False, - app_name: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - send_params: algokit_utils.SendParams | None = None, - ) -> tuple[PerpetualBondClient, algokit_utils.AppFactoryDeployResult]: - """Deploy the application""" - deploy_response = self.app_factory.deploy( - on_update=on_update, - on_schema_break=on_schema_break, - create_params=create_params.to_algokit_utils_params() if create_params else None, - update_params=update_params.to_algokit_utils_params() if update_params else None, - delete_params=delete_params, - existing_deployments=existing_deployments, - ignore_cache=ignore_cache, - app_name=app_name, - compilation_params=compilation_params, - send_params=send_params, - ) - - return PerpetualBondClient(deploy_response[0]), deploy_response[1] - - def get_app_client_by_creator_and_name( - self, - creator_address: str, - app_name: str, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> PerpetualBondClient: - """Get an app client by creator address and name""" - return PerpetualBondClient( - self.app_factory.get_app_client_by_creator_and_name( - creator_address, - app_name, - default_sender, - default_signer, - ignore_cache, - app_lookup_cache, - approval_source_map, - clear_source_map, - ) - ) - - def get_app_client_by_id( - self, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> PerpetualBondClient: - """Get an app client by app ID""" - return PerpetualBondClient( - self.app_factory.get_app_client_by_id( - app_id, - app_name, - default_sender, - default_signer, - approval_source_map, - clear_source_map, - ) - ) - - -class PerpetualBondFactoryParams: - """Parameters for creating transactions for PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = PerpetualBondFactoryCreateParams(app_factory) - self.update = PerpetualBondFactoryUpdateParams(app_factory) - self.delete = PerpetualBondFactoryDeleteParams(app_factory) - -class PerpetualBondFactoryCreateParams: - """Parameters for 'create' operations of PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateParams: - """Creates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - compilation_params=compilation_params) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def update_interest_rate( - self, - args: tuple[int] | UpdateInterestRateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the update_interest_rate(uint16)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "update_interest_rate(uint16)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_payment_amount(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_coupons_status( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_time_periods( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_time_periods()(uint64,uint64)[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_time_periods()(uint64,uint64)[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the pay_coupon(address,byte[])(uint64,uint64,byte[]) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "pay_coupon(address,byte[])(uint64,uint64,byte[])", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_transfer(address,address,uint64)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_secondary_time_events(uint64[])(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_default_status(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the primary_distribution(address,uint64)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_asset_info( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_time_events( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_time_events()uint64[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_secondary_market_schedule( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_secondary_market_schedule()uint64[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_asset_metadata( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_gov_suspension(address,bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_open(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_close(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_update_payment_address(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_get_info(address)(address,uint64,uint64,uint64,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_rotate_arranger(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_set_op_daemon(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_assign_role(uint8,address,byte[])uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_revoke_role(uint8,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_arranger( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_arranger()address ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_address_roles(address)(bool,bool,bool,bool,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_role_config(uint8,address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - -class PerpetualBondFactoryUpdateParams: - """Parameters for 'update' operations of PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppUpdateParams: - """Updates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_update( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - -class PerpetualBondFactoryDeleteParams: - """Parameters for 'delete' operations of PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppDeleteParams: - """Deletes an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_delete( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - - -class PerpetualBondFactoryCreateTransaction: - """Create transactions for PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = PerpetualBondFactoryCreateTransactionCreate(app_factory) - - -class PerpetualBondFactoryCreateTransactionCreate: - """Create new instances of PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - params: algokit_utils.CommonAppCallCreateParams | None = None, - ) -> Transaction: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.create_transaction.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - ) - - -class PerpetualBondFactorySend: - """Send calls to PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = PerpetualBondFactorySendCreate(app_factory) - - -class PerpetualBondFactorySendCreate: - """Send create calls to PerpetualBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ) -> tuple[PerpetualBondClient, algokit_utils.SendAppCreateTransactionResult]: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - result = self.app_factory.send.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - send_params=send_params, - compilation_params=compilation_params - ) - return PerpetualBondClient(result[0]), result[1] - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> tuple[PerpetualBondClient, algokit_utils.AppFactoryCreateMethodCallResult[None]]: - """Creates and sends a transaction using the asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - client, result = self.app_factory.send.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - send_params=send_params, - compilation_params=compilation_params - ) - return_value = None if result.abi_return is None else typing.cast(None, result.abi_return) - - return PerpetualBondClient(client), algokit_utils.AppFactoryCreateMethodCallResult[None]( - **{ - **result.__dict__, - "app_id": result.app_id, - "abi_return": return_value, - "transaction": result.transaction, - "confirmation": result.confirmation, - "group_id": result.group_id, - "tx_ids": result.tx_ids, - "transactions": result.transactions, - "confirmations": result.confirmations, - "app_address": result.app_address, - } - ) - - -class _PerpetualBondUpdateComposer: - def __init__(self, composer: "PerpetualBondComposer"): - self.composer = composer - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self.composer._composer.add_app_update_method_call( - self.composer.client.params.update.asset_update( - args=args, - params=params, - compilation_params=compilation_params - ) - ) - self.composer._result_mappers.append( - lambda v: self.composer.client.decode_return_value( - "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", v - ) - ) - return self.composer - - -class PerpetualBondComposer: - """Composer for creating transaction groups for PerpetualBond contract calls""" - - def __init__(self, client: "PerpetualBondClient"): - self.client = client - self._composer = client.algorand.new_group() - self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] - - @property - def update(self) -> "_PerpetualBondUpdateComposer": - return _PerpetualBondUpdateComposer(self) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", v - ) - ) - return self - - def update_interest_rate( - self, - args: tuple[int] | UpdateInterestRateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.update_interest_rate( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "update_interest_rate(uint16)uint64", v - ) - ) - return self - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_account_units_current_value( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", v - ) - ) - return self - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_payment_amount( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_payment_amount(address)(uint64,uint64)", v - ) - ) - return self - - def get_coupons_status( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_coupons_status( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", v - ) - ) - return self - - def get_time_periods( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_time_periods( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_time_periods()(uint64,uint64)[]", v - ) - ) - return self - - def pay_coupon( - self, - args: tuple[str, bytes | str] | PayCouponArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.pay_coupon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "pay_coupon(address,byte[])(uint64,uint64,byte[])", v - ) - ) - return self - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_transfer( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_transfer(address,address,uint64)uint64", v - ) - ) - return self - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.set_secondary_time_events( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "set_secondary_time_events(uint64[])(uint64,uint64)", v - ) - ) - return self - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.set_default_status( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "set_default_status(bool)uint64", v - ) - ) - return self - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.primary_distribution( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "primary_distribution(address,uint64)uint64", v - ) - ) - return self - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_asset_info( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", v - ) - ) - return self - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_time_events( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_time_events()uint64[]", v - ) - ) - return self - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_secondary_market_schedule( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_secondary_market_schedule()uint64[]", v - ) - ) - return self - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_asset_metadata( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", v - ) - ) - return self - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_gov_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_gov_suspension(address,bool)uint64", v - ) - ) - return self - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_open( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_open(address,address)uint64", v - ) - ) - return self - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_close( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_close(address)(uint64,uint64)", v - ) - ) - return self - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_update_payment_address( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_update_payment_address(address,address)uint64", v - ) - ) - return self - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_get_info( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_get_info(address)(address,uint64,uint64,uint64,bool)", v - ) - ) - return self - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_rotate_arranger( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_rotate_arranger(address)uint64", v - ) - ) - return self - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_set_op_daemon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_set_op_daemon(address)uint64", v - ) - ) - return self - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_assign_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_assign_role(uint8,address,byte[])uint64", v - ) - ) - return self - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_revoke_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_revoke_role(uint8,address)uint64", v - ) - ) - return self - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_gov_asset_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_gov_asset_suspension(bool)uint64", v - ) - ) - return self - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_arranger( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_arranger()address", v - ) - ) - return self - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_address_roles( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", v - ) - ) - return self - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_role_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_role_config(uint8,address)(uint64,uint64)", v - ) - ) - return self - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "PerpetualBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_create( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", v - ) - ) - return self - - def clear_state( - self, - *, - args: list[bytes] | None = None, - params: algokit_utils.CommonAppCallParams | None = None, - ) -> "PerpetualBondComposer": - params=params or algokit_utils.CommonAppCallParams() - self._composer.add_app_call( - self.client.params.clear_state( - algokit_utils.AppClientBareCallParams( - **{ - **dataclasses.asdict(params), - "args": args - } - ) - ) - ) - return self - - def add_transaction( - self, txn: Transaction, signer: TransactionSigner | None = None - ) -> "PerpetualBondComposer": - self._composer.add_transaction(txn, signer) - return self - - def composer(self) -> algokit_utils.TransactionComposer: - return self._composer - - def simulate( - self, - allow_more_logs: bool | None = None, - allow_empty_signatures: bool | None = None, - allow_unnamed_resources: bool | None = None, - extra_opcode_budget: int | None = None, - exec_trace_config: SimulateTraceConfig | None = None, - simulation_round: int | None = None, - skip_signatures: bool | None = None, - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.simulate( - allow_more_logs=allow_more_logs, - allow_empty_signatures=allow_empty_signatures, - allow_unnamed_resources=allow_unnamed_resources, - extra_opcode_budget=extra_opcode_budget, - exec_trace_config=exec_trace_config, - simulation_round=simulation_round, - skip_signatures=skip_signatures, - ) - - def send( - self, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.send(send_params) diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.puya.map b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.puya.map deleted file mode 100644 index 68771202..00000000 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.puya.map +++ /dev/null @@ -1,31961 +0,0 @@ -{ - "version": 3, - "sources": [ - "../../../modules/accounting.py", - "../../../modules/actus/pam.py", - "../../../modules/core_financial/common.py", - "../../../modules/core_financial/no_coupon.py", - "../../../modules/payment_agent/common.py", - "../../../modules/payment_agent/principal.py", - "../../../modules/rbac.py", - "../../../modules/transfer_agent/no_coupon.py", - "../../zero_coupon_bond/contract.py" - ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AM8BmD;;AAAf;;AAA5B;AAC4C;;AAAf;;AAA7B;AAgBA;;AAAuB;AAAvB;AACA;;AAAuB;AAAvB;AN9BA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AACA;;AAAkB;AAAlB;AACA;AAAc;AAAd;AEUA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAA0B;AAA1B;AACA;;AAAqB;AAArB;AACA;;AAAqB;AAArB;AAIA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AMzBO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAlBR;;;;;;AAAA;;;AAAA;;;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;;;;;AAAA;;;AAAA;;;;AAAA;AN2QK;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AD7PA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;ACyMG;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AA5KmB;;AAAA;;AAAA;;AACnB;AAGA;;AAAA;;AAAA;AAKI;;AAAA;;AAAA;AADJ;AAKA;;AAAA;;AAAA;AAEA;AAIQ;;AAFW;;AACF;;;;;;;;;AAHjB;;;;;;AAAA;AAwKO;;AAAA;;AAAA;AAAA;AAAP;AACA;;AAAA;;AAAA;AACmB;;AAAA;;AAAA;AAAnB;;AAAA;AAAA;AACA;;AAAA;;AAAA;AAGiC;AAAA;AArK1B;;;AAAA;AAEH;;;AAFG;AAAA;;;;AAAP;AAMA;;AAAA;;AAAA;AAmK0B;;AAAA;AC1OnB;AAAA;AAAP;AD+EA;;AAAA;AAAA;AAGO;;AAAA;AAAA;AAAP;AAGA;;AAAA;;AAAA;AAI+C;;AAArB;AAAtB;;AAAA;AADJ;AA2JA;;AAAA;;;AAnIA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;AAAA;;;AAAA;;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;;AAAA;AAArB;;AAAA;AAAA;AACiC;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;AAGO;;AAAA;AAAP;AA+HA;AAAc;;AAAd;AD/OH;AAAA;;;;;;;;;;AEgCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBO;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;;AADJ;AH9C0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;AGmDO;AAAA;;;AAAa;;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAJ;;;;AAAP;AAE8B;AAAA;;;AAAA;AAAA;;AAEI;AAAA;;AAAA;AAAA;AAA9B;;AAAA;AAAyD;;;AAAzD;AAIA;AAAA;;AAIe;AAAnB;;AACY;AAAZ;;AACc;AAAd;;AAjEO;AAAA;;AAAA;AAAA;AAAsB;;AAAA;AAAA;;AAAtB;AAAA;;;AAAgD;AAAA;;AAAA;AAAA;AAA1B;;AAAA;AAAtB;;;;AAoEf;;;AAC+B;;;AACA;;AAAA;;AAAA;;;AAAA;;AACP;AAAA;AAAA;AAAA;;AACE;AAAA;AAAA;;AAGf;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AAAX;;;;;;;AAM6B;;AAAA;AAAA;;AAAA;AAAA;AAHd;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAnDV;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;AA4DA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AHvF6B;AAAnB;AAAA;AAAA;AAAA;;AAAP;AGuGmB;AH7GZ;AAAA;AAAA;AAAA;AAAe;;AAAf;AG8Gf;;;AAC+B;;AAAA;;;AAAA;;AACY;AAA5B;AAAA;;AAAA;AAAA;AAnBV;AAAA;AAAA;AAAA;AAAA;AAAA;AExFA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;ALLU;AAAA;AAAA;AAAA;AAAe;;AAAf;ACRP;AACA;;;AACA;;;ADY0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;ACVQ;AAAA;AAAA;AAAA;AACR;AACO;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AAAP;AE8BO;;;ACxCJ;AAAA;;AAAA;AAAA;AAAwB;;AAAxB;AAAX;;;AAEgB;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAA;;;AACG;;AAAA;;AAAA;AADH;;;AAEG;;AAAc;;AAAA;AAAA;AAAA;;;AAAd;AAFH;;;;AADJ;AAQA;;AAAA;AAAA;AAAA;;;AACI;AAAA;;AAAA;AAAA;AADJ;;AAAA;;AAAA;;;AAGQ;;AAAA;AAAA;AAAA;;;AAAA;AAAJ;;;;AC+BhB;;;AD1B6C;;AAAjC;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AADJ;AC+Ba;;AAAA;AAAA;AAAA;;;ADzBb;AAIQ;;;;;;;;;;;;AAJR;;;;;;AAAA;AFoKA;AAAA;AAAA;AAAA;AAA0B;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAA1B;AAAA;AAAA;AAAA;AACsC;AAAtC;AAAA;AAAA;AAAA;;AAAA;AACA;;;AGxLoB;;AAGP;;AAEO;AAAA;;AAAA;AAAA;AACE;AAAA;;AAAA;AACA;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AARlB;;AAAA;AAAA;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AAAA;;;;AAAA;AAAA;;AAAA;AAAA;AASqB;;AATrB;AAAA;;AAAA;AAAA;;;;;;AAAA;AAAA;AAAA;AADJ;;;;;;AAAA;AAAA;AAAA;AAsDc;;AAFP;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AArCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCwB;AAAjB;;;;;;;;;;;;;;;;;;;AEtDP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;APgBU;AAAA;AAAA;AAAA;AAAe;;AAAf;AEgIH;;;AACI;AAAA;;AAAA;AAAA;AAAsC;;AAAtC;AADJ;;;AAGQ;AAAA;;AAAA;AAAA;AAAJ;;;AACG;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AADH;;;;AAJR;AAmBO;;AAAA;;AAAA;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AF9I0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AEiJA;;AAAA;;;AACA;;AAAA;;;AAaO;;AAAA;;AAAA;AAAP;AACA;;AAAA;AAAA;AACgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAT;;AAAA;AAAP;AFjIoB;;;AAAA;;AACjB;AAAA;AAAA;AAAA;AAAX;;;AANY;;AAAA;AAAA;AAAA;;AAAA;AAAmC;;AAAA;AAAA;AAAA;;AAAA;AAAnC;AAAA;;;AACI;;AAAA;AAAA;AAAA;;AAAA;AAAqC;;AAAA;AAAA;AAAA;;AAAA;AAArC;AADJ;;;;AADJ;AOXoB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AJGb;;AAAA;;AAAA;AAAA;;AAAA;;;AAAA;;AHsBS;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;AAAP;AACA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AApBG;AAAA;AAAA;AAAA;AAAX;;;AACuD;AAA3C;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAsBJ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AOxBO;;AAAA;AAAA;;AAAA;AA3CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AP0DO;;AAAA;AAAA;;AAAA;;AAAA;AACsC;;AAAA;AAAA;AAAA;;;AAAtC;;AAAA;AAAA;;;;;;;;AEuMP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AASG;;AAAA;;AAAA;AACA;;AAAA;AAAA;AAVH;AAAA;AAYA;;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAQG;;;AACA;;AAAA;AAAA;AATH;AAAA;;AAWA;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAqBG;;;AF3RO;AAAA;AAAA;AAAA;AAAe;;AAAf;AE4RA;AAAP;AACA;;;AAEA;AAAA;AACyC;AAAtC;AAAX;;;AACY;AAAA;;;AAAA;;AAGA;AAAA;;AAAA;AAAA;AACG;;AAAA;AAAA;;;AAAA;;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAIA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AACgC;;AAAA;AAAA;AAA7B;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAIA;;AAAA;AAAA;AAI8B;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AAF3B;AAAA;AAAA;AAAA;AAAA;AA5CV;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AIzQ+B;;AAAc;;AAAnC;;;AAAP;AJsRA;;AAAA;AAAA;AACO;;AAdV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAgBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AF1UU;AAAA;AAAA;AAAA;AAAe;;AAAf;AEwHH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AIzE4B;;AAAqB;;AAA1C;;;AAAP;ANxC0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AEgWA;;;AACA;;;AACA;;AAAA;AAAA;AACO;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAkC;AAAA;;AAAA;AAAA;AAAlC;;AAAA;AAAP;AAEA;AAAA;;AAAA;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAC2C;AAAA;;AAAA;AAAA;AAA3C;AAAA;;AAAA;;AAAA;;AAAA;AACO;AAAA;;AAAA;AAAA;AAAA;AAAA;AApCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;AAgDiB;AACX;;AAA0B;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA1B;AAAA;;;AAAA;AAAA;;;AACe;;AAAd;;AAED;AAAA;;AAAA;AAAA;AAAX;;;AAC0B;;AAAd;;AAGsB;AAAA;;AAAA;AAAA;AACF;AAAA;;AAAA;AAAA;AF/WjB;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAAA;AEkX6B;AAAA;;AAAA;AAAA;AAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACU;AAAA;;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AACO;AAAA;;AAAA;AAAA;AAAZ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AACD;AAAA;;AAAA;AAAA;AAEqB;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACpB;AAAA;;AAAA;AAAA;AACA;AAAA;;AAAA;AAAA;AACJ;AAAA;;AAAA;AAAA;AACE;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAfT;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CiB;;AF3ZP;AAAA;AAAA;AAAA;AAAe;;AAAf;AE4Zf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAVrB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAsBQ;AAAA;;AAAA;AAAA;AAAoC;AAAA;;AAAA;AAAA;AADlC;AAAA;AAAA;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBuC;AAAA;;AAAA;AAAA;AATvC;AAAA;AAAA;AAAA;AAAA;AAAA;AFvWA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AMjB+B;;AAAgB;;AAArC;;;AAAP;AN9C0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmFA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACO;;AArBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AMjD+B;;AAAsB;;AAA3C;;;AAAP;ANxCO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+GA;AAAP;AACA;;;AACA;;;AAC8B;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAIU;AAFsB;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAhC;AAOO;;AAlCV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AMrF+B;;AAAsB;;AAA3C;;;AAAP;ANuGA;;;AA5I0B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+Ie;AAAA;AAAA;AAAA;AAAA;AACf;AAAA;;AACA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AACA;;;AACqB;;AAzBxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBU;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AA3K0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA6KA;AAAA;;AAAA;AACO;;AAzBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAhL6B;AAAnB;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+LO;AAAA;AAfV;AAAA;AAAA;AAAA;AAAA;AAAA;AM5DA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWG;;;AACA;;AAAA;AAAA;AACO;;AAbV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAsBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGc;;AAAX;AAAX;;;AACY;;AAAA;;AAAA;AAqGG;;AA1BV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxEM;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA+FJ;;;AA7FG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AA2FJ;;;AAzFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAuFJ;;;AArFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;AAmFJ;;;AAjFG;AAAW;;AAAX;AAAX;;;AACuC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACA;;AAAA;;;;AAkFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAmBG;;;AACA;;;AACwB;AAAA;;AAAxB;;;AApGO;AAAW;;AAAX;AAAP;AACc;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAmGG;;AAvBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1EM;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA8FJ;;;AA5FG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AA0FJ;;;AAxFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAsFJ;;;AApFG;AAAW;;AAAX;AAAX;;;AACmC;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAqFP;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzJ+B;;AAAgB;;AAArC;;;AAAP;AAyKA;;AAAA;AAAA;AACO;;AAjBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BU;AAAA;;AAAA;AAAA;AARV;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAc4B;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AACqB;;AAArB;;AAAA;;;AAlBP;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAcU;AACP;AAAA;;;AAES;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA+BQ;AAJI;;AA5QL;;AAAA;AAAA;AAAA;AAAA;;AA2QC;AAGO;AAAA;AA7ClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCe;;AAvQL;;AAAA;AAAA;AAAA;AAAA;;AAsQC;AAGO;AAAA;AAxClB;;;AAiCe;;AAlQL;;AAAA;AAAA;AAAA;AAAA;;AAiQC;AAGO;AAAA;AAnClB;;;AA4Be;;AA7PL;;AAAA;AAAA;AAAA;AAAA;;AA4PC;AAGO;AAAA;AA9BlB;;;AAuBe;;AAxPL;;AAAA;AAAA;AAAA;AAAA;;AAuPC;AAGO;AAAA;AAzBlB;;;AAkBkB;;;;;;;;;;;;;;;;;;AAlBlB;;;AHvQD;;;AAEqB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AAAA;;AAAA;AAAA;AACE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAChB;AAAA;;AAAA;AAAA;AAAX;;;AD6Ie;;AAAe;;AAAf;AAAA;;AAAe;;AAAf;AC1IA;;AAAA;AAAA;AAAA;AAAA;AAAP;AAAA;AASJ;;;AAGuB;;;AACF;AAAA;AAAA;AACE;AAAA;AAAA;AAEf;;AAAA;;AAAA;;;AACE;AAAA;;AAAA;AAAA;AADF;AAAA;;AAAA;AAGI;;;AAAA;;AAAA;AAHJ;AADJ;ADoEJ;;;;;;;AAEQ;;AAAA;;;AAAA;;;;AAAA;AACE;;AADF;AADJ;AAIkB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAnB;;AAAA;;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKqB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AACkB;AAAN;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;;AACF;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;AAApB;AAAA;AAAP;;;;;;;;;;;;;AFzFZ;;;AACe;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAJ;AAAP;;AAEJ;;;AACmB;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAR;;AAAA;AAAP;AAEJ;;;AAEyB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AADd;;AAAA;AAAA;;;AAAP;AAQG;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;;AMQR;;;;;AAFW;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAGA;;;AACH;;AAAA;AAAA;AAAA;AAAA;AACG;;AAAA;AAAA;;AADH;AAAA;;;AAEG;;AAAA;AAAA;AAAA;AAAA;AADA;;AAAA;AADH;;;;AADJ;;AAAA;;;;;AAOyB;;AAbF;AAAA;;AAAA;AAAA;AAAhB;AAaP;;AAkBW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAGW;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAEJ;;;AACW;;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.approval_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "intcblock 0 1 32 8 200 86400" - }, - "12": { - "op": "bytecblock 0x151f7c75 0x52333023 \"status\" \"circulating_units\" \"maturity_date\" 0x52323023 \"unit_value\" \"primary_distribution_opening_date\" \"issuance_date\" \"secondary_market_closure_date\" 0x52373023 0x52343023 \"total_units\" \"settlement_asset_id\" \"day_count_convention\" \"principal_discount\" \"secondary_market_opening_date\" 0x52363023 0x52353023 0x52323523 \"asset_suspended\" \"asset_defaulted\" \"denomination_asset_id\" \"metadata\" \"primary_distribution_closure_date\" 0x52383023 \"interest_rate\" 0x74696d654576656e7473 0x00 \"total_coupons\" 0x0000 0x068101" - }, - "434": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "436": { - "op": "bnz main_after_if_else@2", - "stack_out": [] - }, - "439": { - "op": "bytec 5 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "441": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323023", - "tmp%0#3" - ], - "stack_out": [ - "0x52323023", - "tmp%0#3" - ] - }, - "443": { - "op": "app_global_put", - "stack_out": [] - }, - "444": { - "op": "bytec 19 // 0x52323523", - "defined_out": [ - "0x52323523" - ], - "stack_out": [ - "0x52323523" - ] - }, - "446": { - "op": "global ZeroAddress", - "defined_out": [ - "0x52323523", - "tmp%1#3" - ], - "stack_out": [ - "0x52323523", - "tmp%1#3" - ] - }, - "448": { - "op": "app_global_put", - "stack_out": [] - }, - "449": { - "op": "bytec 20 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"" - ], - "stack_out": [ - "\"asset_suspended\"" - ] - }, - "451": { - "op": "intc_0 // 0", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "\"asset_suspended\"", - "0" - ] - }, - "452": { - "op": "app_global_put", - "stack_out": [] - }, - "453": { - "op": "bytec 21 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"" - ], - "stack_out": [ - "\"asset_defaulted\"" - ] - }, - "455": { - "op": "intc_0 // 0", - "stack_out": [ - "\"asset_defaulted\"", - "0" - ] - }, - "456": { - "op": "app_global_put", - "stack_out": [] - }, - "457": { - "op": "bytec 12 // \"total_units\"", - "defined_out": [ - "\"total_units\"" - ], - "stack_out": [ - "\"total_units\"" - ] - }, - "459": { - "op": "intc_0 // 0", - "stack_out": [ - "\"total_units\"", - "0" - ] - }, - "460": { - "op": "app_global_put", - "stack_out": [] - }, - "461": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"" - ], - "stack_out": [ - "\"circulating_units\"" - ] - }, - "462": { - "op": "intc_0 // 0", - "stack_out": [ - "\"circulating_units\"", - "0" - ] - }, - "463": { - "op": "app_global_put", - "stack_out": [] - }, - "464": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"" - ], - "stack_out": [ - "\"unit_value\"" - ] - }, - "466": { - "op": "intc_0 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "467": { - "op": "app_global_put", - "stack_out": [] - }, - "468": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "\"status\"" - ] - }, - "469": { - "op": "intc_0 // 0", - "stack_out": [ - "\"status\"", - "0" - ] - }, - "470": { - "op": "app_global_put", - "stack_out": [] - }, - "471": { - "op": "bytec 22 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"" - ], - "stack_out": [ - "\"denomination_asset_id\"" - ] - }, - "473": { - "op": "intc_0 // 0", - "stack_out": [ - "\"denomination_asset_id\"", - "0" - ] - }, - "474": { - "op": "app_global_put", - "stack_out": [] - }, - "475": { - "op": "bytec 13 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"" - ], - "stack_out": [ - "\"settlement_asset_id\"" - ] - }, - "477": { - "op": "intc_0 // 0", - "stack_out": [ - "\"settlement_asset_id\"", - "0" - ] - }, - "478": { - "op": "app_global_put", - "stack_out": [] - }, - "479": { - "op": "bytec 6 // \"unit_value\"", - "stack_out": [ - "\"unit_value\"" - ] - }, - "481": { - "op": "intc_0 // 0", - "stack_out": [ - "\"unit_value\"", - "0" - ] - }, - "482": { - "op": "app_global_put", - "stack_out": [] - }, - "483": { - "op": "bytec 14 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "\"day_count_convention\"" - ] - }, - "485": { - "op": "intc_0 // 0", - "stack_out": [ - "\"day_count_convention\"", - "0" - ] - }, - "486": { - "op": "app_global_put", - "stack_out": [] - }, - "487": { - "op": "bytec 23 // \"metadata\"", - "defined_out": [ - "\"metadata\"" - ], - "stack_out": [ - "\"metadata\"" - ] - }, - "489": { - "op": "pushbytes 0x", - "defined_out": [ - "\"metadata\"", - "0x" - ], - "stack_out": [ - "\"metadata\"", - "0x" - ] - }, - "491": { - "op": "app_global_put", - "stack_out": [] - }, - "492": { - "op": "bytec 15 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"" - ], - "stack_out": [ - "\"principal_discount\"" - ] - }, - "494": { - "op": "intc_0 // 0", - "stack_out": [ - "\"principal_discount\"", - "0" - ] - }, - "495": { - "op": "app_global_put", - "stack_out": [] - }, - "496": { - "op": "bytec 26 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"" - ], - "stack_out": [ - "\"interest_rate\"" - ] - }, - "498": { - "op": "intc_0 // 0", - "stack_out": [ - "\"interest_rate\"", - "0" - ] - }, - "499": { - "op": "app_global_put", - "stack_out": [] - }, - "500": { - "op": "bytec 29 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"" - ], - "stack_out": [ - "\"total_coupons\"" - ] - }, - "502": { - "op": "intc_0 // 0", - "stack_out": [ - "\"total_coupons\"", - "0" - ] - }, - "503": { - "op": "app_global_put", - "stack_out": [] - }, - "504": { - "op": "bytec 7 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"" - ], - "stack_out": [ - "\"primary_distribution_opening_date\"" - ] - }, - "506": { - "op": "intc_0 // 0", - "stack_out": [ - "\"primary_distribution_opening_date\"", - "0" - ] - }, - "507": { - "op": "app_global_put", - "stack_out": [] - }, - "508": { - "op": "bytec 24 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"" - ], - "stack_out": [ - "\"primary_distribution_closure_date\"" - ] - }, - "510": { - "op": "intc_0 // 0", - "stack_out": [ - "\"primary_distribution_closure_date\"", - "0" - ] - }, - "511": { - "op": "app_global_put", - "stack_out": [] - }, - "512": { - "op": "bytec 8 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"" - ], - "stack_out": [ - "\"issuance_date\"" - ] - }, - "514": { - "op": "intc_0 // 0", - "stack_out": [ - "\"issuance_date\"", - "0" - ] - }, - "515": { - "op": "app_global_put", - "stack_out": [] - }, - "516": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"" - ], - "stack_out": [ - "\"secondary_market_opening_date\"" - ] - }, - "518": { - "op": "intc_0 // 0", - "stack_out": [ - "\"secondary_market_opening_date\"", - "0" - ] - }, - "519": { - "op": "app_global_put", - "stack_out": [] - }, - "520": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"" - ], - "stack_out": [ - "\"secondary_market_closure_date\"" - ] - }, - "522": { - "op": "intc_0 // 0", - "stack_out": [ - "\"secondary_market_closure_date\"", - "0" - ] - }, - "523": { - "op": "app_global_put", - "stack_out": [] - }, - "524": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"" - ], - "stack_out": [ - "\"maturity_date\"" - ] - }, - "526": { - "op": "intc_0 // 0", - "stack_out": [ - "\"maturity_date\"", - "0" - ] - }, - "527": { - "op": "app_global_put", - "stack_out": [] - }, - "528": { - "op": "txn GlobalNumByteSlice", - "defined_out": [ - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2" - ] - }, - "530": { - "op": "pushint 3", - "defined_out": [ - "3", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "3" - ] - }, - "532": { - "op": "==", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "tmp%1#2" - ] - }, - "533": { - "error": "Wrong Global Bytes allocation", - "op": "assert // Wrong Global Bytes allocation", - "stack_out": [] - }, - "534": { - "op": "txn GlobalNumUint", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "536": { - "op": "pushint 18", - "defined_out": [ - "18", - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1", - "18" - ] - }, - "538": { - "op": "==", - "defined_out": [ - "tmp%3#1" - ], - "stack_out": [ - "tmp%3#1" - ] - }, - "539": { - "error": "Wrong Global UInts allocation", - "op": "assert // Wrong Global UInts allocation", - "stack_out": [] - }, - "540": { - "op": "txn LocalNumByteSlice", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "542": { - "op": "!", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "543": { - "error": "Wrong Local Bytes allocation", - "op": "assert // Wrong Local Bytes allocation", - "stack_out": [] - }, - "544": { - "op": "txn LocalNumUint", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "546": { - "op": "!", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "547": { - "error": "Wrong Local UInts allocation", - "op": "assert // Wrong Local UInts allocation", - "stack_out": [] - }, - "548": { - "block": "main_after_if_else@2", - "stack_in": [], - "op": "pushbytes 0x25dba95b // method \"asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\"", - "defined_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ], - "stack_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ] - }, - "554": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%0#1" - ], - "stack_out": [ - "Method(asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%0#1" - ] - }, - "557": { - "op": "match main_asset_update_route@4", - "stack_out": [] - }, - "561": { - "block": "main_switch_case_next@5", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "563": { - "op": "!", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "tmp%7#0" - ] - }, - "564": { - "op": "assert", - "stack_out": [] - }, - "565": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "567": { - "op": "bz main_create_NoOp@33", - "stack_out": [] - }, - "570": { - "op": "pushbytess 0x89474134 0x44363d49 0x67db4f20 0x9c76b6a3 0x4fd6a3cc 0x1d6fc255 0x25e9997f 0x6c85e3ee 0x402dba47 0xfad2173e 0x08efea35 0xe4a5ab54 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method \"asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))\", method \"get_payment_amount(address)(uint64,uint64)\", method \"pay_principal(address,byte[])(uint64,uint64,byte[])\", method \"asset_transfer(address,address,uint64)uint64\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"set_default_status(bool)uint64\", method \"primary_distribution(address,uint64)uint64\", method \"get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)\", method \"account_gov_suspension(address,bool)uint64\", method \"account_open(address,address)uint64\", method \"account_close(address)(uint64,uint64)\", method \"account_update_payment_address(address,address)uint64\", method \"account_get_info(address)(address,uint64,uint64,uint64,bool)\", method \"rbac_rotate_arranger(address)uint64\", method \"rbac_set_op_daemon(address)uint64\", method \"rbac_assign_role(uint8,address,byte[])uint64\", method \"rbac_revoke_role(uint8,address)uint64\", method \"rbac_gov_asset_suspension(bool)uint64\", method \"rbac_get_arranger()address\", method \"rbac_get_address_roles(address)(bool,bool,bool,bool,bool)\", method \"rbac_get_role_config(uint8,address)(uint64,uint64)\"", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_time_events()uint64[])", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(primary_distribution(address,uint64)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_default_status(bool)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))" - ], - "stack_out": [ - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(set_default_status(bool)uint64)", - "Method(primary_distribution(address,uint64)uint64)", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_time_events()uint64[])", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))" - ] - }, - "697": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(account_close(address)(uint64,uint64))", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_update_payment_address(address,address)uint64)", - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_time_events()uint64[])", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(primary_distribution(address,uint64)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(set_default_status(bool)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "tmp%10#0" - ], - "stack_out": [ - "Method(asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void)", - "Method(get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)))", - "Method(get_payment_amount(address)(uint64,uint64))", - "Method(pay_principal(address,byte[])(uint64,uint64,byte[]))", - "Method(asset_transfer(address,address,uint64)uint64)", - "Method(set_secondary_time_events(uint64[])(uint64,uint64))", - "Method(set_default_status(bool)uint64)", - "Method(primary_distribution(address,uint64)uint64)", - "Method(get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8))", - "Method(get_time_events()uint64[])", - "Method(get_secondary_market_schedule()uint64[])", - "Method(get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))", - "Method(account_gov_suspension(address,bool)uint64)", - "Method(account_open(address,address)uint64)", - "Method(account_close(address)(uint64,uint64))", - "Method(account_update_payment_address(address,address)uint64)", - "Method(account_get_info(address)(address,uint64,uint64,uint64,bool))", - "Method(rbac_rotate_arranger(address)uint64)", - "Method(rbac_set_op_daemon(address)uint64)", - "Method(rbac_assign_role(uint8,address,byte[])uint64)", - "Method(rbac_revoke_role(uint8,address)uint64)", - "Method(rbac_gov_asset_suspension(bool)uint64)", - "Method(rbac_get_arranger()address)", - "Method(rbac_get_address_roles(address)(bool,bool,bool,bool,bool))", - "Method(rbac_get_role_config(uint8,address)(uint64,uint64))", - "tmp%10#0" - ] - }, - "700": { - "op": "match asset_config get_account_units_current_value get_payment_amount pay_principal asset_transfer set_secondary_time_events set_default_status primary_distribution get_asset_info get_time_events get_secondary_market_schedule get_asset_metadata account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config", - "stack_out": [] - }, - "752": { - "op": "err" - }, - "753": { - "block": "main_create_NoOp@33", - "stack_in": [], - "op": "pushbytes 0x3f0efc6c // method \"asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\"", - "defined_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ], - "stack_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)" - ] - }, - "759": { - "op": "txna ApplicationArgs 0", - "defined_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%11#0" - ], - "stack_out": [ - "Method(asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void)", - "tmp%11#0" - ] - }, - "762": { - "op": "match asset_create", - "stack_out": [] - }, - "766": { - "op": "err" - }, - "767": { - "block": "main_asset_update_route@4", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1" - ] - }, - "769": { - "op": "pushint 4 // UpdateApplication", - "defined_out": [ - "UpdateApplication", - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1", - "UpdateApplication" - ] - }, - "771": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "772": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%2#0", - "tmp%3#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%3#0" - ] - }, - "774": { - "op": "&&", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "775": { - "op": "assert", - "stack_out": [] - }, - "776": { - "op": "b asset_update" - }, - "779": { - "subroutine": "modules.actus.pam.PAMCoreMixin.asset_config[routing]", - "params": {}, - "block": "asset_config", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "782": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "783": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "784": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "8" - ] - }, - "785": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "786": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "tmp%0#0" - ] - }, - "787": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0" - ] - }, - "788": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "denomination_asset_id#0", - "tmp%2#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "tmp%2#0" - ] - }, - "791": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "792": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "len%1#0" - ] - }, - "793": { - "op": "intc_3 // 8", - "stack_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "794": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%1#0", - "tmp%2#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "795": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "denomination_asset_id#0", - "tmp%2#0" - ] - }, - "796": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0" - ] - }, - "797": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ] - }, - "800": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ] - }, - "801": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%2#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "len%2#0" - ] - }, - "802": { - "op": "intc_3 // 8", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "len%2#0", - "8" - ] - }, - "803": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%2#0", - "settlement_asset_id#0", - "tmp%4#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0", - "eq%2#0" - ] - }, - "804": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "tmp%4#0" - ] - }, - "805": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0" - ] - }, - "806": { - "op": "txna ApplicationArgs 4", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0" - ] - }, - "809": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ] - }, - "810": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%3#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "len%3#0" - ] - }, - "811": { - "op": "intc_3 // 8", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "len%3#0", - "8" - ] - }, - "812": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%3#0", - "principal#0", - "settlement_asset_id#0", - "tmp%6#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0", - "eq%3#0" - ] - }, - "813": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "tmp%6#0" - ] - }, - "814": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0" - ] - }, - "815": { - "op": "txna ApplicationArgs 5", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0" - ] - }, - "818": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ] - }, - "819": { - "op": "len", - "defined_out": [ - "denomination_asset_id#0", - "len%4#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "len%4#0" - ] - }, - "820": { - "op": "intc_3 // 8", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "len%4#0", - "8" - ] - }, - "821": { - "op": "==", - "defined_out": [ - "denomination_asset_id#0", - "eq%4#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "tmp%8#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0", - "eq%4#0" - ] - }, - "822": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "tmp%8#0" - ] - }, - "823": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0" - ] - }, - "824": { - "op": "txna ApplicationArgs 6", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "827": { - "op": "dup", - "defined_out": [ - "day_count_convention#0", - "day_count_convention#0 (copy)", - "denomination_asset_id#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "day_count_convention#0 (copy)" - ] - }, - "828": { - "op": "len", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "len%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%5#0" - ] - }, - "829": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "day_count_convention#0", - "denomination_asset_id#0", - "len%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%5#0", - "1" - ] - }, - "830": { - "op": "==", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "eq%5#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%5#0" - ] - }, - "831": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "832": { - "op": "txna ApplicationArgs 7" - }, - "835": { - "op": "dup", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "interest_rate#0", - "interest_rate#0" - ] - }, - "836": { - "op": "cover 7", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "interest_rate#0" - ] - }, - "838": { - "op": "len", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%6#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%6#0" - ] - }, - "839": { - "op": "pushint 2", - "defined_out": [ - "2", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%6#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "len%6#0", - "2" - ] - }, - "841": { - "op": "==", - "defined_out": [ - "day_count_convention#0", - "denomination_asset_id#0", - "eq%6#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%6#0" - ] - }, - "842": { - "error": "invalid number of bytes for arc4.uint16", - "op": "assert // invalid number of bytes for arc4.uint16", - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "843": { - "op": "txna ApplicationArgs 8", - "defined_out": [ - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0" - ] - }, - "846": { - "op": "dup", - "defined_out": [ - "coupon_rates#0", - "coupon_rates#0 (copy)", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0 (copy)" - ] - }, - "847": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "coupon_rates#0 (copy)", - "0" - ] - }, - "848": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0" - ] - }, - "849": { - "op": "dup", - "stack_out": [ - "interest_rate#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0" - ] - }, - "850": { - "op": "cover 8", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0" - ] - }, - "852": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "854": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%0#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "mul%0#0" - ] - }, - "855": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "mul%0#0", - "2" - ] - }, - "857": { - "op": "+", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "coupon_rates#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "coupon_rates#0", - "add%0#0" - ] - }, - "858": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%0#0", - "coupon_rates#0" - ] - }, - "859": { - "op": "len", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%7#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%0#0", - "len%7#0" - ] - }, - "860": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%7#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%7#0" - ] - }, - "861": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "862": { - "op": "txna ApplicationArgs 9" - }, - "865": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0" - ] - }, - "866": { - "op": "cover 7", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0" - ] - }, - "868": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "869": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "time_events#0 (copy)", - "0" - ] - }, - "870": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0" - ] - }, - "871": { - "op": "dup", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%1#0" - ] - }, - "872": { - "op": "cover 8", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0" - ] - }, - "874": { - "op": "intc_3 // 8", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "aggregate%array_length%1#0", - "8" - ] - }, - "875": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%1#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "mul%1#0" - ] - }, - "876": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "mul%1#0", - "2" - ] - }, - "878": { - "op": "+", - "defined_out": [ - "add%1#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_events#0", - "add%1#0" - ] - }, - "879": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%1#0", - "time_events#0" - ] - }, - "880": { - "op": "len", - "defined_out": [ - "add%1#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%8#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%1#0", - "len%8#0" - ] - }, - "881": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%8#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%8#0" - ] - }, - "882": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "883": { - "op": "txna ApplicationArgs 10", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0" - ] - }, - "886": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0", - "time_periods#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0 (copy)" - ] - }, - "887": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "time_periods#0 (copy)", - "0" - ] - }, - "888": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0" - ] - }, - "889": { - "op": "dup", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0", - "aggregate%array_length%2#0" - ] - }, - "890": { - "op": "cover 8", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0" - ] - }, - "892": { - "op": "pushint 16", - "defined_out": [ - "16", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "aggregate%array_length%2#0", - "16" - ] - }, - "894": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "mul%2#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "mul%2#0" - ] - }, - "895": { - "op": "pushint 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "mul%2#0", - "2" - ] - }, - "897": { - "op": "+", - "defined_out": [ - "add%2#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "time_periods#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "time_periods#0", - "add%2#0" - ] - }, - "898": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%2#0", - "time_periods#0" - ] - }, - "899": { - "op": "len", - "defined_out": [ - "add%2#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "len%9#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "add%2#0", - "len%9#0" - ] - }, - "900": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "eq%9#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "eq%9#0" - ] - }, - "901": { - "error": "invalid number of bytes for arc4.dynamic_array>", - "op": "assert // invalid number of bytes for arc4.dynamic_array>", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "902": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "905": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "0" - ] - }, - "906": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "0", - "\"status\"" - ] - }, - "907": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "908": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "maybe_value%0#0" - ] - }, - "909": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0", - "tmp%0#1" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%0#1" - ] - }, - "910": { - "error": "D-ASA already configured", - "op": "assert // D-ASA already configured", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "911": { - "op": "dig 5", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "denomination_asset_id#0 (copy)", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "denomination_asset_id#0 (copy)" - ] - }, - "913": { - "op": "asset_params_get AssetCreator", - "defined_out": [ - "_creator#0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "exists#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "_creator#0", - "exists#0" - ] - }, - "915": { - "op": "bury 1", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "exists#0" - ] - }, - "917": { - "error": "Denomination asset is not properly set", - "op": "assert // Denomination asset is not properly set", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "918": { - "op": "bytec 22 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"denomination_asset_id\"" - ] - }, - "920": { - "op": "dig 6", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"denomination_asset_id\"", - "denomination_asset_id#0 (copy)" - ] - }, - "922": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "923": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "denomination_asset_id#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "settlement_asset_id#0 (copy)", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "denomination_asset_id#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "settlement_asset_id#0 (copy)" - ] - }, - "925": { - "op": "uncover 6", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "settlement_asset_id#0 (copy)", - "denomination_asset_id#0" - ] - }, - "927": { - "op": "==", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%0#1" - ] - }, - "928": { - "error": "Different settlement asset not supported, must be equal to denomination asset", - "op": "assert // Different settlement asset not supported, must be equal to denomination asset", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "929": { - "op": "bytec 13 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"settlement_asset_id\"" - ] - }, - "931": { - "op": "dig 5", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"settlement_asset_id\"", - "settlement_asset_id#0 (copy)" - ] - }, - "933": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "934": { - "op": "itxn_begin" - }, - "935": { - "op": "global MinTxnFee", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "937": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "settlement_asset_id#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "939": { - "op": "intc_0 // 0", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "0" - ] - }, - "940": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "942": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "settlement_asset_id#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "944": { - "op": "uncover 5", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "settlement_asset_id#0" - ] - }, - "946": { - "op": "itxn_field XferAsset", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "948": { - "op": "pushint 4 // axfer", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "axfer", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "950": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "952": { - "op": "itxn_field Fee", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "954": { - "op": "itxn_submit" - }, - "955": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal#0 (copy)", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0 (copy)" - ] - }, - "957": { - "op": "dig 2", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "minimum_denomination#0 (copy)", - "principal#0", - "principal#0 (copy)", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0 (copy)", - "minimum_denomination#0 (copy)" - ] - }, - "959": { - "op": "%", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%1#0" - ] - }, - "960": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0", - "tmp%2#1" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "tmp%2#1" - ] - }, - "961": { - "error": "Minimum denomination is not a divisor of principal", - "op": "assert // Minimum denomination is not a divisor of principal", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "962": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "minimum_denomination#0", - "principal#0", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"unit_value\"" - ] - }, - "964": { - "op": "dig 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "\"unit_value\"", - "minimum_denomination#0 (copy)" - ] - }, - "966": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0" - ] - }, - "967": { - "op": "uncover 3", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "minimum_denomination#0", - "day_count_convention#0", - "principal#0" - ] - }, - "969": { - "op": "uncover 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "principal#0", - "minimum_denomination#0" - ] - }, - "971": { - "op": "/", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "tmp%3#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "tmp%3#0" - ] - }, - "972": { - "op": "bytec 12 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0", - "tmp%3#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "tmp%3#0", - "\"total_units\"" - ] - }, - "974": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "\"total_units\"", - "tmp%3#0" - ] - }, - "975": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0" - ] - }, - "976": { - "op": "bytec 15 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "interest_rate#0", - "principal_discount#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "principal_discount#0", - "day_count_convention#0", - "\"principal_discount\"" - ] - }, - "978": { - "op": "uncover 2", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0", - "\"principal_discount\"", - "principal_discount#0" - ] - }, - "980": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#0" - ] - }, - "981": { - "op": "btoi", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "982": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2" - ] - }, - "983": { - "op": "bz asset_config_bool_true@3", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "986": { - "op": "dup", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2" - ] - }, - "987": { - "op": "pushint 255", - "defined_out": [ - "255", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "day_count_convention#2", - "255" - ] - }, - "990": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#1" - ] - }, - "991": { - "op": "bz asset_config_bool_false@4", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "994": { - "block": "asset_config_bool_true@3", - "stack_in": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ] - }, - "995": { - "error": "Invalid day-count convention ID", - "block": "asset_config_bool_merge@5", - "stack_in": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ], - "op": "assert // Invalid day-count convention ID", - "defined_out": [], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "996": { - "op": "bytec 14 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"day_count_convention\"" - ] - }, - "998": { - "op": "dig 1", - "defined_out": [ - "\"day_count_convention\"", - "day_count_convention#2" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"day_count_convention\"", - "day_count_convention#2" - ] - }, - "1000": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1001": { - "op": "dig 5", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0" - ] - }, - "1003": { - "op": "btoi", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2" - ] - }, - "1004": { - "op": "dup", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2", - "interest_rate#2 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2", - "interest_rate#2 (copy)" - ] - }, - "1005": { - "op": "!", - "defined_out": [ - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2", - "tmp%0#1" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2", - "tmp%0#1" - ] - }, - "1006": { - "error": "Interest rate is not properly defined", - "op": "assert // Interest rate is not properly defined", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2" - ] - }, - "1007": { - "op": "bytec 26 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "day_count_convention#2", - "interest_rate#0", - "interest_rate#2" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#2", - "\"interest_rate\"" - ] - }, - "1009": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"interest_rate\"", - "interest_rate#2" - ] - }, - "1010": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1011": { - "op": "dig 4", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1013": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "1014": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#2", - "interest_rate#0", - "tmp%1#1" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "tmp%1#1" - ] - }, - "1015": { - "error": "Coupon rates are not properly defined", - "op": "assert // Coupon rates are not properly defined", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1016": { - "op": "bytec 29 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "aggregate%array_length%0#0", - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "\"total_coupons\"" - ] - }, - "1018": { - "op": "dig 1", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "\"total_coupons\"", - "aggregate%array_length%0#0 (copy)" - ] - }, - "1020": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0" - ] - }, - "1021": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%array_length%0#0", - "day_count_convention#2", - "interest_rate#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%0#0", - "4" - ] - }, - "1023": { - "op": "+", - "defined_out": [ - "aggregate%array_length%0#0", - "day_count_convention#2", - "interest_rate#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#0" - ] - }, - "1024": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#0", - "aggregate%array_length%1#0" - ] - }, - "1026": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "tmp%2#1" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%2#1" - ] - }, - "1027": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1028": { - "op": "dig 3", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1030": { - "callsub": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "1033": { - "op": "bytec 27 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "1035": { - "op": "box_del", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "{box_del}" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "{box_del}" - ] - }, - "1036": { - "op": "pop", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1037": { - "op": "bytec 27 // 0x74696d654576656e7473", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "1039": { - "op": "dig 1", - "defined_out": [ - "0x74696d654576656e7473", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "0x74696d654576656e7473", - "time_events#0 (copy)" - ] - }, - "1041": { - "op": "box_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0" - ] - }, - "1042": { - "op": "dup", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "time_events#0 (copy)" - ] - }, - "1043": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1046": { - "op": "dig 1", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "1048": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "2" - ] - }, - "1050": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%0#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%0#0" - ] - }, - "1051": { - "op": "bytec 7 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%0#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%0#0", - "\"primary_distribution_opening_date\"" - ] - }, - "1053": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "\"primary_distribution_opening_date\"", - "values%0#0" - ] - }, - "1054": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1055": { - "op": "dig 1", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "1057": { - "op": "pushint 10", - "defined_out": [ - "10", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "10" - ] - }, - "1059": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%1#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%1#0" - ] - }, - "1060": { - "op": "bytec 24 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%1#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%1#0", - "\"primary_distribution_closure_date\"" - ] - }, - "1062": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "\"primary_distribution_closure_date\"", - "values%1#0" - ] - }, - "1063": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1064": { - "op": "dig 1", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "1066": { - "op": "pushint 18", - "defined_out": [ - "18", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "18" - ] - }, - "1068": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%2#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%2#0" - ] - }, - "1069": { - "op": "bytec 8 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%2#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "values%2#0", - "\"issuance_date\"" - ] - }, - "1071": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0", - "\"issuance_date\"", - "values%2#0" - ] - }, - "1072": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "1073": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "time_events#0" - ] - }, - "1074": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "time_events#0", - "0" - ] - }, - "1075": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%6#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%6#0" - ] - }, - "1076": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%6#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%6#0", - "1" - ] - }, - "1077": { - "op": "-", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ] - }, - "1078": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "tmp%1#0", - "8" - ] - }, - "1079": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%3#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%3#0" - ] - }, - "1080": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%3#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "values%3#0" - ] - }, - "1081": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0", - "values%3#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "values%3#0", - "\"maturity_date\"" - ] - }, - "1083": { - "op": "swap", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"maturity_date\"", - "values%3#0" - ] - }, - "1084": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1085": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "aggregate%array_length%2#0" - ] - }, - "1087": { - "op": "!", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "tmp%1#1" - ] - }, - "1088": { - "error": "Time periods are not properly defined", - "op": "assert // Time periods are not properly defined", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1089": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"status\"" - ] - }, - "1090": { - "op": "pushint 100", - "defined_out": [ - "\"status\"", - "100", - "aggregate%array_length%0#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "interest_rate#0", - "time_events#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "\"status\"", - "100" - ] - }, - "1092": { - "op": "app_global_put", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1093": { - "op": "intc_1 // 1", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "1" - ] - }, - "1094": { - "op": "return", - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ] - }, - "1095": { - "block": "asset_config_bool_false@4", - "stack_in": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "interest_rate#0", - "aggregate%array_length%0#0", - "time_events#0", - "aggregate%array_length%1#0", - "aggregate%array_length%2#0", - "day_count_convention#2", - "or_result%0#0" - ] - }, - "1096": { - "op": "b asset_config_bool_merge@5" - }, - "1099": { - "subroutine": "modules.core_financial.no_coupon.NoCouponCashflowMixin.get_account_units_current_value[routing]", - "params": {}, - "block": "get_account_units_current_value", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "1100": { - "op": "pushbytes \"\"", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0" - ] - }, - "1102": { - "op": "dupn 5", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0" - ] - }, - "1104": { - "op": "txna ApplicationArgs 1" - }, - "1107": { - "op": "dup", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "holding_address#0" - ] - }, - "1108": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "len%0#0" - ] - }, - "1109": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1110": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1111": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0" - ] - }, - "1112": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1115": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1116": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "1117": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "1118": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1119": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1120": { - "op": "btoi", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1121": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "1122": { - "op": "bytec 7 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "1124": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1125": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "1126": { - "op": "bz get_account_units_current_value_bool_false@4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1129": { - "op": "global LatestTimestamp", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "1131": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0" - ] - }, - "1132": { - "op": "bytec 7 // \"primary_distribution_opening_date\"", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "1134": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1135": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%1#0" - ] - }, - "1136": { - "op": ">=", - "defined_out": [ - "holding_address#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "1137": { - "op": "bz get_account_units_current_value_bool_false@4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1140": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1141": { - "error": "Primary distribution not yet executed", - "block": "get_account_units_current_value_bool_merge@5", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Primary distribution not yet executed", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1142": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x52333023" - ] - }, - "1143": { - "op": "dig 2", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x52333023", - "holding_address#0" - ] - }, - "1145": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1146": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "1147": { - "op": "bury 10", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1149": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1150": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_exists%0#0" - ] - }, - "1152": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1153": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "units#0" - ] - }, - "1154": { - "op": "bz get_account_units_current_value_bool_false@8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1157": { - "op": "dig 8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "1159": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1160": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0" - ] - }, - "1161": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%box_get%0#0", - "32" - ] - }, - "1162": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "values%0#0" - ] - }, - "1163": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "values%0#0", - "units#0" - ] - }, - "1165": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%4#1" - ] - }, - "1166": { - "op": "bz get_account_units_current_value_bool_false@8", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1169": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ] - }, - "1170": { - "error": "Invalid amount of units for the account", - "block": "get_account_units_current_value_bool_merge@9", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ], - "op": "assert // Invalid amount of units for the account", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1171": { - "op": "dup2", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "holding_address#0", - "units#0" - ] - }, - "1172": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0" - ] - }, - "1175": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "account_units_nominal_value#0" - ] - }, - "1176": { - "op": "bury 8", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0" - ] - }, - "1178": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "0" - ] - }, - "1179": { - "op": "bytec 15 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "0", - "\"principal_discount\"" - ] - }, - "1181": { - "op": "app_global_get_ex", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1182": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "maybe_value%2#0" - ] - }, - "1183": { - "op": "dig 1", - "defined_out": [ - "account_units_nominal_value#0", - "account_units_nominal_value#0 (copy)", - "holding_address#0", - "maybe_value%2#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "maybe_value%2#0", - "account_units_nominal_value#0 (copy)" - ] - }, - "1185": { - "op": "*", - "defined_out": [ - "account_units_nominal_value#0", - "holding_address#0", - "tmp%6#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "tmp%6#0" - ] - }, - "1186": { - "op": "pushint 10000", - "defined_out": [ - "10000", - "account_units_nominal_value#0", - "holding_address#0", - "tmp%6#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "tmp%6#0", - "10000" - ] - }, - "1189": { - "op": "/", - "defined_out": [ - "account_units_discount#0", - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_nominal_value#0", - "account_units_discount#0" - ] - }, - "1190": { - "op": "-", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_current_value#0" - ] - }, - "1191": { - "op": "bury 8", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1193": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "accrued_interest#0" - ] - }, - "1194": { - "op": "bury 6", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1196": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "numerator#0" - ] - }, - "1197": { - "op": "bury 3", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1199": { - "op": "intc_0 // 0", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "denominator#0" - ] - }, - "1200": { - "op": "bury 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1202": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "1203": { - "op": "bytec 8 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0", - "\"issuance_date\"" - ] - }, - "1205": { - "op": "app_global_get_ex", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "denominator#0", - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1206": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "1207": { - "op": "global LatestTimestamp" - }, - "1209": { - "op": "dup", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "maybe_value%0#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "1210": { - "op": "bury 7", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "maybe_value%0#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0" - ] - }, - "1212": { - "op": "<=", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "tmp%0#2", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%0#2" - ] - }, - "1213": { - "op": "bz get_account_units_current_value_bool_false@17", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1216": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "1217": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0", - "\"maturity_date\"" - ] - }, - "1219": { - "op": "app_global_get_ex", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1220": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "1221": { - "op": "dig 5", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "awst_tmp%0#0" - ] - }, - "1223": { - "op": ">", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "tmp%1#2", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "1224": { - "op": "bz get_account_units_current_value_bool_false@17", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1227": { - "op": "intc_1 // 1", - "defined_out": [ - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "and_result%0#0", - "awst_tmp%0#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1228": { - "block": "get_account_units_current_value_bool_merge@18", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "bz get_account_units_current_value_after_if_else@11", - "defined_out": [], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1231": { - "callsub": "modules.core_financial.no_coupon.NoCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "day_count_factor#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1234": { - "op": "dig 2", - "defined_out": [ - "day_count_factor#0", - "holding_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "holding_address#0" - ] - }, - "1236": { - "op": "dig 2", - "defined_out": [ - "day_count_factor#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "holding_address#0", - "units#0" - ] - }, - "1238": { - "callsub": "modules.core_financial.no_coupon.NoCouponCashflowMixin.accrued_interest_amount", - "op": "callsub accrued_interest_amount", - "defined_out": [ - "accrued_interest#0", - "day_count_factor#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "accrued_interest#0" - ] - }, - "1241": { - "op": "bury 7", - "defined_out": [ - "accrued_interest#0", - "day_count_factor#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1243": { - "op": "dup", - "defined_out": [ - "accrued_interest#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "1244": { - "op": "intc_0 // 0", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "1245": { - "op": "extract_uint64", - "defined_out": [ - "accrued_interest#0", - "day_count_factor#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "numerator#0" - ] - }, - "1246": { - "op": "bury 4", - "defined_out": [ - "accrued_interest#0", - "day_count_factor#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0" - ] - }, - "1248": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "accrued_interest#0", - "day_count_factor#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "day_count_factor#0", - "8" - ] - }, - "1249": { - "op": "extract_uint64", - "defined_out": [ - "accrued_interest#0", - "denominator#0", - "holding_address#0", - "numerator#0", - "units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "denominator#0" - ] - }, - "1250": { - "op": "bury 4", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1252": { - "block": "get_account_units_current_value_after_if_else@11", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%12#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%12#0" - ] - }, - "1254": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%12#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%12#0", - "0" - ] - }, - "1255": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "tmp%12#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%12#0", - "0", - "\"maturity_date\"" - ] - }, - "1257": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0", - "tmp%12#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%12#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1258": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%12#0", - "maybe_value%3#0" - ] - }, - "1259": { - "op": ">=", - "defined_out": [ - "tmp%13#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%13#0" - ] - }, - "1260": { - "op": "bz get_account_units_current_value_after_if_else@13", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1263": { - "op": "dig 6", - "defined_out": [ - "account_units_current_value#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "account_units_current_value#0" - ] - }, - "1265": { - "op": "bury 8", - "defined_out": [ - "account_units_current_value#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1267": { - "block": "get_account_units_current_value_after_if_else@13", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "dig 2", - "defined_out": [ - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "numerator#0" - ] - }, - "1269": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1270": { - "op": "dig 4", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0", - "denominator#0" - ] - }, - "1272": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1273": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0" - ] - }, - "1274": { - "op": "dig 8", - "defined_out": [ - "account_units_current_value#0", - "aggregate%head%1#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "account_units_current_value#0" - ] - }, - "1276": { - "op": "itob", - "defined_out": [ - "account_units_current_value#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1277": { - "op": "dig 7", - "defined_out": [ - "account_units_current_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "accrued_interest#0" - ] - }, - "1279": { - "op": "itob", - "defined_out": [ - "account_units_current_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1280": { - "op": "concat", - "defined_out": [ - "account_units_current_value#0", - "accrued_interest#0", - "aggregate%head%1#0", - "aggregate%head%3#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%1#0", - "aggregate%head%3#0" - ] - }, - "1281": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%3#0", - "aggregate%head%1#0" - ] - }, - "1282": { - "op": "concat", - "defined_out": [ - "account_units_current_value#0", - "accrued_interest#0", - "aggregate%head%4#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%4#0" - ] - }, - "1283": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "account_units_current_value#0", - "accrued_interest#0", - "aggregate%head%4#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "aggregate%head%4#0", - "0x151f7c75" - ] - }, - "1284": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%head%4#0" - ] - }, - "1285": { - "op": "concat", - "defined_out": [ - "account_units_current_value#0", - "accrued_interest#0", - "denominator#0", - "numerator#0", - "tmp%5#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "tmp%5#0" - ] - }, - "1286": { - "op": "log", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1287": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "account_units_current_value#0", - "accrued_interest#0", - "denominator#0", - "numerator#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "1" - ] - }, - "1288": { - "op": "return", - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ] - }, - "1289": { - "block": "get_account_units_current_value_bool_false@17", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1290": { - "op": "b get_account_units_current_value_bool_merge@18" - }, - "1293": { - "block": "get_account_units_current_value_bool_false@8", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%1#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%1#0" - ] - }, - "1294": { - "op": "b get_account_units_current_value_bool_merge@9" - }, - "1297": { - "block": "get_account_units_current_value_bool_false@4", - "stack_in": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "account_units_current_value#0", - "account_units_nominal_value#0", - "accrued_interest#0", - "awst_tmp%0#0", - "denominator#0", - "numerator#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1298": { - "op": "b get_account_units_current_value_bool_merge@5" - }, - "1301": { - "subroutine": "modules.core_financial.no_coupon.NoCouponCashflowMixin.get_payment_amount[routing]", - "params": {}, - "block": "get_payment_amount", - "stack_in": [], - "op": "txna ApplicationArgs 1" - }, - "1304": { - "op": "dupn 2", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1306": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "len%0#0" - ] - }, - "1307": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1308": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1309": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "holding_address#0" - ] - }, - "1310": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "0x52333023" - ] - }, - "1311": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "0x52333023", - "holding_address#0" - ] - }, - "1312": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "box_prefixed_key%0#0" - ] - }, - "1313": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "holding_address#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1314": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "maybe_exists%0#0" - ] - }, - "1316": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "holding_address#0" - ] - }, - "1317": { - "op": "intc_0 // 0" - }, - "1318": { - "op": "dup" - }, - "1319": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "0", - "\"status\"" - ] - }, - "1320": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1321": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "maybe_value%0#0" - ] - }, - "1322": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "maybe_value%0#0", - "100" - ] - }, - "1324": { - "op": "==", - "defined_out": [ - "holding_address#0", - "principal_amount#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "tmp%0#2" - ] - }, - "1325": { - "op": "bz get_payment_amount_after_if_else@3", - "stack_out": [ - "holding_address#0", - "principal_amount#0" - ] - }, - "1328": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "holding_address#0" - ] - }, - "1330": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "principal_amount#0" - ] - }, - "1333": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "principal_amount#0" - ] - }, - "1335": { - "block": "get_payment_amount_after_if_else@3", - "stack_in": [ - "holding_address#0", - "principal_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "0" - ] - }, - "1336": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1337": { - "op": "dig 1", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "aggregate%val_as_bytes%0#0", - "principal_amount#0" - ] - }, - "1339": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1340": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "aggregate%head%1#0" - ] - }, - "1341": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "1342": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "1343": { - "op": "concat", - "defined_out": [ - "principal_amount#0", - "tmp%3#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "tmp%3#0" - ] - }, - "1344": { - "op": "log", - "stack_out": [ - "holding_address#0", - "principal_amount#0" - ] - }, - "1345": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "principal_amount#0" - ], - "stack_out": [ - "holding_address#0", - "principal_amount#0", - "1" - ] - }, - "1346": { - "op": "return", - "stack_out": [ - "holding_address#0", - "principal_amount#0" - ] - }, - "1347": { - "subroutine": "modules.payment_agent.principal.PrincipalPaymentAgentMixin.pay_principal[routing]", - "params": {}, - "block": "pay_principal", - "stack_in": [], - "op": "txna ApplicationArgs 1" - }, - "1350": { - "op": "dupn 2", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "1352": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "len%0#0" - ] - }, - "1353": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "1354": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "eq%0#0" - ] - }, - "1355": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "holding_address#0" - ] - }, - "1356": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1359": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1360": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)", - "0" - ] - }, - "1361": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0" - ] - }, - "1362": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "1364": { - "op": "+", - "defined_out": [ - "add%0#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "add%0#0" - ] - }, - "1365": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "add%0#0", - "tmp%2#0 (copy)" - ] - }, - "1367": { - "op": "len", - "defined_out": [ - "add%0#0", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "add%0#0", - "len%1#0" - ] - }, - "1368": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "1369": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "holding_address#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "1370": { - "op": "extract 2 0", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0", - "payment_info#0" - ] - }, - "1373": { - "op": "swap", - "defined_out": [ - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0" - ] - }, - "1374": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0" - ] - }, - "1375": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0", - "\"status\"" - ] - }, - "1376": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1377": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "maybe_value%0#0" - ] - }, - "1378": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "maybe_value%0#0", - "100" - ] - }, - "1380": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_info#0", - "tmp%0#8" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "tmp%0#8" - ] - }, - "1381": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0" - ] - }, - "1382": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "1385": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "1388": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0x52333023" - ] - }, - "1389": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "1391": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1392": { - "op": "dup", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "1393": { - "op": "cover 2", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1395": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1396": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%0#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1397": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "1399": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1400": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1401": { - "op": "pop", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "aggregate%box_get%0#0" - ] - }, - "1402": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "aggregate%box_get%0#0", - "32" - ] - }, - "1403": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "units#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "units#0" - ] - }, - "1404": { - "error": "No D-ASA units", - "op": "assert // No D-ASA units", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0" - ] - }, - "1405": { - "op": "global LatestTimestamp", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%2#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1" - ] - }, - "1407": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "0" - ] - }, - "1408": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%2#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "0", - "\"maturity_date\"" - ] - }, - "1410": { - "op": "app_global_get_ex", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1411": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%2#1", - "maybe_value%0#0" - ] - }, - "1412": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_info#0", - "tmp%3#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0", - "tmp%3#3" - ] - }, - "1413": { - "error": "Not mature", - "op": "assert // Not mature", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "holding_address#0" - ] - }, - "1414": { - "callsub": "modules.accounting.AccountingModule.account_total_units_value", - "op": "callsub account_total_units_value", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1417": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0" - ] - }, - "1418": { - "op": "bytec 19 // 0x52323523", - "defined_out": [ - "0", - "0x52323523", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0", - "0x52323523" - ] - }, - "1420": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#5", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#5", - "maybe_exists%0#0" - ] - }, - "1421": { - "error": "check self.op_daemon exists", - "op": "assert // check self.op_daemon exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#5" - ] - }, - "1422": { - "op": "global ZeroAddress", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_value%0#5", - "payment_amount#0", - "payment_info#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#5", - "tmp%0#3" - ] - }, - "1424": { - "op": "!=", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%1#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%1#3" - ] - }, - "1425": { - "op": "bz pay_principal_after_if_else@22", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1428": { - "op": "txn Sender", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%2#4" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#4" - ] - }, - "1430": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#4", - "0" - ] - }, - "1431": { - "op": "bytec 19 // 0x52323523", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#4", - "0", - "0x52323523" - ] - }, - "1433": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "maybe_exists%1#1", - "maybe_value%1#1", - "payment_amount#0", - "payment_info#0", - "tmp%2#4" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#4", - "maybe_value%1#1", - "maybe_exists%1#1" - ] - }, - "1434": { - "error": "check self.op_daemon exists", - "op": "assert // check self.op_daemon exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#4", - "maybe_value%1#1" - ] - }, - "1435": { - "op": "==", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%3#3" - ] - }, - "1436": { - "op": "bnz pay_principal_bool_true@19", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1439": { - "op": "txn Sender", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%4#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%4#0" - ] - }, - "1441": { - "op": "dig 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%4#0", - "holding_address#0" - ] - }, - "1443": { - "op": "==", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%5#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%5#1" - ] - }, - "1444": { - "op": "bnz pay_principal_bool_true@19", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1447": { - "op": "txn Sender", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%6#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%6#0" - ] - }, - "1449": { - "op": "dig 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%6#0", - "box_prefixed_key%0#3" - ] - }, - "1451": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%6#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%6#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "1452": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%6#0", - "aggregate%box_get%2#0" - ] - }, - "1453": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%6#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%6#0", - "aggregate%extract%1#0" - ] - }, - "1456": { - "op": "==", - "defined_out": [ - "box_prefixed_key%0#3", - "holding_address#0", - "payment_amount#0", - "payment_info#0", - "tmp%7#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%7#0" - ] - }, - "1457": { - "op": "bz pay_principal_bool_false@20", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1460": { - "block": "pay_principal_bool_true@19", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "or_result%0#0" - ] - }, - "1461": { - "error": "Not authorized", - "block": "pay_principal_bool_merge@21", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "or_result%0#0" - ], - "op": "assert // Not authorized", - "defined_out": [], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1462": { - "block": "pay_principal_after_if_else@22", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3" - ] - }, - "1464": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "1465": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%box_get%4#0" - ] - }, - "1466": { - "op": "extract 0 32", - "defined_out": [ - "aggregate%extract%2#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%extract%2#0" - ] - }, - "1469": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "aggregate%extract%2#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%extract%2#0", - "0" - ] - }, - "1470": { - "op": "bytec 13 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "aggregate%extract%2#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%extract%2#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "1472": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%extract%2#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%extract%2#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1473": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%extract%2#0", - "maybe_value%0#0" - ] - }, - "1474": { - "op": "asset_holding_get AssetBalance", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%0#1", - "tmp%1#3" - ] - }, - "1476": { - "op": "bury 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%1#3" - ] - }, - "1478": { - "op": "bz pay_principal_bool_false@27", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1481": { - "op": "dig 1", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3" - ] - }, - "1483": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "1484": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%box_get%6#0" - ] - }, - "1485": { - "op": "pushint 448", - "defined_out": [ - "448", - "aggregate%box_get%6#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%box_get%6#0", - "448" - ] - }, - "1488": { - "op": "getbit", - "defined_out": [ - "aggregate%get_bit%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%get_bit%0#0" - ] - }, - "1489": { - "op": "bnz pay_principal_bool_false@27", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1492": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "and_result%0#0" - ] - }, - "1493": { - "block": "pay_principal_bool_merge@28", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "and_result%0#0" - ], - "op": "bz pay_principal_else_body@3", - "defined_out": [], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1496": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%0#3" - ] - }, - "1498": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%0#3", - "0" - ] - }, - "1499": { - "op": "bytec 13 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%0#3", - "0", - "\"settlement_asset_id\"" - ] - }, - "1501": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%0#3", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1502": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%0#3", - "maybe_value%0#0" - ] - }, - "1503": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "tmp%0#3" - ] - }, - "1504": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "tmp%0#3", - "maybe_value%0#0 (copy)" - ] - }, - "1506": { - "op": "asset_holding_get AssetBalance", - "defined_out": [ - "check%0#0", - "maybe_value%0#0", - "value%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "value%0#1", - "check%0#0" - ] - }, - "1508": { - "error": "account opted into asset", - "op": "assert // account opted into asset", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "value%0#1" - ] - }, - "1509": { - "op": "dig 2", - "defined_out": [ - "maybe_value%0#0", - "payment_amount#0", - "value%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "value%0#1", - "payment_amount#0" - ] - }, - "1511": { - "op": "dup", - "defined_out": [ - "maybe_value%0#0", - "payment_amount#0", - "payment_amount#0 (copy)", - "value%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "value%0#1", - "payment_amount#0 (copy)", - "payment_amount#0 (copy)" - ] - }, - "1512": { - "op": "cover 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "value%0#1", - "payment_amount#0 (copy)" - ] - }, - "1514": { - "op": ">=", - "defined_out": [ - "maybe_value%0#0", - "payment_amount#0", - "tmp%1#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "tmp%1#3" - ] - }, - "1515": { - "error": "Not enough funds for the payment", - "op": "assert // Not enough funds for the payment", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0" - ] - }, - "1516": { - "op": "dig 3", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "box_prefixed_key%0#3" - ] - }, - "1518": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "1519": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "aggregate%box_get%8#0" - ] - }, - "1520": { - "op": "extract 0 32", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "receiver#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "receiver#0" - ] - }, - "1523": { - "op": "itxn_begin" - }, - "1524": { - "op": "global MinTxnFee", - "defined_out": [ - "box_prefixed_key%0#3", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "payment_amount#0", - "receiver#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "payment_amount#0", - "receiver#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1526": { - "op": "uncover 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "receiver#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "payment_amount#0" - ] - }, - "1528": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "receiver#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1530": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "receiver#0" - ] - }, - "1531": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1533": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ] - }, - "1534": { - "op": "itxn_field XferAsset", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1536": { - "op": "pushint 4 // axfer", - "defined_out": [ - "axfer", - "box_prefixed_key%0#3", - "inner_txn_params%0%%param_Fee_idx_0#0", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "1538": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1540": { - "op": "itxn_field Fee", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1542": { - "op": "itxn_submit" - }, - "1543": { - "block": "pay_principal_after_if_else@4", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0" - ] - }, - "1544": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0", - "\"circulating_units\"" - ] - }, - "1545": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1546": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0" - ] - }, - "1547": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "box_prefixed_key%0#3" - ] - }, - "1549": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "maybe_value%0#0", - "box_prefixed_key%0#3 (copy)", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1550": { - "op": "cover 2", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1552": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%10#0", - "aggregate%box_get%11#0", - "box_prefixed_key%0#3", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "aggregate%box_get%10#0", - "aggregate%box_get%11#0" - ] - }, - "1553": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "aggregate%box_get%10#0" - ] - }, - "1554": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%10#0", - "box_prefixed_key%0#3", - "maybe_value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "aggregate%box_get%10#0", - "32" - ] - }, - "1555": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "maybe_value%0#0", - "values%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "values%0#1" - ] - }, - "1556": { - "op": "-", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "1557": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "tmp%0#1", - "\"circulating_units\"" - ] - }, - "1558": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "\"circulating_units\"", - "tmp%0#1" - ] - }, - "1559": { - "op": "app_global_put", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3" - ] - }, - "1560": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "0" - ] - }, - "1561": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "box_prefixed_key%0#3", - "aggregate%val_as_bytes%0#0" - ] - }, - "1562": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3" - ] - }, - "1563": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "32" - ] - }, - "1564": { - "op": "dig 2", - "defined_out": [ - "32", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "32", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "1566": { - "op": "box_replace", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1567": { - "callsub": "modules.accounting.AccountingModule.end_if_no_circulating_units", - "op": "callsub end_if_no_circulating_units" - }, - "1570": { - "op": "global CurrentApplicationID", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1" - ] - }, - "1572": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2" - ] - }, - "1574": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "0" - ] - }, - "1575": { - "op": "bytec 22 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "0", - "\"denomination_asset_id\"" - ] - }, - "1577": { - "op": "app_global_get_ex", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1578": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0" - ] - }, - "1579": { - "op": "dup", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#1", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "1580": { - "op": "asset_params_get AssetUnitName", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "check%0#0", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "check%0#0" - ] - }, - "1582": { - "error": "asset exists", - "op": "assert // asset exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0" - ] - }, - "1583": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "0" - ] - }, - "1584": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "0", - "\"circulating_units\"" - ] - }, - "1585": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_exists%2#0", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1586": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0" - ] - }, - "1587": { - "op": "intc_0 // 0", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "1588": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "maybe_value%2#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "0", - "\"unit_value\"" - ] - }, - "1590": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_exists%3#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1", - "tmp%1#2", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1591": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "1592": { - "op": "*", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%0#1", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%0#1", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1" - ] - }, - "1593": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "tmp%0#1" - ] - }, - "1595": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%1#0" - ] - }, - "1596": { - "op": "pushbytes 0x030037", - "defined_out": [ - "0x030037", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%1#0", - "0x030037" - ] - }, - "1601": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%1#2", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%1#2", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%2#0" - ] - }, - "1602": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%2#0", - "tmp%1#2" - ] - }, - "1604": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%2#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1605": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%3#0" - ] - }, - "1606": { - "op": "dig 5", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%3#0", - "payment_amount#0" - ] - }, - "1608": { - "op": "itob", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1609": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0" - ] - }, - "1610": { - "op": "dig 1", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "1612": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "maybe_value%0#0", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0" - ] - }, - "1613": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "maybe_value%0#0" - ] - }, - "1615": { - "op": "itob", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%4#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%4#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "1616": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0" - ] - }, - "1617": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0", - "value%0#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "value%0#0 (copy)" - ] - }, - "1619": { - "op": "len", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length%1#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length%1#0" - ] - }, - "1620": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%2#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%as_bytes%2#0" - ] - }, - "1621": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1", - "value%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "value%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0" - ] - }, - "1624": { - "op": "uncover 4", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%length_uint16%1#0", - "value%0#0" - ] - }, - "1626": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%head%5#0", - "aggregate%encoded_value%1#0" - ] - }, - "1627": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0" - ] - }, - "1628": { - "op": "pushbytes 0x003b", - "defined_out": [ - "0x003b", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%5#0", - "0x003b" - ] - }, - "1632": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%2#1" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "tmp%2#1", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0" - ] - }, - "1633": { - "op": "uncover 3", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "tmp%2#1" - ] - }, - "1635": { - "op": "itob", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%5#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "1636": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0" - ] - }, - "1637": { - "op": "bytec 30 // 0x0000", - "defined_out": [ - "0x0000", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%7#0", - "0x0000" - ] - }, - "1639": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0" - ] - }, - "1640": { - "op": "uncover 3", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "1642": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0" - ] - }, - "1643": { - "op": "pushbytes 0x00025052", - "defined_out": [ - "0x00025052", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%head%9#0", - "0x00025052" - ] - }, - "1649": { - "op": "concat", - "defined_out": [ - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%encoded_value%1#0", - "aggregate%concat%0#0" - ] - }, - "1650": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%0#0", - "aggregate%encoded_value%1#0" - ] - }, - "1651": { - "op": "concat", - "defined_out": [ - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0" - ] - }, - "1652": { - "op": "pushbytes 0x8c29904e // method \"Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)\"", - "defined_out": [ - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%concat%1#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))" - ] - }, - "1658": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "Method(Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64))", - "aggregate%concat%1#0" - ] - }, - "1659": { - "op": "concat", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "event%0#0", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "event%0#0" - ] - }, - "1660": { - "op": "log", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1661": { - "op": "global LatestTimestamp", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "tmp%2#1" - ] - }, - "1663": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "1664": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0" - ] - }, - "1665": { - "op": "dig 3", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0" - ] - }, - "1667": { - "op": "dup", - "defined_out": [ - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0", - "payment_info#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "payment_info#0 (copy)" - ] - }, - "1668": { - "op": "len", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length%2#0" - ] - }, - "1669": { - "op": "itob", - "defined_out": [ - "aggregate%as_bytes%4#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%as_bytes%4#0" - ] - }, - "1670": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "payment_info#0", - "aggregate%length_uint16%2#0" - ] - }, - "1673": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "aggregate%length_uint16%2#0", - "payment_info#0" - ] - }, - "1674": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%11#0", - "aggregate%encoded_value%2#0" - ] - }, - "1675": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0" - ] - }, - "1676": { - "op": "pushbytes 0x0012", - "defined_out": [ - "0x0012", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%encoded_value%2#0", - "aggregate%head%11#0", - "0x0012" - ] - }, - "1680": { - "op": "concat", - "defined_out": [ - "aggregate%encoded_value%2#0", - "aggregate%head%12#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%encoded_value%2#0", - "aggregate%head%12#0" - ] - }, - "1681": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%head%12#0", - "aggregate%encoded_value%2#0" - ] - }, - "1682": { - "op": "concat", - "defined_out": [ - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%concat%2#0" - ] - }, - "1683": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%concat%2#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "aggregate%concat%2#0", - "0x151f7c75" - ] - }, - "1684": { - "op": "swap", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "0x151f7c75", - "aggregate%concat%2#0" - ] - }, - "1685": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0", - "tmp%5#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "tmp%5#0" - ] - }, - "1686": { - "op": "log", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1687": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_info#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "1" - ] - }, - "1688": { - "op": "return", - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1689": { - "block": "pay_principal_else_body@3", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "payment_amount#0" - ] - }, - "1690": { - "op": "bury 1", - "defined_out": [ - "payment_amount#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ] - }, - "1692": { - "op": "b pay_principal_after_if_else@4" - }, - "1695": { - "block": "pay_principal_bool_false@27", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "and_result%0#0" - ] - }, - "1696": { - "op": "b pay_principal_bool_merge@28" - }, - "1699": { - "block": "pay_principal_bool_false@20", - "stack_in": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "holding_address#0", - "payment_info#0", - "box_prefixed_key%0#3", - "payment_amount#0", - "or_result%0#0" - ] - }, - "1700": { - "op": "b pay_principal_bool_merge@21" - }, - "1703": { - "subroutine": "modules.transfer_agent.no_coupon.NoCouponTransferAgentMixin.asset_transfer[routing]", - "params": {}, - "block": "asset_transfer", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0" - ] - }, - "1704": { - "op": "dupn 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ] - }, - "1706": { - "op": "pushbytes \"\"", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0" - ] - }, - "1708": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0" - ] - }, - "1709": { - "op": "txna ApplicationArgs 1" - }, - "1712": { - "op": "dup", - "defined_out": [ - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "sender_holding_address#0" - ] - }, - "1713": { - "op": "len", - "defined_out": [ - "len%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "len%0#0" - ] - }, - "1714": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "len%0#0", - "32" - ] - }, - "1715": { - "op": "==", - "defined_out": [ - "eq%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "eq%0#0" - ] - }, - "1716": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0" - ] - }, - "1717": { - "op": "txna ApplicationArgs 2" - }, - "1720": { - "op": "dup", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "receiver_holding_address#0" - ] - }, - "1721": { - "op": "len", - "defined_out": [ - "len%1#0", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "len%1#0" - ] - }, - "1722": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "len%1#0", - "32" - ] - }, - "1723": { - "op": "==", - "defined_out": [ - "eq%1#0", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "eq%1#0" - ] - }, - "1724": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0" - ] - }, - "1725": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0" - ] - }, - "1728": { - "op": "dup", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "tmp%4#0 (copy)" - ] - }, - "1729": { - "op": "len", - "defined_out": [ - "len%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "len%2#0" - ] - }, - "1730": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "len%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "len%2#0", - "8" - ] - }, - "1731": { - "op": "==", - "defined_out": [ - "eq%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0", - "eq%2#0" - ] - }, - "1732": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "tmp%4#0" - ] - }, - "1733": { - "op": "btoi", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1734": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "1735": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"status\"" - ] - }, - "1736": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1737": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "1738": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "100" - ] - }, - "1740": { - "op": "==", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%0#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#1" - ] - }, - "1741": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1744": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "1745": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "1747": { - "op": "app_global_get_ex", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1748": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "1749": { - "op": "global LatestTimestamp", - "defined_out": [ - "maybe_value%0#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%0#0", - "tmp%1#1" - ] - }, - "1751": { - "op": "<=", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%2#2", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%2#2" - ] - }, - "1752": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1755": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "1756": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "1758": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1759": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "1760": { - "op": "bz asset_transfer_bool_true@5", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1763": { - "op": "global LatestTimestamp", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1" - ] - }, - "1765": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "0" - ] - }, - "1766": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "1768": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1769": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%4#1", - "maybe_value%2#0" - ] - }, - "1770": { - "op": "<", - "defined_out": [ - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%5#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%5#0" - ] - }, - "1771": { - "op": "bz asset_transfer_bool_false@6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1774": { - "block": "asset_transfer_bool_true@5", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1775": { - "error": "Secondary market is closed", - "block": "asset_transfer_bool_merge@7", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Secondary market is closed", - "defined_out": [], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1776": { - "op": "txn Sender", - "defined_out": [ - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3" - ] - }, - "1778": { - "op": "dig 3", - "defined_out": [ - "sender_holding_address#0", - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3", - "sender_holding_address#0" - ] - }, - "1780": { - "op": "dup", - "defined_out": [ - "sender_holding_address#0", - "sender_holding_address#0 (copy)", - "tmp%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#3", - "sender_holding_address#0 (copy)", - "sender_holding_address#0 (copy)" - ] - }, - "1781": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "tmp%0#3", - "sender_holding_address#0 (copy)" - ] - }, - "1783": { - "op": "==", - "defined_out": [ - "sender_holding_address#0", - "tmp%1#4" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "tmp%1#4" - ] - }, - "1784": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0" - ] - }, - "1785": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "1788": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "1791": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "0x52333023" - ] - }, - "1792": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "0x52333023", - "sender_holding_address#0 (copy)" - ] - }, - "1794": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "1795": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2" - ] - }, - "1796": { - "op": "bury 9", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "1798": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ] - }, - "1799": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#2", - "maybe_exists%0#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1800": { - "op": "bury 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "maybe_exists%0#0" - ] - }, - "1802": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2" - ] - }, - "1803": { - "op": "bytec_1 // 0x52333023", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023" - ] - }, - "1804": { - "op": "dig 4", - "defined_out": [ - "0x52333023", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023", - "receiver_holding_address#0" - ] - }, - "1806": { - "op": "dup", - "defined_out": [ - "0x52333023", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "receiver_holding_address#0 (copy)", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "0x52333023", - "receiver_holding_address#0 (copy)", - "receiver_holding_address#0 (copy)" - ] - }, - "1807": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "0x52333023", - "receiver_holding_address#0 (copy)" - ] - }, - "1809": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1810": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3" - ] - }, - "1811": { - "op": "bury 10", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1813": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "receiver_holding_address#0", - "sender_holding_address#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1814": { - "op": "box_len", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "1815": { - "op": "bury 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "maybe_exists%0#0" - ] - }, - "1817": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1818": { - "op": "dig 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "sender_holding_address#0 (copy)" - ] - }, - "1820": { - "callsub": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "op": "callsub assert_is_not_account_suspended", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1823": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "receiver_holding_address#0 (copy)" - ] - }, - "1825": { - "callsub": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "op": "callsub assert_is_not_account_suspended", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "sender_holding_address#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3" - ] - }, - "1828": { - "op": "uncover 3", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "receiver_holding_address#0", - "box_prefixed_key%0#3", - "sender_holding_address#0" - ] - }, - "1830": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "sender_holding_address#0", - "receiver_holding_address#0" - ] - }, - "1832": { - "op": "!=", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%0#1" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "tmp%0#1" - ] - }, - "1833": { - "error": "Sender and receiver must be different", - "op": "assert // Sender and receiver must be different", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ] - }, - "1834": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0" - ] - }, - "1836": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0", - "units#0 (copy)" - ] - }, - "1837": { - "error": "Transfer units must be greater than zero", - "op": "assert // Transfer units must be greater than zero", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "units#0" - ] - }, - "1838": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "1840": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "1841": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0" - ] - }, - "1842": { - "op": "dup", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)" - ] - }, - "1843": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "aggregate%box_get%0#0 (copy)", - "32" - ] - }, - "1844": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%box_get%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%box_get%0#0", - "values%0#0" - ] - }, - "1845": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "values%0#0", - "units#0" - ] - }, - "1847": { - "op": ">=", - "defined_out": [ - "aggregate%box_get%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "tmp%2#2", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0", - "tmp%2#2" - ] - }, - "1848": { - "error": "Insufficient sender units to transfer", - "op": "assert // Insufficient sender units to transfer", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%0#0" - ] - }, - "1849": { - "op": "extract 40 8", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%extract%1#0" - ] - }, - "1852": { - "op": "bury 9", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "1854": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "1855": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0" - ] - }, - "1856": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%4#0", - "32" - ] - }, - "1857": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%1#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%1#0" - ] - }, - "1858": { - "op": "bz asset_transfer_else_body@9", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1861": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "1863": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "1864": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0" - ] - }, - "1865": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%6#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%6#0", - "40" - ] - }, - "1867": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0" - ] - }, - "1868": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "box_prefixed_key%0#3" - ] - }, - "1870": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "1871": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0" - ] - }, - "1872": { - "op": "pushint 40", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "aggregate%box_get%8#0", - "40" - ] - }, - "1874": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0", - "values%1#0" - ] - }, - "1875": { - "op": "==", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%0#1" - ] - }, - "1876": { - "op": "bz asset_transfer_bool_false@20", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1879": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "1881": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%10#0", - "aggregate%box_get%11#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0", - "aggregate%box_get%11#0" - ] - }, - "1882": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0" - ] - }, - "1883": { - "op": "pushint 48", - "defined_out": [ - "48", - "aggregate%box_get%10#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%10#0", - "48" - ] - }, - "1885": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0" - ] - }, - "1886": { - "op": "dig 6", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "box_prefixed_key%0#3" - ] - }, - "1888": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%12#0", - "aggregate%box_get%13#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0", - "aggregate%box_get%13#0" - ] - }, - "1889": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0" - ] - }, - "1890": { - "op": "pushint 48", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "aggregate%box_get%12#0", - "48" - ] - }, - "1892": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0", - "values%2#0", - "values%3#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%2#0", - "values%3#0" - ] - }, - "1893": { - "op": "==", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#4" - ] - }, - "1894": { - "op": "bz asset_transfer_bool_false@20", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1897": { - "op": "intc_1 // 1", - "defined_out": [ - "aggregate%extract%1#0", - "and_result%0#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "receiver_holding_address#0", - "sender_holding_address#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1898": { - "error": "Sender and receiver units are not fungible", - "block": "asset_transfer_bool_merge@21", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Sender and receiver units are not fungible", - "defined_out": [], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1899": { - "block": "asset_transfer_after_if_else@10", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 6", - "defined_out": [ - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "1901": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)" - ] - }, - "1902": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%16#0", - "aggregate%box_get%17#0", - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0", - "aggregate%box_get%17#0" - ] - }, - "1903": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0" - ] - }, - "1904": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%16#0", - "box_prefixed_key%0#2" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%box_get%16#0", - "40" - ] - }, - "1906": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_unit_value#0" - ] - }, - "1907": { - "op": "bury 5", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "1909": { - "op": "dig 3", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0" - ] - }, - "1911": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "units#0" - ] - }, - "1913": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "units#0 (copy)", - "units#0 (copy)" - ] - }, - "1914": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "sender_holding_address#0", - "units#0 (copy)" - ] - }, - "1916": { - "callsub": "modules.core_financial.no_coupon.NoCouponCashflowMixin.accrued_interest_amount", - "op": "callsub accrued_interest_amount", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "accrued_interest#0" - ] - }, - "1919": { - "op": "bury 7", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0" - ] - }, - "1921": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "1923": { - "op": "box_get", - "defined_out": [ - "accrued_interest#0", - "aggregate%box_get%18#0", - "aggregate%box_get%19#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0", - "aggregate%box_get%19#0" - ] - }, - "1924": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0" - ] - }, - "1925": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "accrued_interest#0", - "aggregate%box_get%18#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "aggregate%box_get%18#0", - "32" - ] - }, - "1926": { - "op": "extract_uint64", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0" - ] - }, - "1927": { - "op": "dup2", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0", - "units#0 (copy)", - "values%0#0", - "values%0#0 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0", - "units#0 (copy)", - "values%0#0 (copy)" - ] - }, - "1928": { - "op": "<=", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "tmp%0#1", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0", - "tmp%0#1" - ] - }, - "1929": { - "error": "Insufficient sender units to transfer", - "op": "assert // Insufficient sender units to transfer", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "units#0", - "values%0#0" - ] - }, - "1930": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "values%0#0", - "units#0" - ] - }, - "1931": { - "op": "-", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "tmp%1#1" - ] - }, - "1932": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0" - ] - }, - "1933": { - "op": "dig 1", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "1935": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#2 (copy)", - "32" - ] - }, - "1936": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "32", - "aggregate%val_as_bytes%0#0" - ] - }, - "1938": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2" - ] - }, - "1939": { - "op": "box_get", - "defined_out": [ - "accrued_interest#0", - "aggregate%box_get%22#0", - "aggregate%box_get%23#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0", - "aggregate%box_get%23#0" - ] - }, - "1940": { - "op": "pop", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0" - ] - }, - "1941": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%box_get%22#0", - "32" - ] - }, - "1942": { - "op": "extract_uint64", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "values%0#0" - ] - }, - "1943": { - "op": "bnz asset_transfer_after_if_else@16", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1946": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0" - ] - }, - "1947": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "1948": { - "op": "dig 7", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2" - ] - }, - "1950": { - "op": "dup", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "box_prefixed_key%0#2 (copy)" - ] - }, - "1951": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)" - ] - }, - "1953": { - "op": "pushint 40", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "40" - ] - }, - "1955": { - "op": "dig 2", - "defined_out": [ - "40", - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)", - "box_prefixed_key%0#2", - "box_prefixed_key%0#2 (copy)", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2 (copy)", - "40", - "aggregate%val_as_bytes%1#0 (copy)" - ] - }, - "1957": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "aggregate%val_as_bytes%1#0" - ] - }, - "1958": { - "op": "pushint 48" - }, - "1960": { - "op": "swap", - "defined_out": [ - "48", - "accrued_interest#0", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#2", - "sender_holding_address#0", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#2", - "48", - "aggregate%val_as_bytes%1#0" - ] - }, - "1961": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1962": { - "block": "asset_transfer_after_if_else@16", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 5", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "1964": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "1965": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%24#0", - "aggregate%box_get%25#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0", - "aggregate%box_get%25#0" - ] - }, - "1966": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0" - ] - }, - "1967": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%24#0", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%24#0", - "32" - ] - }, - "1968": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#3", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0" - ] - }, - "1969": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#3", - "units#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0", - "units#0" - ] - }, - "1971": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "units#0", - "units#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "values%0#0", - "units#0 (copy)", - "units#0 (copy)" - ] - }, - "1972": { - "op": "cover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "values%0#0", - "units#0 (copy)" - ] - }, - "1974": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#3", - "tmp%0#7", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "tmp%0#7" - ] - }, - "1975": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "units#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "1976": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3" - ] - }, - "1978": { - "op": "intc_2 // 32", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "box_prefixed_key%0#3", - "32" - ] - }, - "1979": { - "op": "uncover 2", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "box_prefixed_key%0#3", - "32", - "aggregate%val_as_bytes%2#0" - ] - }, - "1981": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0" - ] - }, - "1982": { - "op": "dig 4", - "defined_out": [ - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "units#0", - "sender_unit_value#0" - ] - }, - "1984": { - "op": "*", - "defined_out": [ - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "1985": { - "op": "dig 5", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%1#1", - "accrued_interest#0" - ] - }, - "1987": { - "op": "+", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "1988": { - "op": "itob", - "defined_out": [ - "accrued_interest#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "1989": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "accrued_interest#0", - "aggregate%val_as_bytes%3#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "1990": { - "op": "swap", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "1991": { - "op": "concat", - "defined_out": [ - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "tmp%8#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "tmp%8#0" - ] - }, - "1992": { - "op": "log", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1993": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "accrued_interest#0", - "box_prefixed_key%0#3", - "sender_unit_value#0", - "units#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "1" - ] - }, - "1994": { - "op": "return", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "1995": { - "block": "asset_transfer_bool_false@20", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "1996": { - "op": "b asset_transfer_bool_merge@21" - }, - "1999": { - "block": "asset_transfer_else_body@9", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "dig 5", - "defined_out": [ - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2001": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ] - }, - "2002": { - "op": "pushint 40", - "defined_out": [ - "40", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "40" - ] - }, - "2004": { - "op": "dig 10", - "defined_out": [ - "40", - "aggregate%extract%1#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#3 (copy)", - "40", - "aggregate%extract%1#0" - ] - }, - "2006": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3" - ] - }, - "2007": { - "op": "dig 7", - "defined_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "box_prefixed_key%0#2" - ] - }, - "2009": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%14#0", - "aggregate%box_get%15#0", - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%14#0", - "aggregate%box_get%15#0" - ] - }, - "2010": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%box_get%14#0" - ] - }, - "2011": { - "op": "extract 48 8", - "defined_out": [ - "aggregate%extract%1#0", - "aggregate%extract%7#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "aggregate%extract%7#0" - ] - }, - "2014": { - "op": "pushint 48" - }, - "2016": { - "op": "swap", - "defined_out": [ - "48", - "aggregate%extract%1#0", - "aggregate%extract%7#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "box_prefixed_key%0#3", - "48", - "aggregate%extract%7#0" - ] - }, - "2017": { - "op": "box_replace", - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ] - }, - "2018": { - "op": "b asset_transfer_after_if_else@10" - }, - "2021": { - "block": "asset_transfer_bool_false@6", - "stack_in": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "aggregate%extract%1#0", - "box_prefixed_key%0#2", - "box_prefixed_key%0#3", - "accrued_interest#0", - "sender_unit_value#0", - "sender_holding_address#0", - "receiver_holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2022": { - "op": "b asset_transfer_bool_merge@7" - }, - "2025": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.asset_create[routing]", - "params": {}, - "block": "asset_create", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "arranger#0" - ], - "stack_out": [ - "arranger#0" - ] - }, - "2028": { - "op": "dup", - "defined_out": [ - "arranger#0", - "arranger#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "arranger#0 (copy)" - ] - }, - "2029": { - "op": "len", - "defined_out": [ - "arranger#0", - "len%0#0" - ], - "stack_out": [ - "arranger#0", - "len%0#0" - ] - }, - "2030": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "arranger#0", - "len%0#0" - ], - "stack_out": [ - "arranger#0", - "len%0#0", - "32" - ] - }, - "2031": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%0#0" - ], - "stack_out": [ - "arranger#0", - "eq%0#0" - ] - }, - "2032": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "arranger#0" - ] - }, - "2033": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "arranger#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0" - ] - }, - "2036": { - "op": "dup", - "defined_out": [ - "arranger#0", - "metadata#0", - "metadata#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "metadata#0 (copy)" - ] - }, - "2037": { - "op": "len", - "defined_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ] - }, - "2038": { - "op": "dig 1", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)" - ] - }, - "2040": { - "op": "pushint 38", - "defined_out": [ - "38", - "arranger#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "38" - ] - }, - "2042": { - "error": "invalid tuple encoding", - "op": "extract_uint16 // on error: invalid tuple encoding", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2043": { - "op": "dup", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)" - ] - }, - "2044": { - "op": "pushint 40", - "defined_out": [ - "40", - "arranger#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "40" - ] - }, - "2046": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%1#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "eq%1#0" - ] - }, - "2047": { - "error": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "op": "assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2048": { - "op": "dig 2", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "metadata#0 (copy)" - ] - }, - "2050": { - "op": "swap", - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0" - ] - }, - "2051": { - "op": "dig 2", - "defined_out": [ - "arranger#0", - "extract_uint16%0#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0", - "tuple_len%0#0 (copy)" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0", - "tuple_len%0#0 (copy)" - ] - }, - "2053": { - "op": "substring3", - "defined_out": [ - "arranger#0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "substring3%0#0" - ] - }, - "2054": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "arranger#0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "substring3%0#0", - "0" - ] - }, - "2055": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0" - ] - }, - "2056": { - "op": "pushint 42", - "defined_out": [ - "42", - "aggregate%array_length%0#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0", - "42" - ] - }, - "2058": { - "op": "+", - "defined_out": [ - "add%1#0", - "arranger#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "tuple_len%0#0", - "add%1#0" - ] - }, - "2059": { - "op": "==", - "defined_out": [ - "arranger#0", - "eq%2#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "eq%2#0" - ] - }, - "2060": { - "error": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "op": "assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "stack_out": [ - "arranger#0", - "metadata#0" - ] - }, - "2061": { - "op": "bytec 5 // 0x52323023", - "defined_out": [ - "0x52323023", - "arranger#0", - "metadata#0" - ], - "stack_out": [ - "arranger#0", - "metadata#0", - "0x52323023" - ] - }, - "2063": { - "op": "uncover 2", - "stack_out": [ - "metadata#0", - "0x52323023", - "arranger#0" - ] - }, - "2065": { - "op": "app_global_put", - "stack_out": [ - "metadata#0" - ] - }, - "2066": { - "op": "bytec 23 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "\"metadata\"" - ] - }, - "2068": { - "op": "swap", - "stack_out": [ - "\"metadata\"", - "metadata#0" - ] - }, - "2069": { - "op": "app_global_put", - "stack_out": [] - }, - "2070": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2071": { - "op": "return", - "stack_out": [] - }, - "2072": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.asset_update[routing]", - "params": {}, - "block": "asset_update", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "metadata#0" - ], - "stack_out": [ - "metadata#0" - ] - }, - "2075": { - "op": "dup", - "defined_out": [ - "metadata#0", - "metadata#0 (copy)" - ], - "stack_out": [ - "metadata#0", - "metadata#0 (copy)" - ] - }, - "2076": { - "op": "len", - "defined_out": [ - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0" - ] - }, - "2077": { - "op": "dig 1", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)" - ] - }, - "2079": { - "op": "pushint 38", - "defined_out": [ - "38", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "38" - ] - }, - "2081": { - "error": "invalid tuple encoding", - "op": "extract_uint16 // on error: invalid tuple encoding", - "defined_out": [ - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2082": { - "op": "dup", - "defined_out": [ - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)" - ] - }, - "2083": { - "op": "pushint 40", - "defined_out": [ - "40", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "extract_uint16%0#0 (copy)", - "40" - ] - }, - "2085": { - "op": "==", - "defined_out": [ - "eq%0#0", - "extract_uint16%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "eq%0#0" - ] - }, - "2086": { - "error": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "op": "assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0" - ] - }, - "2087": { - "op": "dig 2", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "extract_uint16%0#0", - "metadata#0 (copy)" - ] - }, - "2089": { - "op": "swap", - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0" - ] - }, - "2090": { - "op": "dig 2", - "defined_out": [ - "extract_uint16%0#0", - "metadata#0", - "metadata#0 (copy)", - "tuple_len%0#0", - "tuple_len%0#0 (copy)" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "metadata#0 (copy)", - "extract_uint16%0#0", - "tuple_len%0#0 (copy)" - ] - }, - "2092": { - "op": "substring3", - "defined_out": [ - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "substring3%0#0" - ] - }, - "2093": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "metadata#0", - "substring3%0#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "substring3%0#0", - "0" - ] - }, - "2094": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0" - ] - }, - "2095": { - "op": "pushint 42", - "defined_out": [ - "42", - "aggregate%array_length%0#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "aggregate%array_length%0#0", - "42" - ] - }, - "2097": { - "op": "+", - "defined_out": [ - "add%1#0", - "metadata#0", - "tuple_len%0#0" - ], - "stack_out": [ - "metadata#0", - "tuple_len%0#0", - "add%1#0" - ] - }, - "2098": { - "op": "==", - "defined_out": [ - "eq%1#0", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "eq%1#0" - ] - }, - "2099": { - "error": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "op": "assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata", - "stack_out": [ - "metadata#0" - ] - }, - "2100": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2103": { - "op": "bytec 23 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "metadata#0" - ], - "stack_out": [ - "metadata#0", - "\"metadata\"" - ] - }, - "2105": { - "op": "swap", - "stack_out": [ - "\"metadata\"", - "metadata#0" - ] - }, - "2106": { - "op": "app_global_put", - "stack_out": [] - }, - "2107": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2108": { - "op": "return", - "stack_out": [] - }, - "2109": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.set_secondary_time_events[routing]", - "params": {}, - "block": "set_secondary_time_events", - "stack_in": [], - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0" - ] - }, - "2110": { - "op": "txna ApplicationArgs 1" - }, - "2113": { - "op": "dupn 2", - "defined_out": [ - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "2115": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)", - "0" - ] - }, - "2116": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2117": { - "op": "dup", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "2118": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)", - "8" - ] - }, - "2119": { - "op": "*", - "defined_out": [ - "aggregate%array_length%0#0", - "mul%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "mul%0#0" - ] - }, - "2120": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "mul%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "mul%0#0", - "2" - ] - }, - "2122": { - "op": "+", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0" - ] - }, - "2123": { - "op": "uncover 2", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0", - "secondary_market_time_events#0" - ] - }, - "2125": { - "op": "len", - "defined_out": [ - "add%0#0", - "aggregate%array_length%0#0", - "len%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "add%0#0", - "len%0#0" - ] - }, - "2126": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "eq%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "eq%0#0" - ] - }, - "2127": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2128": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2131": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "0" - ] - }, - "2132": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "0", - "\"status\"" - ] - }, - "2133": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_length%0#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2134": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0" - ] - }, - "2135": { - "op": "intc 4 // 200", - "defined_out": [ - "200", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "maybe_value%0#0", - "200" - ] - }, - "2137": { - "op": "==", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0", - "tmp%0#2" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "tmp%0#2" - ] - }, - "2138": { - "op": "!", - "defined_out": [ - "aggregate%array_length%0#0", - "secondary_market_time_events#0", - "tmp%1#1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "tmp%1#1" - ] - }, - "2139": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2140": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2143": { - "op": "dup", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "aggregate%array_length%0#0 (copy)" - ] - }, - "2144": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0" - ] - }, - "2145": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%array_length%0#0", - "1" - ] - }, - "2146": { - "op": ">", - "defined_out": [ - "secondary_market_time_events#0", - "tmp%5#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%5#0" - ] - }, - "2147": { - "op": "bz set_secondary_time_events_after_if_else@3", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2150": { - "op": "dup", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0" - ] - }, - "2151": { - "callsub": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "2154": { - "op": "bury 1", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2156": { - "block": "set_secondary_time_events_after_if_else@3", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2157": { - "op": "bytec 8 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"issuance_date\"" - ] - }, - "2159": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2160": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0" - ] - }, - "2161": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ] - }, - "2163": { - "op": "dup", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "2164": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "aggregate%array_trimmed%0#0" - ] - }, - "2167": { - "op": "bury 4", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ] - }, - "2169": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "2" - ] - }, - "2171": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%0#0", - "values%0#0" - ] - }, - "2172": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "maybe_value%0#0" - ] - }, - "2173": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%0#0", - "secondary_market_time_events#0", - "values%0#0", - "values%0#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "maybe_value%0#0", - "values%0#0 (copy)" - ] - }, - "2175": { - "op": "<=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%6#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "tmp%6#0" - ] - }, - "2176": { - "error": "Invalid secondary market opening date", - "op": "assert // Invalid secondary market opening date", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0" - ] - }, - "2177": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%0#0", - "\"secondary_market_opening_date\"" - ] - }, - "2179": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "\"secondary_market_opening_date\"", - "values%0#0" - ] - }, - "2180": { - "op": "app_global_put", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2181": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2182": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"maturity_date\"" - ] - }, - "2184": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2185": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%1#0" - ] - }, - "2186": { - "op": "bz set_secondary_time_events_after_if_else@5", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2189": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2190": { - "op": "bytec 4 // \"maturity_date\"", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"maturity_date\"" - ] - }, - "2192": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_exists%2#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2193": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0" - ] - }, - "2194": { - "op": "dig 1", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ] - }, - "2196": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2197": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%3#0", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_length%3#0" - ] - }, - "2198": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%3#0", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_length%3#0", - "1" - ] - }, - "2199": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "tmp%9#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "tmp%9#0" - ] - }, - "2200": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "tmp%9#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "tmp%9#0", - "8" - ] - }, - "2201": { - "op": "*", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0", - "maybe_value%2#0", - "secondary_market_time_events#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%bytes_offset%1#0" - ] - }, - "2202": { - "op": "dig 3", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0" - ] - }, - "2204": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0" - ] - }, - "2205": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%2#0", - "values%2#0" - ] - }, - "2206": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "maybe_value%2#0" - ] - }, - "2207": { - "op": "dig 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "maybe_value%2#0", - "secondary_market_time_events#0", - "values%2#0", - "values%2#0 (copy)" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "maybe_value%2#0", - "values%2#0 (copy)" - ] - }, - "2209": { - "op": ">=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%10#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "tmp%10#0" - ] - }, - "2210": { - "error": "Invalid secondary market closure date", - "op": "assert // Invalid secondary market closure date", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0" - ] - }, - "2211": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "values%2#0", - "\"secondary_market_closure_date\"" - ] - }, - "2213": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "\"secondary_market_closure_date\"", - "values%2#0" - ] - }, - "2214": { - "op": "app_global_put", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2215": { - "block": "set_secondary_time_events_after_if_else@5", - "stack_in": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0" - ] - }, - "2216": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2218": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2219": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0" - ] - }, - "2220": { - "op": "intc_0 // 0", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "0" - ] - }, - "2221": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "maybe_value%3#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2223": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%3#0", - "maybe_value%4#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2224": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%3#0", - "maybe_value%4#0" - ] - }, - "2225": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%4#0", - "maybe_value%3#0" - ] - }, - "2226": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%4#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "maybe_value%4#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2227": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%4#0" - ] - }, - "2228": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2229": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%head%1#0" - ] - }, - "2230": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "2231": { - "op": "swap", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "2232": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "tmp%2#0" - ] - }, - "2233": { - "op": "log", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2234": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0", - "1" - ] - }, - "2235": { - "op": "return", - "stack_out": [ - "aggregate%array_trimmed%0#0", - "secondary_market_time_events#0" - ] - }, - "2236": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.set_default_status[routing]", - "params": {}, - "block": "set_default_status", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "2239": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "2240": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "2241": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "2242": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "2243": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "2244": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "2245": { - "op": "getbit", - "defined_out": [ - "defaulted#0" - ], - "stack_out": [ - "defaulted#0" - ] - }, - "2246": { - "op": "bytec 17 // 0x52363023", - "defined_out": [ - "0x52363023", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "0x52363023" - ] - }, - "2248": { - "op": "txn Sender", - "defined_out": [ - "0x52363023", - "defaulted#0", - "tmp%0#2" - ], - "stack_out": [ - "defaulted#0", - "0x52363023", - "tmp%0#2" - ] - }, - "2250": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "defaulted#0", - "tmp%1#0" - ], - "stack_out": [ - "defaulted#0", - "tmp%1#0" - ] - }, - "2253": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "defaulted#0" - ] - }, - "2254": { - "op": "bytec 21 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "defaulted#0" - ], - "stack_out": [ - "defaulted#0", - "\"asset_defaulted\"" - ] - }, - "2256": { - "op": "swap", - "stack_out": [ - "\"asset_defaulted\"", - "defaulted#0" - ] - }, - "2257": { - "op": "app_global_put", - "stack_out": [] - }, - "2258": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2260": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2261": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2262": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2263": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "2264": { - "op": "log", - "stack_out": [] - }, - "2265": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "2266": { - "op": "return", - "stack_out": [] - }, - "2267": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.primary_distribution[routing]", - "params": {}, - "block": "primary_distribution", - "stack_in": [], - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "2269": { - "op": "txna ApplicationArgs 1" - }, - "2272": { - "op": "dup", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "holding_address#0" - ] - }, - "2273": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "len%0#0" - ] - }, - "2274": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2275": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "eq%0#0" - ] - }, - "2276": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0" - ] - }, - "2277": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "2280": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "2281": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "2282": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "len%1#0", - "8" - ] - }, - "2283": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "2284": { - "error": "invalid number of bytes for arc4.uint64", - "op": "assert // invalid number of bytes for arc4.uint64", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#0" - ] - }, - "2285": { - "op": "btoi", - "defined_out": [ - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2286": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2287": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"status\"" - ] - }, - "2288": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2289": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2290": { - "op": "pushint 100", - "defined_out": [ - "100", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "100" - ] - }, - "2292": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%0#4", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%0#4" - ] - }, - "2293": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2296": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2297": { - "op": "bytec 7 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2299": { - "op": "app_global_get_ex", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2300": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0" - ] - }, - "2301": { - "op": "global LatestTimestamp" - }, - "2303": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "2304": { - "op": "bury 5", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%0#0", - "awst_tmp%0#0" - ] - }, - "2306": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%1#2", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "2307": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2310": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0" - ] - }, - "2311": { - "op": "bytec 24 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2313": { - "op": "app_global_get_ex", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2314": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0" - ] - }, - "2315": { - "op": "dig 3", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%1#0", - "awst_tmp%0#0" - ] - }, - "2317": { - "op": ">", - "defined_out": [ - "awst_tmp%0#0", - "holding_address#0", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%2#1" - ] - }, - "2318": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2321": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2322": { - "error": "Primary distribution is closed", - "block": "primary_distribution_bool_merge@6", - "stack_in": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ], - "op": "assert // Primary distribution is closed", - "defined_out": [], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2323": { - "op": "bytec 18 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52353023" - ] - }, - "2325": { - "op": "txn Sender", - "defined_out": [ - "0x52353023", - "tmp%0#3" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52353023", - "tmp%0#3" - ] - }, - "2327": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#2" - ] - }, - "2330": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2331": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52333023" - ] - }, - "2332": { - "op": "dig 2", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x52333023", - "holding_address#0" - ] - }, - "2334": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "2335": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "holding_address#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2336": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2337": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2339": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1" - ] - }, - "2340": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2343": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2346": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0" - ] - }, - "2348": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "units#0", - "units#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "units#0 (copy)" - ] - }, - "2349": { - "error": "Can not distribute zero units", - "op": "assert // Can not distribute zero units", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0" - ] - }, - "2350": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "0" - ] - }, - "2351": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "0", - "\"circulating_units\"" - ] - }, - "2352": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2353": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0" - ] - }, - "2354": { - "op": "dig 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "maybe_value%0#0", - "units#0 (copy)" - ] - }, - "2356": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2357": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "0" - ] - }, - "2358": { - "op": "bytec 12 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "0", - "\"total_units\"" - ] - }, - "2360": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2361": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0" - ] - }, - "2362": { - "op": "dig 1", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_value%1#0", - "tmp%1#1", - "tmp%1#1 (copy)", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "maybe_value%1#0", - "tmp%1#1 (copy)" - ] - }, - "2364": { - "op": ">=", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "tmp%2#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "tmp%2#1" - ] - }, - "2365": { - "error": "Insufficient remaining D-ASA units", - "op": "assert // Insufficient remaining D-ASA units", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2366": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "\"circulating_units\"" - ] - }, - "2367": { - "op": "dig 1", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "\"circulating_units\"", - "tmp%1#1 (copy)" - ] - }, - "2369": { - "op": "app_global_put", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1" - ] - }, - "2370": { - "op": "dig 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2372": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2373": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0" - ] - }, - "2374": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "2375": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "units#0", - "tmp%1#1", - "values%0#0" - ] - }, - "2376": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "values%0#0", - "units#0" - ] - }, - "2378": { - "op": "+", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "tmp%4#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "tmp%4#1" - ] - }, - "2379": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2380": { - "op": "dig 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2382": { - "op": "intc_2 // 32", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#1 (copy)", - "32" - ] - }, - "2383": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "box_prefixed_key%0#1 (copy)", - "32", - "aggregate%val_as_bytes%0#0" - ] - }, - "2385": { - "op": "box_replace", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1" - ] - }, - "2386": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "0" - ] - }, - "2387": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "0", - "\"unit_value\"" - ] - }, - "2389": { - "op": "app_global_get_ex", - "defined_out": [ - "box_prefixed_key%0#1", - "holding_address#0", - "maybe_exists%3#0", - "maybe_value%3#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2390": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "maybe_value%3#0" - ] - }, - "2391": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "box_prefixed_key%0#1", - "tmp%1#1", - "aggregate%val_as_bytes%1#0" - ] - }, - "2392": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1" - ] - }, - "2394": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "holding_address#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "aggregate%val_as_bytes%1#0", - "box_prefixed_key%0#1", - "40" - ] - }, - "2396": { - "op": "uncover 2", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "box_prefixed_key%0#1", - "40", - "aggregate%val_as_bytes%1#0" - ] - }, - "2398": { - "op": "box_replace", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1" - ] - }, - "2399": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0" - ] - }, - "2400": { - "op": "bytec 12 // \"total_units\"", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "0", - "\"total_units\"" - ] - }, - "2402": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%4#0", - "maybe_value%4#0", - "tmp%1#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2403": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%1#1", - "maybe_value%4#0" - ] - }, - "2404": { - "op": "swap", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "maybe_value%4#0", - "tmp%1#1" - ] - }, - "2405": { - "op": "-", - "defined_out": [ - "holding_address#0", - "tmp%5#1", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%5#1" - ] - }, - "2406": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%2#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2407": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%2#0", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "aggregate%val_as_bytes%2#0", - "0x151f7c75" - ] - }, - "2408": { - "op": "swap", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "0x151f7c75", - "aggregate%val_as_bytes%2#0" - ] - }, - "2409": { - "op": "concat", - "defined_out": [ - "holding_address#0", - "tmp%6#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "tmp%6#0" - ] - }, - "2410": { - "op": "log", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2411": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "holding_address#0", - "units#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "1" - ] - }, - "2412": { - "op": "return", - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ] - }, - "2413": { - "block": "primary_distribution_bool_false@5", - "stack_in": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "holding_address#0", - "units#0", - "and_result%0#0" - ] - }, - "2414": { - "op": "b primary_distribution_bool_merge@6" - }, - "2417": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_asset_info[routing]", - "params": {}, - "block": "get_asset_info", - "stack_in": [], - "op": "intc_0 // 0" - }, - "2418": { - "op": "global LatestTimestamp" - }, - "2420": { - "op": "intc_0 // 0" - }, - "2421": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "tmp%0#1", - "0", - "\"maturity_date\"" - ] - }, - "2423": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2424": { - "op": "swap", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2425": { - "op": "dup", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "2426": { - "op": "cover 2", - "stack_out": [ - "performance#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2428": { - "op": "cover 3", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2430": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%0#1", - "maybe_value%0#0" - ] - }, - "2431": { - "op": ">", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "tmp%1#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%1#1" - ] - }, - "2432": { - "op": "bz get_asset_info_after_if_else@4", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2435": { - "op": "dup", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0" - ] - }, - "2436": { - "op": "bz get_asset_info_after_if_else@4", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2439": { - "op": "pushint 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0" - ] - }, - "2441": { - "op": "bury 2", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2443": { - "block": "get_asset_info_after_if_else@4", - "stack_in": [ - "performance#0", - "maybe_value%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0" - ] - }, - "2444": { - "op": "bytec 21 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0", - "\"asset_defaulted\"" - ] - }, - "2446": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2447": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2448": { - "op": "bz get_asset_info_after_if_else@6", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2451": { - "op": "pushint 3", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0" - ] - }, - "2453": { - "op": "bury 2", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2455": { - "block": "get_asset_info_after_if_else@6", - "stack_in": [ - "performance#0", - "maybe_value%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0" - ] - }, - "2456": { - "op": "bytec 22 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0", - "\"denomination_asset_id\"" - ] - }, - "2458": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2459": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0" - ] - }, - "2460": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "0" - ] - }, - "2461": { - "op": "bytec 13 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "2463": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2464": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ] - }, - "2465": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "0" - ] - }, - "2466": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "0", - "\"circulating_units\"" - ] - }, - "2467": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2468": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0" - ] - }, - "2469": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "0" - ] - }, - "2470": { - "op": "bytec 6 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "0", - "\"unit_value\"" - ] - }, - "2472": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2473": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2474": { - "op": "dup2", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "maybe_value%1#0", - "maybe_value%1#0 (copy)", - "maybe_value%2#0", - "maybe_value%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%0#0 (copy)", - "maybe_value%1#0 (copy)" - ] - }, - "2475": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1" - ] - }, - "2476": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "0" - ] - }, - "2477": { - "op": "bytec 14 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "0", - "\"day_count_convention\"" - ] - }, - "2479": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%5#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%5#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "maybe_value%5#0", - "maybe_exists%5#0" - ] - }, - "2480": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "maybe_value%5#0" - ] - }, - "2481": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2482": { - "op": "dup", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "2483": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%bitlen%0#0" - ] - }, - "2484": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%bitlen%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%bitlen%0#0", - "8" - ] - }, - "2485": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%0#0", - "aggregate%val_as_bytes%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0", - "aggregate%no_overflow%0#0" - ] - }, - "2486": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2487": { - "op": "extract 7 1", - "defined_out": [ - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0" - ] - }, - "2490": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "0" - ] - }, - "2491": { - "op": "bytec 15 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "0", - "\"principal_discount\"" - ] - }, - "2493": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint8%0#0", - "maybe_exists%6#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%6#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "maybe_value%6#0", - "maybe_exists%6#0" - ] - }, - "2494": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "maybe_value%6#0" - ] - }, - "2495": { - "op": "itob", - "defined_out": [ - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2496": { - "op": "dup", - "defined_out": [ - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%val_as_bytes%1#0 (copy)" - ] - }, - "2497": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%bitlen%1#0" - ] - }, - "2498": { - "op": "pushint 16", - "defined_out": [ - "16", - "aggregate%bitlen%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%bitlen%1#0", - "16" - ] - }, - "2500": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0", - "aggregate%no_overflow%1#0" - ] - }, - "2501": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2502": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0" - ] - }, - "2505": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "0" - ] - }, - "2506": { - "op": "bytec 26 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "0", - "\"interest_rate\"" - ] - }, - "2508": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "maybe_exists%7#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%7#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "maybe_value%7#0", - "maybe_exists%7#0" - ] - }, - "2509": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "maybe_value%7#0" - ] - }, - "2510": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2511": { - "op": "dup", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%2#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%val_as_bytes%2#0 (copy)" - ] - }, - "2512": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%2#0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%bitlen%2#0" - ] - }, - "2513": { - "op": "pushint 16", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%bitlen%2#0", - "16" - ] - }, - "2515": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%2#0", - "aggregate%uint16%0#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%2#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0", - "aggregate%no_overflow%2#0" - ] - }, - "2516": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%val_as_bytes%2#0" - ] - }, - "2517": { - "op": "extract 6 2", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0" - ] - }, - "2520": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "0" - ] - }, - "2521": { - "op": "bytec 12 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "0", - "\"total_units\"" - ] - }, - "2523": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%8#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_exists%8#0" - ] - }, - "2524": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0" - ] - }, - "2525": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "0" - ] - }, - "2526": { - "op": "bytec 7 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2528": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%10#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_exists%10#0" - ] - }, - "2529": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0" - ] - }, - "2530": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "0" - ] - }, - "2531": { - "op": "bytec 24 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2533": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%11#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_exists%11#0" - ] - }, - "2534": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0" - ] - }, - "2535": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "0" - ] - }, - "2536": { - "op": "bytec 8 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "0", - "\"issuance_date\"" - ] - }, - "2538": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%12#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_exists%12#0" - ] - }, - "2539": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0" - ] - }, - "2540": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "0" - ] - }, - "2541": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "0", - "\"maturity_date\"" - ] - }, - "2543": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%13#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_exists%13#0" - ] - }, - "2544": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0" - ] - }, - "2545": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "0" - ] - }, - "2546": { - "op": "bytec 20 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "0", - "\"asset_suspended\"" - ] - }, - "2548": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_exists%14#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_exists%14#0" - ] - }, - "2549": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0" - ] - }, - "2550": { - "op": "dig 15", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ] - }, - "2552": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2553": { - "op": "dup", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%val_as_bytes%3#0 (copy)" - ] - }, - "2554": { - "op": "bitlen", - "defined_out": [ - "aggregate%bitlen%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%bitlen%3#0" - ] - }, - "2555": { - "op": "intc_3 // 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%bitlen%3#0", - "8" - ] - }, - "2556": { - "op": "<=", - "defined_out": [ - "aggregate%no_overflow%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%val_as_bytes%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0", - "aggregate%no_overflow%3#0" - ] - }, - "2557": { - "error": "overflow", - "op": "assert // overflow", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%val_as_bytes%3#0" - ] - }, - "2558": { - "op": "extract 7 1", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%2#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0" - ] - }, - "2561": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "maybe_value%2#0" - ] - }, - "2563": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%3#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%3#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0" - ] - }, - "2564": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "maybe_value%3#0" - ] - }, - "2566": { - "op": "itob", - "defined_out": [ - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "aggregate%val_as_bytes%5#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%4#0", - "aggregate%val_as_bytes%5#0" - ] - }, - "2567": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0", - "tmp%0#1" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "tmp%0#1", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0" - ] - }, - "2568": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0", - "tmp%0#1" - ] - }, - "2570": { - "op": "itob", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%6#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%6#0" - ] - }, - "2571": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%1#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0" - ] - }, - "2572": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0", - "maybe_value%1#0" - ] - }, - "2574": { - "op": "itob", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%7#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%7#0" - ] - }, - "2575": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%0#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint8%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%3#0" - ] - }, - "2576": { - "op": "uncover 10", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%3#0", - "aggregate%uint8%0#0" - ] - }, - "2578": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%4#0" - ] - }, - "2579": { - "op": "uncover 9", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%4#0", - "aggregate%uint16%0#0" - ] - }, - "2581": { - "op": "concat", - "defined_out": [ - "aggregate%head%5#0", - "aggregate%uint16%1#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "aggregate%uint16%1#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%5#0" - ] - }, - "2582": { - "op": "uncover 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%5#0", - "aggregate%uint16%1#0" - ] - }, - "2584": { - "op": "concat", - "defined_out": [ - "aggregate%head%6#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "maybe_value%8#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%8#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0" - ] - }, - "2585": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0", - "maybe_value%8#0" - ] - }, - "2587": { - "op": "itob", - "defined_out": [ - "aggregate%head%6#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%8#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%6#0", - "aggregate%val_as_bytes%8#0" - ] - }, - "2588": { - "op": "concat", - "defined_out": [ - "aggregate%head%7#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0" - ] - }, - "2589": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0", - "maybe_value%0#0" - ] - }, - "2591": { - "op": "itob", - "defined_out": [ - "aggregate%head%7#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%9#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%7#0", - "aggregate%val_as_bytes%9#0" - ] - }, - "2592": { - "op": "concat", - "defined_out": [ - "aggregate%head%8#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%10#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0" - ] - }, - "2593": { - "op": "uncover 6", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0", - "maybe_value%10#0" - ] - }, - "2595": { - "op": "itob", - "defined_out": [ - "aggregate%head%8#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%10#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%8#0", - "aggregate%val_as_bytes%10#0" - ] - }, - "2596": { - "op": "concat", - "defined_out": [ - "aggregate%head%9#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%11#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0" - ] - }, - "2597": { - "op": "uncover 5", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0", - "maybe_value%11#0" - ] - }, - "2599": { - "op": "itob", - "defined_out": [ - "aggregate%head%9#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%11#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%9#0", - "aggregate%val_as_bytes%11#0" - ] - }, - "2600": { - "op": "concat", - "defined_out": [ - "aggregate%head%10#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%12#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0" - ] - }, - "2601": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0", - "maybe_value%12#0" - ] - }, - "2603": { - "op": "itob", - "defined_out": [ - "aggregate%head%10#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%12#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%10#0", - "aggregate%val_as_bytes%12#0" - ] - }, - "2604": { - "op": "concat", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%13#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0" - ] - }, - "2605": { - "op": "uncover 3", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0", - "maybe_value%13#0" - ] - }, - "2607": { - "op": "itob", - "defined_out": [ - "aggregate%head%11#0", - "aggregate%uint8%1#0", - "aggregate%val_as_bytes%13#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%11#0", - "aggregate%val_as_bytes%13#0" - ] - }, - "2608": { - "op": "concat", - "defined_out": [ - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0" - ] - }, - "2609": { - "op": "bytec 28 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "maybe_value%14#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00" - ] - }, - "2611": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "maybe_value%14#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00", - "0" - ] - }, - "2612": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "0x00", - "0", - "maybe_value%14#0" - ] - }, - "2614": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "aggregate%head%12#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%12#0", - "aggregate%encoded_bool%0#0" - ] - }, - "2615": { - "op": "concat", - "defined_out": [ - "aggregate%head%13#0", - "aggregate%uint8%1#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%uint8%1#0", - "aggregate%head%13#0" - ] - }, - "2616": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%13#0", - "aggregate%uint8%1#0" - ] - }, - "2617": { - "op": "concat", - "defined_out": [ - "aggregate%head%14#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%14#0" - ] - }, - "2618": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%14#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "aggregate%head%14#0", - "0x151f7c75" - ] - }, - "2619": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "0x151f7c75", - "aggregate%head%14#0" - ] - }, - "2620": { - "op": "concat", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "tmp%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "tmp%1#0" - ] - }, - "2621": { - "op": "log", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2622": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "1" - ] - }, - "2623": { - "op": "return", - "stack_out": [ - "performance#0", - "maybe_value%0#0" - ] - }, - "2624": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_time_events[routing]", - "params": {}, - "block": "get_time_events", - "stack_in": [], - "op": "bytec 30 // 0x0000" - }, - "2626": { - "op": "intc_0 // 0" - }, - "2627": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0", - "\"status\"" - ] - }, - "2628": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2629": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "time_events#0", - "maybe_value%0#0" - ] - }, - "2630": { - "op": "pushint 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "100" - ] - }, - "2632": { - "op": "==", - "defined_out": [ - "time_events#0", - "tmp%0#2" - ], - "stack_out": [ - "time_events#0", - "tmp%0#2" - ] - }, - "2633": { - "op": "bz get_time_events_after_if_else@3", - "stack_out": [ - "time_events#0" - ] - }, - "2636": { - "op": "bytec 27 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0x74696d654576656e7473" - ] - }, - "2638": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%1#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "time_events#0", - "aggregate%box_get%1#0" - ] - }, - "2639": { - "op": "swap", - "stack_out": [ - "time_events#0", - "aggregate%box_get%1#0", - "time_events#0" - ] - }, - "2640": { - "op": "bury 2", - "stack_out": [ - "time_events#0", - "aggregate%box_get%1#0" - ] - }, - "2642": { - "error": "check self.time_events exists", - "op": "assert // check self.time_events exists", - "stack_out": [ - "time_events#0" - ] - }, - "2643": { - "block": "get_time_events_after_if_else@3", - "stack_in": [ - "time_events#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "time_events#0", - "0x151f7c75" - ] - }, - "2644": { - "op": "dig 1", - "defined_out": [ - "0x151f7c75", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0x151f7c75", - "time_events#0" - ] - }, - "2646": { - "op": "concat", - "defined_out": [ - "time_events#0", - "tmp%1#0" - ], - "stack_out": [ - "time_events#0", - "tmp%1#0" - ] - }, - "2647": { - "op": "log", - "stack_out": [ - "time_events#0" - ] - }, - "2648": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "1" - ] - }, - "2649": { - "op": "return", - "stack_out": [ - "time_events#0" - ] - }, - "2650": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_secondary_market_schedule[routing]", - "params": {}, - "block": "get_secondary_market_schedule", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "2651": { - "op": "bytec 16 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2653": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2654": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "2655": { - "op": "intc_0 // 0", - "stack_out": [ - "maybe_value%0#0", - "0" - ] - }, - "2656": { - "op": "bytec 9 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2658": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2659": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2660": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "maybe_value%0#0" - ] - }, - "2661": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2662": { - "op": "pushbytes 0x0002", - "defined_out": [ - "0x0002", - "aggregate%val_as_bytes%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%val_as_bytes%0#0", - "0x0002" - ] - }, - "2666": { - "op": "swap", - "stack_out": [ - "maybe_value%1#0", - "0x0002", - "aggregate%val_as_bytes%0#0" - ] - }, - "2667": { - "op": "concat", - "defined_out": [ - "aggregate%head%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "maybe_value%1#0", - "aggregate%head%0#0" - ] - }, - "2668": { - "op": "swap", - "stack_out": [ - "aggregate%head%0#0", - "maybe_value%1#0" - ] - }, - "2669": { - "op": "itob", - "defined_out": [ - "aggregate%head%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%head%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2670": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0" - ] - }, - "2671": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "2672": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "2673": { - "op": "concat", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "2674": { - "op": "log", - "stack_out": [] - }, - "2675": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2676": { - "op": "return", - "stack_out": [] - }, - "2677": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.get_asset_metadata[routing]", - "params": {}, - "block": "get_asset_metadata", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "2678": { - "op": "bytec 23 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "0" - ], - "stack_out": [ - "0", - "\"metadata\"" - ] - }, - "2680": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2681": { - "error": "check self.metadata exists", - "op": "assert // check self.metadata exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "2682": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "2683": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "2684": { - "op": "concat", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "2685": { - "op": "log", - "stack_out": [] - }, - "2686": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2687": { - "op": "return", - "stack_out": [] - }, - "2688": { - "subroutine": "modules.accounting.AccountingModule.account_gov_suspension[routing]", - "params": {}, - "block": "account_gov_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "2691": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "2692": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "2693": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2694": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "2695": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "2696": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2699": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "2700": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "2701": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "1" - ] - }, - "2702": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "2703": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2704": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0" - ] - }, - "2705": { - "op": "getbit", - "defined_out": [ - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "2706": { - "op": "bytec 10 // 0x52373023", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023" - ] - }, - "2708": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "holding_address#0", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "2710": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "tmp%1#0" - ] - }, - "2713": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "suspended#0" - ] - }, - "2714": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "suspended#0" - ], - "stack_out": [ - "holding_address#0", - "suspended#0", - "0x52333023" - ] - }, - "2715": { - "op": "uncover 2", - "stack_out": [ - "suspended#0", - "0x52333023", - "holding_address#0" - ] - }, - "2717": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "2718": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2719": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2720": { - "op": "bury 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2722": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1" - ] - }, - "2723": { - "op": "dup", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2724": { - "op": "pushint 56", - "defined_out": [ - "56", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56" - ] - }, - "2726": { - "op": "intc_1 // 1", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "56", - "1" - ] - }, - "2727": { - "op": "box_extract", - "defined_out": [ - "box%box_extract%0#0", - "box_prefixed_key%0#1", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0" - ] - }, - "2728": { - "op": "intc_0 // 0", - "stack_out": [ - "suspended#0", - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0" - ] - }, - "2729": { - "op": "uncover 3", - "stack_out": [ - "box_prefixed_key%0#1", - "box%box_extract%0#0", - "0", - "suspended#0" - ] - }, - "2731": { - "op": "setbit", - "defined_out": [ - "aggregate%updated_target%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%updated_target%0#0" - ] - }, - "2732": { - "op": "pushint 56" - }, - "2734": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#1", - "56", - "aggregate%updated_target%0#0" - ] - }, - "2735": { - "op": "box_replace", - "stack_out": [] - }, - "2736": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2738": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2739": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2740": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2741": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "2742": { - "op": "log", - "stack_out": [] - }, - "2743": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "2744": { - "op": "return", - "stack_out": [] - }, - "2745": { - "subroutine": "modules.accounting.AccountingModule.account_open[routing]", - "params": {}, - "block": "account_open", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "2748": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "2749": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "2750": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2751": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "2752": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "2753": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "2756": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "payment_address#0 (copy)" - ] - }, - "2757": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0" - ] - }, - "2758": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "len%1#0", - "32" - ] - }, - "2759": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "eq%1#0" - ] - }, - "2760": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "2761": { - "op": "bytec 11 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023" - ] - }, - "2763": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "payment_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "2765": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "2768": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "2769": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0" - ] - }, - "2770": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0", - "\"status\"" - ] - }, - "2771": { - "op": "app_global_get_ex", - "defined_out": [ - "holding_address#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2772": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0" - ] - }, - "2773": { - "op": "intc 4 // 200", - "defined_out": [ - "200", - "holding_address#0", - "maybe_value%0#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "maybe_value%0#0", - "200" - ] - }, - "2775": { - "op": "==", - "defined_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%0#3" - ] - }, - "2776": { - "op": "!", - "stack_out": [ - "holding_address#0", - "payment_address#0", - "tmp%1#1" - ] - }, - "2777": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "payment_address#0" - ] - }, - "2778": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2781": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2784": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "payment_address#0" - ], - "stack_out": [ - "holding_address#0", - "payment_address#0", - "0x52333023" - ] - }, - "2785": { - "op": "uncover 2", - "stack_out": [ - "payment_address#0", - "0x52333023", - "holding_address#0" - ] - }, - "2787": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "2788": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "2789": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2790": { - "op": "bury 1", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "2792": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "payment_address#0", - "tmp%2#1" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "tmp%2#1" - ] - }, - "2793": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0" - ] - }, - "2794": { - "op": "intc_0 // 0", - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "0" - ] - }, - "2795": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "payment_address#0", - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2796": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0" - ] - }, - "2798": { - "op": "dig 1", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%0#0 (copy)", - "box_prefixed_key%0#0", - "payment_address#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "payment_address#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "2800": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0" - ] - }, - "2801": { - "op": "dig 1", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%1#0", - "aggregate%val_as_bytes%0#0 (copy)" - ] - }, - "2803": { - "op": "concat", - "defined_out": [ - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%val_as_bytes%0#0", - "aggregate%head%2#0" - ] - }, - "2804": { - "op": "swap", - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%2#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "2805": { - "op": "concat", - "defined_out": [ - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0" - ] - }, - "2806": { - "op": "bytec 28 // 0x00", - "defined_out": [ - "0x00", - "aggregate%head%3#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%3#0", - "0x00" - ] - }, - "2808": { - "op": "concat", - "defined_out": [ - "aggregate%head%4#0", - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0", - "aggregate%head%4#0" - ] - }, - "2809": { - "op": "box_put", - "stack_out": [] - }, - "2810": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1" - ] - }, - "2812": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0" - ] - }, - "2813": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%3#0", - "0x151f7c75" - ] - }, - "2814": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%3#0" - ] - }, - "2815": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "2816": { - "op": "log", - "stack_out": [] - }, - "2817": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2818": { - "op": "return", - "stack_out": [] - }, - "2819": { - "subroutine": "modules.accounting.AccountingModule.account_close[routing]", - "params": {}, - "block": "account_close", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "2822": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "2823": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "2824": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2825": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "2826": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "2827": { - "op": "bytec 11 // 0x52343023", - "defined_out": [ - "0x52343023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52343023" - ] - }, - "2829": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "holding_address#0", - "tmp%0#2" - ], - "stack_out": [ - "holding_address#0", - "0x52343023", - "tmp%0#2" - ] - }, - "2831": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "holding_address#0", - "tmp%1#2" - ], - "stack_out": [ - "holding_address#0", - "tmp%1#2" - ] - }, - "2834": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0" - ] - }, - "2835": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2838": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "2839": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "2840": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "2841": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2842": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2843": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2845": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "2846": { - "op": "dup", - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2847": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2848": { - "op": "pop", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "2849": { - "op": "intc_2 // 32", - "stack_out": [ - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "32" - ] - }, - "2850": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "closed_units#0" - ] - }, - "2851": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "box_prefixed_key%0#1" - ] - }, - "2852": { - "op": "box_del", - "defined_out": [ - "closed_units#0", - "{box_del}" - ], - "stack_out": [ - "closed_units#0", - "{box_del}" - ] - }, - "2853": { - "op": "pop", - "stack_out": [ - "closed_units#0" - ] - }, - "2854": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "0" - ] - }, - "2855": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "0", - "\"circulating_units\"" - ] - }, - "2856": { - "op": "app_global_get_ex", - "defined_out": [ - "closed_units#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2857": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "closed_units#0", - "maybe_value%0#0" - ] - }, - "2858": { - "op": "dig 1", - "defined_out": [ - "closed_units#0", - "closed_units#0 (copy)", - "maybe_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "maybe_value%0#0", - "closed_units#0 (copy)" - ] - }, - "2860": { - "op": "-", - "defined_out": [ - "closed_units#0", - "tmp%0#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%0#1" - ] - }, - "2861": { - "op": "bytec_3 // \"circulating_units\"", - "stack_out": [ - "closed_units#0", - "tmp%0#1", - "\"circulating_units\"" - ] - }, - "2862": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "\"circulating_units\"", - "tmp%0#1" - ] - }, - "2863": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0" - ] - }, - "2864": { - "callsub": "modules.accounting.AccountingModule.end_if_no_circulating_units", - "op": "callsub end_if_no_circulating_units" - }, - "2867": { - "op": "global LatestTimestamp", - "defined_out": [ - "closed_units#0", - "tmp%1#1" - ], - "stack_out": [ - "closed_units#0", - "tmp%1#1" - ] - }, - "2869": { - "op": "swap", - "stack_out": [ - "tmp%1#1", - "closed_units#0" - ] - }, - "2870": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "tmp%1#1" - ], - "stack_out": [ - "tmp%1#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "2871": { - "op": "swap", - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "tmp%1#1" - ] - }, - "2872": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "2873": { - "op": "concat", - "defined_out": [ - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0" - ] - }, - "2874": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ], - "stack_out": [ - "aggregate%head%1#0", - "0x151f7c75" - ] - }, - "2875": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%head%1#0" - ] - }, - "2876": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "2877": { - "op": "log", - "stack_out": [] - }, - "2878": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2879": { - "op": "return", - "stack_out": [] - }, - "2880": { - "subroutine": "modules.accounting.AccountingModule.account_update_payment_address[routing]", - "params": {}, - "block": "account_update_payment_address", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "2883": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "2884": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "2885": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2886": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "2887": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "2888": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2891": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "2892": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%1#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0" - ] - }, - "2893": { - "op": "intc_2 // 32", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "len%1#0", - "32" - ] - }, - "2894": { - "op": "==", - "defined_out": [ - "eq%1#0", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "eq%1#0" - ] - }, - "2895": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2896": { - "op": "txn Sender", - "defined_out": [ - "holding_address#0", - "tmp%0#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1" - ] - }, - "2898": { - "op": "dig 2", - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%0#1", - "holding_address#0 (copy)" - ] - }, - "2900": { - "op": "==", - "defined_out": [ - "holding_address#0", - "tmp%1#1", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "tmp%1#1" - ] - }, - "2901": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "holding_address#0", - "tmp%2#0" - ] - }, - "2902": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "2905": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "op": "callsub assert_is_not_asset_suspended" - }, - "2908": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0", - "tmp%2#0" - ], - "stack_out": [ - "holding_address#0", - "tmp%2#0", - "0x52333023" - ] - }, - "2909": { - "op": "uncover 2", - "stack_out": [ - "tmp%2#0", - "0x52333023", - "holding_address#0" - ] - }, - "2911": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "2912": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2913": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2914": { - "op": "bury 1", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2916": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1" - ] - }, - "2917": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "box_prefixed_key%0#1", - "0" - ] - }, - "2918": { - "op": "uncover 2", - "stack_out": [ - "box_prefixed_key%0#1", - "0", - "tmp%2#0" - ] - }, - "2920": { - "op": "box_replace", - "stack_out": [] - }, - "2921": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "tmp%2#1" - ] - }, - "2923": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2924": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2925": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2926": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "2927": { - "op": "log", - "stack_out": [] - }, - "2928": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2929": { - "op": "return", - "stack_out": [] - }, - "2930": { - "subroutine": "modules.accounting.AccountingModule.account_get_info[routing]", - "params": {}, - "block": "account_get_info", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "holding_address#0" - ], - "stack_out": [ - "holding_address#0" - ] - }, - "2933": { - "op": "dup", - "defined_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ], - "stack_out": [ - "holding_address#0", - "holding_address#0 (copy)" - ] - }, - "2934": { - "op": "len", - "defined_out": [ - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0" - ] - }, - "2935": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "holding_address#0", - "len%0#0" - ], - "stack_out": [ - "holding_address#0", - "len%0#0", - "32" - ] - }, - "2936": { - "op": "==", - "defined_out": [ - "eq%0#0", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "eq%0#0" - ] - }, - "2937": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "holding_address#0" - ] - }, - "2938": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023", - "holding_address#0" - ], - "stack_out": [ - "holding_address#0", - "0x52333023" - ] - }, - "2939": { - "op": "swap", - "stack_out": [ - "0x52333023", - "holding_address#0" - ] - }, - "2940": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "2941": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "2942": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "2943": { - "op": "bury 1", - "stack_out": [ - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "2945": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "box_prefixed_key%0#1" - ] - }, - "2946": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "2947": { - "op": "pop", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "2948": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "0x151f7c75" - ] - }, - "2949": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%box_get%0#0" - ] - }, - "2950": { - "op": "concat", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "2951": { - "op": "log", - "stack_out": [] - }, - "2952": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2953": { - "op": "return", - "stack_out": [] - }, - "2954": { - "subroutine": "modules.rbac.RbacModule.rbac_rotate_arranger[routing]", - "params": {}, - "block": "rbac_rotate_arranger", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0" - ] - }, - "2957": { - "op": "dup", - "defined_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ], - "stack_out": [ - "new_arranger#0", - "new_arranger#0 (copy)" - ] - }, - "2958": { - "op": "len", - "defined_out": [ - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0" - ] - }, - "2959": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "len%0#0", - "32" - ] - }, - "2960": { - "op": "==", - "defined_out": [ - "eq%0#0", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "eq%0#0" - ] - }, - "2961": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "new_arranger#0" - ] - }, - "2962": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2965": { - "op": "bytec 5 // 0x52323023", - "defined_out": [ - "0x52323023", - "new_arranger#0" - ], - "stack_out": [ - "new_arranger#0", - "0x52323023" - ] - }, - "2967": { - "op": "swap", - "stack_out": [ - "0x52323023", - "new_arranger#0" - ] - }, - "2968": { - "op": "app_global_put", - "stack_out": [] - }, - "2969": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2971": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2972": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2973": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2974": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "2975": { - "op": "log", - "stack_out": [] - }, - "2976": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "2977": { - "op": "return", - "stack_out": [] - }, - "2978": { - "subroutine": "modules.rbac.RbacModule.rbac_set_op_daemon[routing]", - "params": {}, - "block": "rbac_set_op_daemon", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "2981": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "2982": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "2983": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "2984": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "2985": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "2986": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "2989": { - "op": "bytec 19 // 0x52323523", - "defined_out": [ - "0x52323523", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52323523" - ] - }, - "2991": { - "op": "swap", - "stack_out": [ - "0x52323523", - "address#0" - ] - }, - "2992": { - "op": "app_global_put", - "stack_out": [] - }, - "2993": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2995": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "2996": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "2997": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "2998": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "2999": { - "op": "log", - "stack_out": [] - }, - "3000": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3001": { - "op": "return", - "stack_out": [] - }, - "3002": { - "subroutine": "modules.rbac.RbacModule.rbac_assign_role[routing]", - "params": {}, - "block": "rbac_assign_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3005": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3006": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3007": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3008": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3009": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3010": { - "op": "txna ApplicationArgs 2" - }, - "3013": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3014": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3016": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3017": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3018": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3019": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3020": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "3023": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)" - ] - }, - "3024": { - "op": "intc_0 // 0", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "tmp%3#0 (copy)", - "0" - ] - }, - "3025": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0" - ] - }, - "3026": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_length%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "aggregate%array_length%0#0", - "2" - ] - }, - "3028": { - "op": "+", - "defined_out": [ - "add%0#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0" - ] - }, - "3029": { - "op": "dig 1", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "tmp%3#0 (copy)" - ] - }, - "3031": { - "op": "len", - "defined_out": [ - "add%0#0", - "len%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "add%0#0", - "len%2#0" - ] - }, - "3032": { - "op": "==", - "defined_out": [ - "eq%2#0", - "role_address#0", - "role_id#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0", - "eq%2#0" - ] - }, - "3033": { - "error": "invalid number of bytes for arc4.dynamic_array", - "op": "assert // invalid number of bytes for arc4.dynamic_array", - "stack_out": [ - "role_address#0", - "role_id#0", - "tmp%3#0" - ] - }, - "3034": { - "op": "extract 2 0", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "config#0" - ] - }, - "3037": { - "op": "swap", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#0" - ] - }, - "3038": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3041": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3044": { - "op": "btoi", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3045": { - "op": "dupn 2", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3047": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3050": { - "op": "pushint 20", - "defined_out": [ - "20", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "20" - ] - }, - "3052": { - "op": "==", - "defined_out": [ - "config#0", - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%0#2" - ] - }, - "3053": { - "op": "bz rbac_assign_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3056": { - "op": "bytec 5 // 0x52323023", - "defined_out": [ - "0x52323023", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023" - ] - }, - "3058": { - "op": "dig 3", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52323023", - "role_address#0" - ] - }, - "3060": { - "op": "app_global_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3061": { - "block": "rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%2#1" - ] - }, - "3063": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3064": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3065": { - "op": "swap", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3066": { - "op": "concat", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#0" - ] - }, - "3067": { - "op": "log", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3068": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "1" - ] - }, - "3069": { - "op": "return", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3070": { - "block": "rbac_assign_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3071": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "3073": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%1#1" - ] - }, - "3074": { - "op": "bz rbac_assign_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3077": { - "op": "bytec 11 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023" - ] - }, - "3079": { - "op": "dig 3", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "3081": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3082": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3083": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3084": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3086": { - "op": "!", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "tmp%2#2" - ] - }, - "3087": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3088": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%0#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%0#0", - "config#0" - ] - }, - "3090": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3091": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3094": { - "block": "rbac_assign_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3095": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "3097": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%3#1" - ] - }, - "3098": { - "op": "bz rbac_assign_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3101": { - "op": "bytec 18 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023" - ] - }, - "3103": { - "op": "dig 3", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "3105": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3106": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "3107": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "3108": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "3110": { - "op": "!", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1", - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "tmp%4#0" - ] - }, - "3111": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3112": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%2#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%2#0", - "config#0" - ] - }, - "3114": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3115": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3118": { - "block": "rbac_assign_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3119": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "3121": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%5#0" - ] - }, - "3122": { - "op": "bz rbac_assign_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3125": { - "op": "bytec 17 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023" - ] - }, - "3127": { - "op": "dig 3", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "3129": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3130": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "3131": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "3132": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "3134": { - "op": "!", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1", - "tmp%6#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "tmp%6#1" - ] - }, - "3135": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3136": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%4#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%4#0", - "config#0" - ] - }, - "3138": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3139": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3142": { - "block": "rbac_assign_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3143": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "3145": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%7#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%7#1" - ] - }, - "3146": { - "op": "bz rbac_assign_role_after_if_else@11", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3149": { - "op": "bytec 10 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023" - ] - }, - "3151": { - "op": "dig 3", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "3153": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3154": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "3155": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "3156": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "3158": { - "op": "!", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1", - "tmp%8#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "tmp%8#0" - ] - }, - "3159": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3160": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%6#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%6#0", - "config#0" - ] - }, - "3162": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3163": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3166": { - "block": "rbac_assign_role_after_if_else@11", - "stack_in": [ - "role_address#0", - "config#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1" - ] - }, - "3167": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "3169": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%9#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "tmp%9#0" - ] - }, - "3170": { - "op": "bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3173": { - "op": "bytec 25 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023" - ] - }, - "3175": { - "op": "dig 3", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "3177": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3178": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "3179": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "3180": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "3182": { - "op": "!", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1", - "tmp%10#0" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "tmp%10#0" - ] - }, - "3183": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3184": { - "op": "dig 2", - "defined_out": [ - "box_prefixed_key%8#0", - "config#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1", - "box_prefixed_key%8#0", - "config#0" - ] - }, - "3186": { - "op": "box_put", - "stack_out": [ - "role_address#0", - "config#0", - "role_id#1" - ] - }, - "3187": { - "op": "b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14" - }, - "3190": { - "subroutine": "modules.rbac.RbacModule.rbac_revoke_role[routing]", - "params": {}, - "block": "rbac_revoke_role", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3193": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3194": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3195": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3196": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3197": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3198": { - "op": "txna ApplicationArgs 2" - }, - "3201": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3202": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3204": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3205": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3206": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3207": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3208": { - "callsub": "modules.rbac.RbacModule.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "3211": { - "callsub": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "op": "callsub assert_is_not_asset_defaulted" - }, - "3214": { - "op": "btoi", - "defined_out": [ - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3215": { - "op": "dupn 2", - "defined_out": [ - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3217": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3220": { - "op": "dup", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)" - ] - }, - "3221": { - "op": "pushint 20", - "defined_out": [ - "20", - "role_address#0", - "role_id#1", - "role_id#1 (copy)" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "role_id#1 (copy)", - "20" - ] - }, - "3223": { - "op": "!=", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%0#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "tmp%0#2" - ] - }, - "3224": { - "error": "Invalid role identifier", - "op": "assert // Invalid role identifier", - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3225": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "40" - ] - }, - "3227": { - "op": "==", - "defined_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%1#1" - ] - }, - "3228": { - "op": "bz rbac_revoke_role_after_if_else@3", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3231": { - "op": "bytec 11 // 0x52343023", - "defined_out": [ - "0x52343023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023" - ] - }, - "3233": { - "op": "dig 2", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52343023", - "role_address#0" - ] - }, - "3235": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3236": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "box_prefixed_key%0#0 (copy)" - ] - }, - "3237": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#0", - "maybe_exists%0#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3238": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0", - "maybe_exists%0#0" - ] - }, - "3240": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%0#0" - ] - }, - "3241": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3242": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3243": { - "block": "rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#1" - ] - }, - "3245": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0" - ] - }, - "3246": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3247": { - "op": "swap", - "stack_out": [ - "role_address#0", - "role_id#1", - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3248": { - "op": "concat", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#0" - ] - }, - "3249": { - "op": "log", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3250": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "1" - ] - }, - "3251": { - "op": "return", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3252": { - "block": "rbac_revoke_role_after_if_else@3", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3253": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "50" - ] - }, - "3255": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%2#2" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%2#2" - ] - }, - "3256": { - "op": "bz rbac_revoke_role_after_if_else@5", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3259": { - "op": "bytec 18 // 0x52353023", - "defined_out": [ - "0x52353023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023" - ] - }, - "3261": { - "op": "dig 2", - "defined_out": [ - "0x52353023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52353023", - "role_address#0" - ] - }, - "3263": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3264": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "box_prefixed_key%2#0 (copy)" - ] - }, - "3265": { - "op": "box_len", - "defined_out": [ - "_%1#0", - "box_prefixed_key%2#0", - "maybe_exists%1#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "_%1#0", - "maybe_exists%1#0" - ] - }, - "3266": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0", - "maybe_exists%1#0" - ] - }, - "3268": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%2#0" - ] - }, - "3269": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3270": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3271": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3274": { - "block": "rbac_revoke_role_after_if_else@5", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3275": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "60" - ] - }, - "3277": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%3#0" - ] - }, - "3278": { - "op": "bz rbac_revoke_role_after_if_else@7", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3281": { - "op": "bytec 17 // 0x52363023", - "defined_out": [ - "0x52363023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023" - ] - }, - "3283": { - "op": "dig 2", - "defined_out": [ - "0x52363023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52363023", - "role_address#0" - ] - }, - "3285": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3286": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "box_prefixed_key%4#0 (copy)" - ] - }, - "3287": { - "op": "box_len", - "defined_out": [ - "_%2#0", - "box_prefixed_key%4#0", - "maybe_exists%2#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "_%2#0", - "maybe_exists%2#0" - ] - }, - "3288": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0", - "maybe_exists%2#0" - ] - }, - "3290": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%4#0" - ] - }, - "3291": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3292": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3293": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3296": { - "block": "rbac_revoke_role_after_if_else@7", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3297": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "70" - ] - }, - "3299": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%4#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%4#1" - ] - }, - "3300": { - "op": "bz rbac_revoke_role_after_if_else@9", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3303": { - "op": "bytec 10 // 0x52373023", - "defined_out": [ - "0x52373023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023" - ] - }, - "3305": { - "op": "dig 2", - "defined_out": [ - "0x52373023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52373023", - "role_address#0" - ] - }, - "3307": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%6#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3308": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "box_prefixed_key%6#0 (copy)" - ] - }, - "3309": { - "op": "box_len", - "defined_out": [ - "_%3#0", - "box_prefixed_key%6#0", - "maybe_exists%3#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "_%3#0", - "maybe_exists%3#0" - ] - }, - "3310": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0", - "maybe_exists%3#0" - ] - }, - "3312": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%6#0" - ] - }, - "3313": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3314": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3315": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3318": { - "block": "rbac_revoke_role_after_if_else@9", - "stack_in": [ - "role_address#0", - "role_id#1" - ], - "op": "dup", - "defined_out": [ - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1" - ] - }, - "3319": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "role_id#1", - "80" - ] - }, - "3321": { - "op": "==", - "defined_out": [ - "role_id#1", - "tmp%5#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "tmp%5#1" - ] - }, - "3322": { - "op": "bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3325": { - "op": "bytec 25 // 0x52383023", - "defined_out": [ - "0x52383023", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023" - ] - }, - "3327": { - "op": "dig 2", - "defined_out": [ - "0x52383023", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "0x52383023", - "role_address#0" - ] - }, - "3329": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%8#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3330": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "box_prefixed_key%8#0 (copy)" - ] - }, - "3331": { - "op": "box_len", - "defined_out": [ - "_%4#0", - "box_prefixed_key%8#0", - "maybe_exists%4#0", - "role_address#0", - "role_id#1" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "_%4#0", - "maybe_exists%4#0" - ] - }, - "3332": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0", - "maybe_exists%4#0" - ] - }, - "3334": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "role_id#1", - "box_prefixed_key%8#0" - ] - }, - "3335": { - "op": "box_del", - "defined_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ], - "stack_out": [ - "role_address#0", - "role_id#1", - "{box_del}" - ] - }, - "3336": { - "op": "pop", - "stack_out": [ - "role_address#0", - "role_id#1" - ] - }, - "3337": { - "op": "b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12" - }, - "3340": { - "subroutine": "modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]", - "params": {}, - "block": "rbac_gov_asset_suspension", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3343": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ], - "stack_out": [ - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "3344": { - "op": "len", - "defined_out": [ - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0" - ] - }, - "3345": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "len%0#0", - "1" - ] - }, - "3346": { - "op": "==", - "defined_out": [ - "eq%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "eq%0#0" - ] - }, - "3347": { - "error": "invalid number of bytes for arc4.bool", - "op": "assert // invalid number of bytes for arc4.bool", - "stack_out": [ - "tmp%0#0" - ] - }, - "3348": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "3349": { - "op": "getbit", - "defined_out": [ - "suspended#0" - ], - "stack_out": [ - "suspended#0" - ] - }, - "3350": { - "op": "bytec 10 // 0x52373023", - "defined_out": [ - "0x52373023", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "0x52373023" - ] - }, - "3352": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "suspended#0", - "tmp%0#2" - ], - "stack_out": [ - "suspended#0", - "0x52373023", - "tmp%0#2" - ] - }, - "3354": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "suspended#0", - "tmp%1#0" - ], - "stack_out": [ - "suspended#0", - "tmp%1#0" - ] - }, - "3357": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "suspended#0" - ] - }, - "3358": { - "op": "bytec 20 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "suspended#0" - ], - "stack_out": [ - "suspended#0", - "\"asset_suspended\"" - ] - }, - "3360": { - "op": "swap", - "stack_out": [ - "\"asset_suspended\"", - "suspended#0" - ] - }, - "3361": { - "op": "app_global_put", - "stack_out": [] - }, - "3362": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3364": { - "op": "itob", - "defined_out": [ - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0" - ] - }, - "3365": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "aggregate%val_as_bytes%0#0", - "0x151f7c75" - ] - }, - "3366": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%val_as_bytes%0#0" - ] - }, - "3367": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "3368": { - "op": "log", - "stack_out": [] - }, - "3369": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3370": { - "op": "return", - "stack_out": [] - }, - "3371": { - "subroutine": "modules.rbac.RbacModule.rbac_get_arranger[routing]", - "params": {}, - "block": "rbac_get_arranger", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3372": { - "op": "bytec 5 // 0x52323023", - "defined_out": [ - "0", - "0x52323023" - ], - "stack_out": [ - "0", - "0x52323023" - ] - }, - "3374": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3375": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3376": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "0x151f7c75" - ] - }, - "3377": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "maybe_value%0#0" - ] - }, - "3378": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "3379": { - "op": "log", - "stack_out": [] - }, - "3380": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3381": { - "op": "return", - "stack_out": [] - }, - "3382": { - "subroutine": "modules.rbac.RbacModule.rbac_get_address_roles[routing]", - "params": {}, - "block": "rbac_get_address_roles", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "address#0" - ], - "stack_out": [ - "address#0" - ] - }, - "3385": { - "op": "dup", - "defined_out": [ - "address#0", - "address#0 (copy)" - ], - "stack_out": [ - "address#0", - "address#0 (copy)" - ] - }, - "3386": { - "op": "len", - "defined_out": [ - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0" - ] - }, - "3387": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "address#0", - "len%0#0" - ], - "stack_out": [ - "address#0", - "len%0#0", - "32" - ] - }, - "3388": { - "op": "==", - "defined_out": [ - "address#0", - "eq%0#0" - ], - "stack_out": [ - "address#0", - "eq%0#0" - ] - }, - "3389": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "address#0" - ] - }, - "3390": { - "op": "bytec 11 // 0x52343023", - "defined_out": [ - "0x52343023", - "address#0" - ], - "stack_out": [ - "address#0", - "0x52343023" - ] - }, - "3392": { - "op": "dig 1", - "stack_out": [ - "address#0", - "0x52343023", - "address#0 (copy)" - ] - }, - "3394": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1" - ] - }, - "3397": { - "op": "bytec 18 // 0x52353023", - "defined_out": [ - "0x52353023", - "address#0", - "tmp%0#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023" - ] - }, - "3399": { - "op": "dig 2", - "stack_out": [ - "address#0", - "tmp%0#1", - "0x52353023", - "address#0 (copy)" - ] - }, - "3401": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1" - ] - }, - "3404": { - "op": "bytec 17 // 0x52363023", - "defined_out": [ - "0x52363023", - "address#0", - "tmp%0#1", - "tmp%1#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023" - ] - }, - "3406": { - "op": "dig 3", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "0x52363023", - "address#0 (copy)" - ] - }, - "3408": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ] - }, - "3411": { - "op": "bytec 10 // 0x52373023", - "defined_out": [ - "0x52373023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023" - ] - }, - "3413": { - "op": "dig 4", - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "0x52373023", - "address#0 (copy)" - ] - }, - "3415": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ] - }, - "3418": { - "op": "bytec 25 // 0x52383023", - "defined_out": [ - "0x52383023", - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1" - ], - "stack_out": [ - "address#0", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023" - ] - }, - "3420": { - "op": "uncover 5", - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "0x52383023", - "address#0" - ] - }, - "3422": { - "callsub": "modules.rbac.RbacModule._role_is_active", - "op": "callsub _role_is_active", - "defined_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ] - }, - "3425": { - "op": "bytec 28 // 0x00", - "defined_out": [ - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00" - ] - }, - "3427": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "0x00", - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0" - ] - }, - "3428": { - "op": "uncover 6", - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "0x00", - "0", - "tmp%0#1" - ] - }, - "3430": { - "op": "setbit", - "defined_out": [ - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0" - ] - }, - "3431": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%encoded_bool%0#0", - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%1#1", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1" - ] - }, - "3432": { - "op": "uncover 5", - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%encoded_bool%0#0", - "1", - "tmp%1#1" - ] - }, - "3434": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0" - ] - }, - "3435": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%set_bit%0#0", - "tmp%2#1", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%2#1", - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2" - ] - }, - "3437": { - "op": "uncover 4", - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%0#0", - "2", - "tmp%2#1" - ] - }, - "3439": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0" - ] - }, - "3440": { - "op": "pushint 3", - "defined_out": [ - "3", - "aggregate%set_bit%1#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "tmp%3#1", - "tmp%4#1", - "aggregate%set_bit%1#0", - "3" - ] - }, - "3442": { - "op": "uncover 3", - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%1#0", - "3", - "tmp%3#1" - ] - }, - "3444": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0" - ] - }, - "3445": { - "op": "pushint 4", - "defined_out": [ - "4", - "aggregate%set_bit%2#0", - "tmp%4#1" - ], - "stack_out": [ - "tmp%4#1", - "aggregate%set_bit%2#0", - "4" - ] - }, - "3447": { - "op": "uncover 2", - "stack_out": [ - "aggregate%set_bit%2#0", - "4", - "tmp%4#1" - ] - }, - "3449": { - "op": "setbit", - "defined_out": [ - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0" - ] - }, - "3450": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ], - "stack_out": [ - "aggregate%set_bit%3#0", - "0x151f7c75" - ] - }, - "3451": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "aggregate%set_bit%3#0" - ] - }, - "3452": { - "op": "concat", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "tmp%8#0" - ] - }, - "3453": { - "op": "log", - "stack_out": [] - }, - "3454": { - "op": "intc_1 // 1", - "stack_out": [ - "1" - ] - }, - "3455": { - "op": "return", - "stack_out": [] - }, - "3456": { - "subroutine": "modules.rbac.RbacModule.rbac_get_role_config[routing]", - "params": {}, - "block": "rbac_get_role_config", - "stack_in": [], - "op": "txna ApplicationArgs 1", - "defined_out": [ - "role_id#0" - ], - "stack_out": [ - "role_id#0" - ] - }, - "3459": { - "op": "dup", - "defined_out": [ - "role_id#0", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0", - "role_id#0 (copy)" - ] - }, - "3460": { - "op": "len", - "defined_out": [ - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0" - ] - }, - "3461": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "len%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "len%0#0", - "1" - ] - }, - "3462": { - "op": "==", - "defined_out": [ - "eq%0#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "eq%0#0" - ] - }, - "3463": { - "error": "invalid number of bytes for arc4.uint8", - "op": "assert // invalid number of bytes for arc4.uint8", - "stack_out": [ - "role_id#0" - ] - }, - "3464": { - "op": "txna ApplicationArgs 2" - }, - "3467": { - "op": "dup", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_id#0", - "role_address#0", - "role_address#0" - ] - }, - "3468": { - "op": "cover 2", - "defined_out": [ - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "role_address#0" - ] - }, - "3470": { - "op": "len", - "defined_out": [ - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0" - ] - }, - "3471": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "len%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "len%1#0", - "32" - ] - }, - "3472": { - "op": "==", - "defined_out": [ - "eq%1#0", - "role_address#0", - "role_id#0" - ], - "stack_out": [ - "role_address#0", - "role_id#0", - "eq%1#0" - ] - }, - "3473": { - "error": "invalid number of bytes for arc4.static_array", - "op": "assert // invalid number of bytes for arc4.static_array", - "stack_out": [ - "role_address#0", - "role_id#0" - ] - }, - "3474": { - "op": "btoi", - "defined_out": [ - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "3475": { - "op": "dup", - "defined_out": [ - "role#0", - "role#0 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "role#0 (copy)" - ] - }, - "3476": { - "callsub": "modules.rbac.RbacModule._assert_valid_role", - "op": "callsub _assert_valid_role", - "stack_out": [ - "role_address#0", - "role#0" - ] - }, - "3479": { - "op": "pushints 20 40 50 60 70 80", - "defined_out": [ - "20", - "40", - "50", - "60", - "70", - "80", - "role#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "role#0", - "20", - "40", - "50", - "60", - "70", - "80" - ] - }, - "3487": { - "op": "uncover 6", - "stack_out": [ - "role_address#0", - "20", - "40", - "50", - "60", - "70", - "80", - "role#0" - ] - }, - "3489": { - "op": "match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7", - "stack_out": [ - "role_address#0" - ] - }, - "3503": { - "error": "Invalid role identifier", - "op": "err // Invalid role identifier" - }, - "3504": { - "block": "rbac_get_role_config_switch_case_5@7", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 25 // 0x52383023", - "defined_out": [ - "0x52383023" - ], - "stack_out": [ - "role_address#0", - "0x52383023" - ] - }, - "3506": { - "op": "dig 1", - "defined_out": [ - "0x52383023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52383023", - "role_address#0" - ] - }, - "3508": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3509": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3510": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3511": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3513": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3514": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%8#0", - "aggregate%box_get%9#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%8#0", - "aggregate%box_get%9#0" - ] - }, - "3515": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3516": { - "block": "rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9", - "stack_in": [ - "role_address#0", - "tmp%3#0" - ], - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0", - "0x151f7c75" - ] - }, - "3517": { - "op": "swap", - "defined_out": [ - "0x151f7c75", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "0x151f7c75", - "tmp%3#0" - ] - }, - "3518": { - "op": "concat", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "role_address#0", - "tmp%4#0" - ] - }, - "3519": { - "op": "log", - "stack_out": [ - "role_address#0" - ] - }, - "3520": { - "op": "intc_1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "role_address#0", - "1" - ] - }, - "3521": { - "op": "return", - "stack_out": [ - "role_address#0" - ] - }, - "3522": { - "block": "rbac_get_role_config_switch_case_4@6", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 10 // 0x52373023", - "defined_out": [ - "0x52373023" - ], - "stack_out": [ - "role_address#0", - "0x52373023" - ] - }, - "3524": { - "op": "dig 1", - "defined_out": [ - "0x52373023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52373023", - "role_address#0" - ] - }, - "3526": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3527": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3528": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3529": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3531": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3532": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%6#0", - "aggregate%box_get%7#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%6#0", - "aggregate%box_get%7#0" - ] - }, - "3533": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3534": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3537": { - "block": "rbac_get_role_config_switch_case_3@5", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 17 // 0x52363023", - "defined_out": [ - "0x52363023" - ], - "stack_out": [ - "role_address#0", - "0x52363023" - ] - }, - "3539": { - "op": "dig 1", - "defined_out": [ - "0x52363023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52363023", - "role_address#0" - ] - }, - "3541": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3542": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3543": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3544": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3546": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3547": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%4#0", - "aggregate%box_get%5#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%4#0", - "aggregate%box_get%5#0" - ] - }, - "3548": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3549": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3552": { - "block": "rbac_get_role_config_switch_case_2@4", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 18 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "role_address#0", - "0x52353023" - ] - }, - "3554": { - "op": "dig 1", - "defined_out": [ - "0x52353023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52353023", - "role_address#0" - ] - }, - "3556": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3557": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3558": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3559": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3561": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3562": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "3563": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3564": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3567": { - "block": "rbac_get_role_config_switch_case_1@3", - "stack_in": [ - "role_address#0" - ], - "op": "bytec 11 // 0x52343023", - "defined_out": [ - "0x52343023" - ], - "stack_out": [ - "role_address#0", - "0x52343023" - ] - }, - "3569": { - "op": "dig 1", - "defined_out": [ - "0x52343023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0x52343023", - "role_address#0" - ] - }, - "3571": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3572": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1 (copy)" - ] - }, - "3573": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3574": { - "op": "bury 1", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3576": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "role_address#0", - "box_prefixed_key%0#1" - ] - }, - "3577": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3578": { - "op": "pop", - "defined_out": [ - "role_address#0", - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3579": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3582": { - "block": "rbac_get_role_config_switch_case_0@2", - "stack_in": [ - "role_address#0" - ], - "op": "pushbytes 0x00000000000000000000000000000000", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "role_address#0", - "tmp%3#0" - ] - }, - "3600": { - "op": "b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9" - }, - "3603": { - "subroutine": "modules.core_financial.no_coupon.NoCouponCashflowMixin.day_count_factor", - "params": {}, - "block": "day_count_factor", - "stack_in": [], - "op": "proto 0 1" - }, - "3606": { - "op": "global LatestTimestamp", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3608": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "3609": { - "op": "bytec 8 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0", - "\"issuance_date\"" - ] - }, - "3611": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3612": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0" - ] - }, - "3613": { - "op": "swap", - "stack_out": [ - "maybe_value%0#0", - "tmp%0#0" - ] - }, - "3614": { - "op": "dig 1", - "defined_out": [ - "maybe_value%0#0", - "maybe_value%0#0 (copy)", - "tmp%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "tmp%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "3616": { - "op": "-", - "defined_out": [ - "accrued_period#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "accrued_period#0" - ] - }, - "3617": { - "op": "swap", - "defined_out": [ - "accrued_period#0", - "maybe_value%0#0" - ], - "stack_out": [ - "accrued_period#0", - "maybe_value%0#0" - ] - }, - "3618": { - "op": "intc_0 // 0", - "stack_out": [ - "accrued_period#0", - "maybe_value%0#0", - "0" - ] - }, - "3619": { - "op": "bytec 4 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "accrued_period#0", - "maybe_value%0#0" - ], - "stack_out": [ - "accrued_period#0", - "maybe_value%0#0", - "0", - "\"maturity_date\"" - ] - }, - "3621": { - "op": "app_global_get_ex", - "defined_out": [ - "accrued_period#0", - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ], - "stack_out": [ - "accrued_period#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "3622": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "accrued_period#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "3623": { - "op": "swap", - "stack_out": [ - "accrued_period#0", - "maybe_value%1#0", - "maybe_value%0#0" - ] - }, - "3624": { - "op": "-", - "defined_out": [ - "accrued_period#0", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0" - ] - }, - "3625": { - "op": "intc_0 // 0", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "0" - ] - }, - "3626": { - "op": "bytec 14 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "accrued_period#0", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "0", - "\"day_count_convention\"" - ] - }, - "3628": { - "op": "app_global_get_ex", - "defined_out": [ - "accrued_period#0", - "maybe_exists%3#0", - "maybe_value%3#0", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "3629": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "maybe_value%3#0" - ] - }, - "3630": { - "op": "bnz day_count_factor_after_if_else@2", - "stack_out": [ - "accrued_period#0", - "principal_period#0" - ] - }, - "3633": { - "op": "frame_dig 0", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "accrued_period#0" - ] - }, - "3635": { - "op": "intc 5 // 86400", - "defined_out": [ - "86400", - "accrued_period#0", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "accrued_period#0", - "86400" - ] - }, - "3637": { - "op": "/", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "accrued_period#0" - ] - }, - "3638": { - "op": "frame_bury 0", - "stack_out": [ - "accrued_period#0", - "principal_period#0" - ] - }, - "3640": { - "op": "intc 5 // 86400", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "86400" - ] - }, - "3642": { - "op": "/", - "stack_out": [ - "accrued_period#0", - "principal_period#0" - ] - }, - "3643": { - "block": "day_count_factor_after_if_else@2", - "stack_in": [ - "accrued_period#0", - "principal_period#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "accrued_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "accrued_period#0" - ] - }, - "3645": { - "op": "itob", - "defined_out": [ - "accrued_period#0", - "aggregate%val_as_bytes%0#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "aggregate%val_as_bytes%0#0" - ] - }, - "3646": { - "op": "swap", - "defined_out": [ - "accrued_period#0", - "aggregate%val_as_bytes%0#0", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "aggregate%val_as_bytes%0#0", - "principal_period#0" - ] - }, - "3647": { - "op": "itob", - "defined_out": [ - "accrued_period#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ], - "stack_out": [ - "accrued_period#0", - "aggregate%val_as_bytes%0#0", - "aggregate%val_as_bytes%1#0" - ] - }, - "3648": { - "op": "concat", - "defined_out": [ - "accrued_period#0", - "aggregate%head%1#0" - ], - "stack_out": [ - "accrued_period#0", - "aggregate%head%1#0" - ] - }, - "3649": { - "op": "swap" - }, - "3650": { - "retsub": true, - "op": "retsub" - }, - "3651": { - "subroutine": "modules.core_financial.no_coupon.NoCouponCashflowMixin.accrued_interest_amount", - "params": { - "holding_address#0": "bytes", - "units#0": "uint64" - }, - "block": "accrued_interest_amount", - "stack_in": [], - "op": "proto 2 1" - }, - "3654": { - "callsub": "modules.core_financial.no_coupon.NoCouponCashflowMixin.day_count_factor", - "op": "callsub day_count_factor", - "defined_out": [ - "day_count_factor#0" - ], - "stack_out": [ - "day_count_factor#0" - ] - }, - "3657": { - "op": "dup", - "defined_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)" - ], - "stack_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)" - ] - }, - "3658": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "day_count_factor#0", - "day_count_factor#0 (copy)" - ], - "stack_out": [ - "day_count_factor#0", - "day_count_factor#0 (copy)", - "0" - ] - }, - "3659": { - "op": "extract_uint64", - "defined_out": [ - "accrued_period#0", - "day_count_factor#0" - ], - "stack_out": [ - "day_count_factor#0", - "accrued_period#0" - ] - }, - "3660": { - "op": "swap", - "stack_out": [ - "accrued_period#0", - "day_count_factor#0" - ] - }, - "3661": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "accrued_period#0", - "day_count_factor#0" - ], - "stack_out": [ - "accrued_period#0", - "day_count_factor#0", - "8" - ] - }, - "3662": { - "op": "extract_uint64", - "defined_out": [ - "accrued_period#0", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0" - ] - }, - "3663": { - "op": "frame_dig -2", - "defined_out": [ - "accrued_period#0", - "holding_address#0 (copy)", - "principal_period#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "holding_address#0 (copy)" - ] - }, - "3665": { - "op": "frame_dig -1", - "defined_out": [ - "accrued_period#0", - "holding_address#0 (copy)", - "principal_period#0", - "units#0 (copy)" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "holding_address#0 (copy)", - "units#0 (copy)" - ] - }, - "3667": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%1#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%1#0" - ] - }, - "3670": { - "op": "intc_0 // 0", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%1#0", - "0" - ] - }, - "3671": { - "op": "bytec 15 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "accrued_period#0", - "principal_period#0", - "tmp%1#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%1#0", - "0", - "\"principal_discount\"" - ] - }, - "3673": { - "op": "app_global_get_ex", - "defined_out": [ - "accrued_period#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "principal_period#0", - "tmp%1#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%1#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3674": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%1#0", - "maybe_value%0#0" - ] - }, - "3675": { - "op": "*", - "defined_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%2#0" - ], - "stack_out": [ - "accrued_period#0", - "principal_period#0", - "tmp%2#0" - ] - }, - "3676": { - "op": "uncover 2", - "stack_out": [ - "principal_period#0", - "tmp%2#0", - "accrued_period#0" - ] - }, - "3678": { - "op": "*", - "defined_out": [ - "principal_period#0", - "tmp%3#0" - ], - "stack_out": [ - "principal_period#0", - "tmp%3#0" - ] - }, - "3679": { - "op": "pushint 10000", - "defined_out": [ - "10000", - "principal_period#0", - "tmp%3#0" - ], - "stack_out": [ - "principal_period#0", - "tmp%3#0", - "10000" - ] - }, - "3682": { - "op": "uncover 2", - "stack_out": [ - "tmp%3#0", - "10000", - "principal_period#0" - ] - }, - "3684": { - "op": "*", - "defined_out": [ - "tmp%3#0", - "tmp%4#0" - ], - "stack_out": [ - "tmp%3#0", - "tmp%4#0" - ] - }, - "3685": { - "op": "/", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "3686": { - "retsub": true, - "op": "retsub" - }, - "3687": { - "subroutine": "modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted", - "params": { - "time_events#0": "bytes" - }, - "block": "assert_time_events_sorted", - "stack_in": [], - "op": "proto 1 1" - }, - "3690": { - "op": "pushbytes \"\"", - "stack_out": [ - "time_f#0" - ] - }, - "3692": { - "op": "dupn 2", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0" - ] - }, - "3694": { - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "time_events#0 (copy)" - ] - }, - "3696": { - "op": "extract 2 0", - "defined_out": [ - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0" - ] - }, - "3699": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "3701": { - "op": "pushint 2", - "defined_out": [ - "2", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "2" - ] - }, - "3703": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "values%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "values%0#0" - ] - }, - "3704": { - "op": "global LatestTimestamp", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%0#0", - "values%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "values%0#0", - "tmp%0#0" - ] - }, - "3706": { - "op": ">", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%1#0" - ] - }, - "3707": { - "error": "Time events must be set in the future", - "op": "assert // Time events must be set in the future", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0" - ] - }, - "3708": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)" - ] - }, - "3710": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "time_events#0 (copy)", - "0" - ] - }, - "3711": { - "error": "invalid array length header", - "op": "extract_uint16 // on error: invalid array length header", - "defined_out": [ - "aggregate%array_length%0#0", - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%0#0" - ] - }, - "3712": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_length%0#0", - "aggregate%array_trimmed%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "aggregate%array_length%0#0", - "1" - ] - }, - "3713": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0" - ] - }, - "3714": { - "op": "intc_0 // 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3715": { - "block": "assert_time_events_sorted_for_header@1", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "3717": { - "op": "frame_dig 4", - "defined_out": [ - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "tmp%3#0" - ] - }, - "3719": { - "op": "<", - "defined_out": [ - "continue_looping%0#0", - "idx#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "continue_looping%0#0" - ] - }, - "3720": { - "op": "bz assert_time_events_sorted_after_for@6", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3723": { - "block": "assert_time_events_sorted_while_top@8", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "pushint 75", - "defined_out": [ - "75" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "75" - ] - }, - "3725": { - "op": "global OpcodeBudget", - "defined_out": [ - "75", - "tmp%1#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "75", - "tmp%1#1" - ] - }, - "3727": { - "op": ">", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%2#1" - ] - }, - "3728": { - "op": "bz assert_time_events_sorted_after_while@13", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3731": { - "op": "itxn_begin" - }, - "3732": { - "op": "pushint 6 // appl", - "defined_out": [ - "appl" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "appl" - ] - }, - "3734": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3736": { - "op": "pushint 5 // DeleteApplication", - "defined_out": [ - "DeleteApplication" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "DeleteApplication" - ] - }, - "3738": { - "op": "itxn_field OnCompletion", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3740": { - "op": "bytec 31 // 0x068101", - "defined_out": [ - "0x068101" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0x068101" - ] - }, - "3742": { - "op": "itxn_field ApprovalProgram", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3744": { - "op": "bytec 31 // 0x068101", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0x068101" - ] - }, - "3746": { - "op": "itxn_field ClearStateProgram", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3748": { - "op": "global MinTxnFee", - "defined_out": [ - "tmp%3#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%3#1" - ] - }, - "3750": { - "op": "itxn_field Fee", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3752": { - "op": "itxn_submit" - }, - "3753": { - "op": "b assert_time_events_sorted_while_top@8" - }, - "3756": { - "block": "assert_time_events_sorted_after_while@13", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "3758": { - "op": "dup", - "defined_out": [ - "idx#0", - "idx#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "idx#0 (copy)" - ] - }, - "3759": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "idx#0", - "idx#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "idx#0 (copy)", - "8" - ] - }, - "3760": { - "op": "*", - "defined_out": [ - "aggregate%bytes_offset%1#0", - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0" - ] - }, - "3761": { - "op": "frame_dig 3", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%1#0", - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0" - ] - }, - "3763": { - "op": "dup", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%bytes_offset%1#0", - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%array_trimmed%0#0 (copy)" - ] - }, - "3764": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "aggregate%bytes_offset%1#0", - "aggregate%array_trimmed%0#0 (copy)" - ] - }, - "3766": { - "op": "swap", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "aggregate%array_trimmed%0#0 (copy)", - "aggregate%bytes_offset%1#0" - ] - }, - "3767": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ] - }, - "3768": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "time_i#0 (copy)" - ] - }, - "3769": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ] - }, - "3771": { - "op": "frame_bury 1", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0" - ] - }, - "3773": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "idx#0", - "1" - ] - }, - "3774": { - "op": "+", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0" - ] - }, - "3775": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0", - "tmp%4#0" - ] - }, - "3776": { - "op": "frame_bury 2", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0" - ] - }, - "3778": { - "op": "intc_3 // 8", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "tmp%4#0", - "8" - ] - }, - "3779": { - "op": "*", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%2#0", - "idx#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "aggregate%array_trimmed%0#0", - "aggregate%bytes_offset%2#0" - ] - }, - "3780": { - "op": "extract_uint64", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0" - ] - }, - "3781": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0", - "time_f#0" - ] - }, - "3782": { - "op": "frame_bury 0", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_i#0", - "time_f#0" - ] - }, - "3784": { - "op": "<", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%5#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%5#0" - ] - }, - "3785": { - "error": "Time events must be sorted in strictly ascending order", - "op": "assert // Time events must be sorted in strictly ascending order", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3786": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0" - ] - }, - "3787": { - "op": "bytec 14 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "0", - "\"day_count_convention\"" - ] - }, - "3789": { - "op": "app_global_get_ex", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3790": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0" - ] - }, - "3791": { - "op": "pushint 255", - "defined_out": [ - "255", - "aggregate%array_trimmed%0#0", - "idx#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "maybe_value%0#0", - "255" - ] - }, - "3794": { - "op": "!=", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%6#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%6#0" - ] - }, - "3795": { - "op": "bz assert_time_events_sorted_after_if_else@4", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3798": { - "op": "frame_dig 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_f#0" - ] - }, - "3800": { - "op": "frame_dig 1", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_f#0", - "time_i#0" - ] - }, - "3802": { - "op": "-", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%7#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%7#0" - ] - }, - "3803": { - "op": "intc 5 // 86400", - "defined_out": [ - "86400", - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%7#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%7#0", - "86400" - ] - }, - "3805": { - "op": "%", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%8#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%8#0" - ] - }, - "3806": { - "op": "!", - "defined_out": [ - "aggregate%array_trimmed%0#0", - "idx#0", - "time_f#0", - "time_i#0", - "tmp%4#0", - "tmp%9#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "tmp%9#0" - ] - }, - "3807": { - "error": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "op": "assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3808": { - "block": "assert_time_events_sorted_after_if_else@4", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig 2", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "idx#0" - ] - }, - "3810": { - "op": "frame_bury 5", - "defined_out": [ - "idx#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ] - }, - "3812": { - "op": "b assert_time_events_sorted_for_header@1" - }, - "3815": { - "block": "assert_time_events_sorted_after_for@6", - "stack_in": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0" - ], - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "tmp%4#0", - "aggregate%array_trimmed%0#0", - "tmp%3#0", - "idx#0", - "time_events#0 (copy)" - ] - }, - "3817": { - "op": "frame_bury 0" - }, - "3819": { - "retsub": true, - "op": "retsub" - }, - "3820": { - "subroutine": "modules.accounting.AccountingModule.assert_is_not_account_suspended", - "params": { - "holding_address#0": "bytes" - }, - "block": "assert_is_not_account_suspended", - "stack_in": [], - "op": "proto 1 0" - }, - "3823": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "3824": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "3826": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "3827": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3828": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "3829": { - "op": "pushint 448", - "defined_out": [ - "448", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "448" - ] - }, - "3832": { - "op": "getbit", - "defined_out": [ - "aggregate%get_bit%0#0" - ], - "stack_out": [ - "aggregate%get_bit%0#0" - ] - }, - "3833": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3834": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "3835": { - "retsub": true, - "op": "retsub" - }, - "3836": { - "subroutine": "modules.accounting.AccountingModule.account_units_value", - "params": { - "holding_address#0": "bytes", - "units#0": "uint64" - }, - "block": "account_units_value", - "stack_in": [], - "op": "proto 2 1" - }, - "3839": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "3840": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "3842": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "3843": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3844": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "3845": { - "op": "pushint 40", - "defined_out": [ - "40", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "40" - ] - }, - "3847": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "3848": { - "op": "frame_dig -1", - "defined_out": [ - "units#0 (copy)", - "values%0#0" - ], - "stack_out": [ - "values%0#0", - "units#0 (copy)" - ] - }, - "3850": { - "op": "*", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3851": { - "retsub": true, - "op": "retsub" - }, - "3852": { - "subroutine": "modules.accounting.AccountingModule.account_total_units_value", - "params": { - "holding_address#0": "bytes" - }, - "block": "account_total_units_value", - "stack_in": [], - "op": "proto 1 1" - }, - "3855": { - "op": "bytec_1 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "3856": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "3858": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#0" - ], - "stack_out": [ - "box_prefixed_key%0#0" - ] - }, - "3859": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3860": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "aggregate%box_get%0#0" - ] - }, - "3861": { - "op": "intc_2 // 32", - "defined_out": [ - "32", - "aggregate%box_get%0#0" - ], - "stack_out": [ - "aggregate%box_get%0#0", - "32" - ] - }, - "3862": { - "op": "extract_uint64", - "defined_out": [ - "values%0#0" - ], - "stack_out": [ - "values%0#0" - ] - }, - "3863": { - "op": "frame_dig -1", - "stack_out": [ - "values%0#0", - "holding_address#0 (copy)" - ] - }, - "3865": { - "op": "swap", - "stack_out": [ - "holding_address#0 (copy)", - "values%0#0" - ] - }, - "3866": { - "callsub": "modules.accounting.AccountingModule.account_units_value", - "op": "callsub account_units_value", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3869": { - "retsub": true, - "op": "retsub" - }, - "3870": { - "subroutine": "modules.accounting.AccountingModule.end_if_no_circulating_units", - "params": {}, - "block": "end_if_no_circulating_units", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3871": { - "op": "bytec_3 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0" - ], - "stack_out": [ - "0", - "\"circulating_units\"" - ] - }, - "3872": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3873": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3874": { - "op": "bnz end_if_no_circulating_units_after_if_else@2", - "stack_out": [] - }, - "3877": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "\"status\"" - ] - }, - "3878": { - "op": "intc 4 // 200", - "defined_out": [ - "\"status\"", - "200" - ], - "stack_out": [ - "\"status\"", - "200" - ] - }, - "3880": { - "op": "app_global_put", - "stack_out": [] - }, - "3881": { - "block": "end_if_no_circulating_units_after_if_else@2", - "stack_in": [], - "retsub": true, - "op": "retsub" - }, - "3882": { - "subroutine": "modules.rbac.RbacModule._role_is_active", - "params": { - "role_map#0": "bytes", - "role_address#0": "bytes" - }, - "block": "_role_is_active", - "stack_in": [], - "op": "proto 2 1" - }, - "3885": { - "op": "pushbytes \"\"", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "3887": { - "op": "frame_dig -2", - "defined_out": [ - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)" - ] - }, - "3889": { - "op": "frame_dig -1", - "defined_out": [ - "role_address#0 (copy)", - "role_map#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "role_map#0 (copy)", - "role_address#0 (copy)" - ] - }, - "3891": { - "op": "concat", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "3892": { - "op": "dup", - "defined_out": [ - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "3893": { - "op": "box_len", - "defined_out": [ - "_%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "_%0#0", - "maybe_exists%0#0" - ] - }, - "3894": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "maybe_exists%0#0" - ] - }, - "3896": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "3899": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "3901": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%0#0", - "aggregate%box_get%1#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "aggregate%box_get%1#0" - ] - }, - "3902": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0" - ] - }, - "3903": { - "op": "intc_0 // 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%0#0", - "0" - ] - }, - "3904": { - "op": "extract_uint64", - "defined_out": [ - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ] - }, - "3905": { - "op": "global LatestTimestamp" - }, - "3907": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "3908": { - "op": "frame_bury 0", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%0#0", - "awst_tmp%0#0" - ] - }, - "3910": { - "op": "<=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%1#0" - ] - }, - "3911": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "3914": { - "op": "frame_dig 1", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "box_prefixed_key%0#1" - ] - }, - "3916": { - "op": "box_get", - "defined_out": [ - "aggregate%box_get%2#0", - "aggregate%box_get%3#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "aggregate%box_get%3#0" - ] - }, - "3917": { - "error": "check BoxMap entry exists", - "op": "assert // check BoxMap entry exists", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0" - ] - }, - "3918": { - "op": "intc_3 // 8", - "defined_out": [ - "8", - "aggregate%box_get%2#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "aggregate%box_get%2#0", - "8" - ] - }, - "3919": { - "op": "extract_uint64", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0" - ] - }, - "3920": { - "op": "frame_dig 0", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "values%1#0", - "awst_tmp%0#0" - ] - }, - "3922": { - "op": ">=", - "defined_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "tmp%2#0" - ] - }, - "3923": { - "op": "bz _role_is_active_bool_false@4", - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ] - }, - "3926": { - "op": "intc_1 // 1", - "defined_out": [ - "and_result%0#0", - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "3927": { - "block": "_role_is_active_bool_merge@5", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ], - "op": "frame_bury 0", - "defined_out": [ - "and_result%0#0" - ] - }, - "3929": { - "retsub": true, - "op": "retsub" - }, - "3930": { - "block": "_role_is_active_bool_false@4", - "stack_in": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "box_prefixed_key%0#1", - "and_result%0#0" - ] - }, - "3931": { - "op": "b _role_is_active_bool_merge@5" - }, - "3934": { - "subroutine": "modules.rbac.RbacModule.assert_caller_is_arranger", - "params": {}, - "block": "assert_caller_is_arranger", - "stack_in": [], - "op": "txn Sender", - "defined_out": [ - "role_address#0" - ], - "stack_out": [ - "role_address#0" - ] - }, - "3936": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0" - ] - }, - "3937": { - "op": "bytec 5 // 0x52323023", - "defined_out": [ - "0", - "0x52323023", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "0", - "0x52323023" - ] - }, - "3939": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "role_address#0" - ], - "stack_out": [ - "role_address#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3940": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "role_address#0", - "maybe_value%0#0" - ] - }, - "3941": { - "op": "==", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "3942": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [] - }, - "3943": { - "retsub": true, - "op": "retsub" - }, - "3944": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_defaulted", - "params": {}, - "block": "assert_is_not_asset_defaulted", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3945": { - "op": "bytec 21 // \"asset_defaulted\"", - "defined_out": [ - "\"asset_defaulted\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_defaulted\"" - ] - }, - "3947": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3948": { - "error": "check self.asset_defaulted exists", - "op": "assert // check self.asset_defaulted exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3949": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3950": { - "error": "Defaulted", - "op": "assert // Defaulted", - "stack_out": [] - }, - "3951": { - "retsub": true, - "op": "retsub" - }, - "3952": { - "subroutine": "modules.rbac.RbacModule.assert_is_not_asset_suspended", - "params": {}, - "block": "assert_is_not_asset_suspended", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "3953": { - "op": "bytec 20 // \"asset_suspended\"", - "defined_out": [ - "\"asset_suspended\"", - "0" - ], - "stack_out": [ - "0", - "\"asset_suspended\"" - ] - }, - "3955": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "3956": { - "error": "check self.asset_suspended exists", - "op": "assert // check self.asset_suspended exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "3957": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3958": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "3959": { - "retsub": true, - "op": "retsub" - }, - "3960": { - "subroutine": "modules.rbac.RbacModule._assert_valid_role", - "params": { - "role_id#0": "uint64" - }, - "block": "_assert_valid_role", - "stack_in": [], - "op": "proto 1 0" - }, - "3963": { - "op": "frame_dig -1", - "defined_out": [ - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "3965": { - "op": "pushint 20", - "defined_out": [ - "20", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "20" - ] - }, - "3967": { - "op": "==", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "3968": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "3971": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "3973": { - "op": "pushint 40", - "defined_out": [ - "40", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "40" - ] - }, - "3975": { - "op": "==", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "3976": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "3979": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "3981": { - "op": "pushint 50", - "defined_out": [ - "50", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "50" - ] - }, - "3983": { - "op": "==", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "3984": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "3987": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "3989": { - "op": "pushint 60", - "defined_out": [ - "60", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "60" - ] - }, - "3991": { - "op": "==", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "3992": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "3995": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "3997": { - "op": "pushint 70", - "defined_out": [ - "70", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "70" - ] - }, - "3999": { - "op": "==", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "4000": { - "op": "bnz _assert_valid_role_bool_true@6", - "stack_out": [] - }, - "4003": { - "op": "frame_dig -1", - "stack_out": [ - "role_id#0 (copy)" - ] - }, - "4005": { - "op": "pushint 80", - "defined_out": [ - "80", - "role_id#0 (copy)" - ], - "stack_out": [ - "role_id#0 (copy)", - "80" - ] - }, - "4007": { - "op": "==", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "4008": { - "op": "bz _assert_valid_role_bool_false@7", - "stack_out": [] - }, - "4011": { - "block": "_assert_valid_role_bool_true@6", - "stack_in": [], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4012": { - "error": "Invalid role identifier", - "block": "_assert_valid_role_bool_merge@8", - "stack_in": [ - "or_result%0#0" - ], - "op": "assert // Invalid role identifier", - "defined_out": [], - "stack_out": [] - }, - "4013": { - "retsub": true, - "op": "retsub" - }, - "4014": { - "block": "_assert_valid_role_bool_false@7", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "or_result%0#0" - ] - }, - "4015": { - "op": "b _assert_valid_role_bool_merge@8" - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.teal b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.teal deleted file mode 100644 index bc5f4fed..00000000 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.teal +++ /dev/null @@ -1,4011 +0,0 @@ -#pragma version 12 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.approval_program() -> uint64: -main: - intcblock 0 1 32 8 200 86400 - bytecblock 0x151f7c75 0x52333023 "status" "circulating_units" "maturity_date" 0x52323023 "unit_value" "primary_distribution_opening_date" "issuance_date" "secondary_market_closure_date" 0x52373023 0x52343023 "total_units" "settlement_asset_id" "day_count_convention" "principal_discount" "secondary_market_opening_date" 0x52363023 0x52353023 0x52323523 "asset_suspended" "asset_defaulted" "denomination_asset_id" "metadata" "primary_distribution_closure_date" 0x52383023 "interest_rate" 0x74696d654576656e7473 0x00 "total_coupons" 0x0000 0x068101 - txn ApplicationID - bnz main_after_if_else@2 - // modules/rbac.py:30-31 - // # RBAC Roles - // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec 5 // 0x52323023 - global ZeroAddress - app_global_put - // modules/rbac.py:32 - // self.op_daemon = GlobalState(Account(), key=cst.PREFIX_ID_OP_DAEMON) - bytec 19 // 0x52323523 - global ZeroAddress - app_global_put - // modules/rbac.py:47-48 - // # D-ASA Governance - // self.asset_suspended = False - bytec 20 // "asset_suspended" - intc_0 // 0 - app_global_put - // modules/rbac.py:49 - // self.asset_defaulted = False - bytec 21 // "asset_defaulted" - intc_0 // 0 - app_global_put - // modules/accounting.py:19 - // self.total_units = UInt64() - bytec 12 // "total_units" - intc_0 // 0 - app_global_put - // modules/accounting.py:20 - // self.circulating_units = UInt64() - bytec_3 // "circulating_units" - intc_0 // 0 - app_global_put - // modules/accounting.py:21 - // self.unit_value = UInt64() - bytec 6 // "unit_value" - intc_0 // 0 - app_global_put - // modules/accounting.py:22 - // self.status = UInt64(enm.STATUS_INACTIVE) - bytec_2 // "status" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:31-32 - // # Asset Configuration - // self.denomination_asset_id = Asset() - bytec 22 // "denomination_asset_id" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:33 - // self.settlement_asset_id = Asset() - bytec 13 // "settlement_asset_id" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:34 - // self.unit_value = UInt64() - bytec 6 // "unit_value" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:35 - // self.day_count_convention = UInt64() - bytec 14 // "day_count_convention" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:37-38 - // # Metadata - // self.metadata = Bytes() - bytec 23 // "metadata" - pushbytes 0x - app_global_put - // modules/core_financial/common.py:40-41 - // # Principal / Rates - // self.principal_discount = UInt64() - bytec 15 // "principal_discount" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:42 - // self.interest_rate = UInt64() - bytec 26 // "interest_rate" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:43 - // self.total_coupons = UInt64() - bytec 29 // "total_coupons" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:47 - // self.primary_distribution_opening_date = UInt64() - bytec 7 // "primary_distribution_opening_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:48 - // self.primary_distribution_closure_date = UInt64() - bytec 24 // "primary_distribution_closure_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:49 - // self.issuance_date = UInt64() - bytec 8 // "issuance_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:50 - // self.secondary_market_opening_date = UInt64() - bytec 16 // "secondary_market_opening_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:51 - // self.secondary_market_closure_date = UInt64() - bytec 9 // "secondary_market_closure_date" - intc_0 // 0 - app_global_put - // modules/core_financial/common.py:52 - // self.maturity_date = UInt64() - bytec 4 // "maturity_date" - intc_0 // 0 - app_global_put - // smart_contracts/zero_coupon_bond/contract.py:27 - // assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES - txn GlobalNumByteSlice - pushint 3 - == - assert // Wrong Global Bytes allocation - // smart_contracts/zero_coupon_bond/contract.py:28 - // assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS - txn GlobalNumUint - pushint 18 - == - assert // Wrong Global UInts allocation - // smart_contracts/zero_coupon_bond/contract.py:29 - // assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES - txn LocalNumByteSlice - ! - assert // Wrong Local Bytes allocation - // smart_contracts/zero_coupon_bond/contract.py:30 - // assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS - txn LocalNumUint - ! - assert // Wrong Local UInts allocation - -main_after_if_else@2: - // smart_contracts/zero_coupon_bond/contract.py:12-24 - // class ZeroCouponBond( - // PAMCoreMixin, - // NoCouponCashflowMixin, - // PrincipalPaymentAgentMixin, - // NoCouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - pushbytes 0x25dba95b // method "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - txna ApplicationArgs 0 - match main_asset_update_route@4 - -main_switch_case_next@5: - // smart_contracts/zero_coupon_bond/contract.py:12-24 - // class ZeroCouponBond( - // PAMCoreMixin, - // NoCouponCashflowMixin, - // PrincipalPaymentAgentMixin, - // NoCouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - txn OnCompletion - ! - assert - txn ApplicationID - bz main_create_NoOp@33 - pushbytess 0x89474134 0x44363d49 0x67db4f20 0x9c76b6a3 0x4fd6a3cc 0x1d6fc255 0x25e9997f 0x6c85e3ee 0x402dba47 0xfad2173e 0x08efea35 0xe4a5ab54 0xdc063b35 0x14fc10ef 0x4c113ed5 0x74a7297f 0x105c184e 0x82f71b2d 0xef04f5d3 0x03b83329 0x3dbe80bd 0xdf54e82c 0x010c8299 0x7406acd2 0xc3e4b297 // method "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", method "get_payment_amount(address)(uint64,uint64)", method "pay_principal(address,byte[])(uint64,uint64,byte[])", method "asset_transfer(address,address,uint64)uint64", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "set_default_status(bool)uint64", method "primary_distribution(address,uint64)uint64", method "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", method "account_gov_suspension(address,bool)uint64", method "account_open(address,address)uint64", method "account_close(address)(uint64,uint64)", method "account_update_payment_address(address,address)uint64", method "account_get_info(address)(address,uint64,uint64,uint64,bool)", method "rbac_rotate_arranger(address)uint64", method "rbac_set_op_daemon(address)uint64", method "rbac_assign_role(uint8,address,byte[])uint64", method "rbac_revoke_role(uint8,address)uint64", method "rbac_gov_asset_suspension(bool)uint64", method "rbac_get_arranger()address", method "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", method "rbac_get_role_config(uint8,address)(uint64,uint64)" - txna ApplicationArgs 0 - match asset_config get_account_units_current_value get_payment_amount pay_principal asset_transfer set_secondary_time_events set_default_status primary_distribution get_asset_info get_time_events get_secondary_market_schedule get_asset_metadata account_gov_suspension account_open account_close account_update_payment_address account_get_info rbac_rotate_arranger rbac_set_op_daemon rbac_assign_role rbac_revoke_role rbac_gov_asset_suspension rbac_get_arranger rbac_get_address_roles rbac_get_role_config - err - -main_create_NoOp@33: - // smart_contracts/zero_coupon_bond/contract.py:12-24 - // class ZeroCouponBond( - // PAMCoreMixin, - // NoCouponCashflowMixin, - // PrincipalPaymentAgentMixin, - // NoCouponTransferAgentMixin, - // state_totals=StateTotals( - // global_bytes=cfg.GLOBAL_BYTES, - // global_uints=cfg.GLOBAL_UINTS, - // local_bytes=cfg.LOCAL_BYTES, - // local_uints=cfg.LOCAL_UINTS, - // ), - // avm_version=12, - // ): - pushbytes 0x3f0efc6c // method "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - txna ApplicationArgs 0 - match asset_create - err - -main_asset_update_route@4: - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txn OnCompletion - pushint 4 // UpdateApplication - == - txn ApplicationID - && - assert - b asset_update - - -// modules.actus.pam.PAMCoreMixin.asset_config[routing]() -> void: -asset_config: - // modules/actus/pam.py:26 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 3 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 4 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 5 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - txna ApplicationArgs 6 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 7 - dup - cover 7 - len - pushint 2 - == - assert // invalid number of bytes for arc4.uint16 - txna ApplicationArgs 8 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - pushint 2 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array - txna ApplicationArgs 9 - dup - cover 7 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - intc_3 // 8 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array - txna ApplicationArgs 10 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - cover 8 - pushint 16 - * - pushint 2 - + - swap - len - == - assert // invalid number of bytes for arc4.dynamic_array> - // modules/core_financial/common.py:227 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/core_financial/common.py:228 - // assert self.status == enums.STATUS_INACTIVE, err.ALREADY_CONFIGURED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - ! - assert // D-ASA already configured - // modules/core_financial/common.py:55-56 - // # The reference implementation has on-chain denomination with ASA - // _creator, exists = op.AssetParamsGet.asset_creator(denomination_asset_id) - dig 5 - asset_params_get AssetCreator - bury 1 - // modules/core_financial/common.py:57 - // assert exists, err.INVALID_DENOMINATION - assert // Denomination asset is not properly set - // modules/core_financial/common.py:60 - // self.denomination_asset_id = denomination_asset_id - bytec 22 // "denomination_asset_id" - dig 6 - app_global_put - // modules/core_financial/common.py:65 - // settlement_asset_id == self.denomination_asset_id - dig 4 - uncover 6 - == - // modules/core_financial/common.py:63-66 - // # The reference implementation settlement asset is the denomination asset - // assert ( - // settlement_asset_id == self.denomination_asset_id - // ), err.INVALID_SETTLEMENT_ASSET - assert // Different settlement asset not supported, must be equal to denomination asset - // modules/core_financial/common.py:69 - // self.settlement_asset_id = settlement_asset_id - bytec 13 // "settlement_asset_id" - dig 5 - app_global_put - // modules/core_financial/common.py:70-76 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // modules/core_financial/common.py:75 - // fee=Global.min_txn_fee, - global MinTxnFee - // modules/core_financial/common.py:73 - // asset_receiver=Global.current_application_address, - global CurrentApplicationAddress - // modules/core_financial/common.py:74 - // asset_amount=0, - intc_0 // 0 - itxn_field AssetAmount - itxn_field AssetReceiver - uncover 5 - itxn_field XferAsset - // modules/core_financial/common.py:70-71 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - pushint 4 // axfer - itxn_field TypeEnum - itxn_field Fee - // modules/core_financial/common.py:70-76 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - // modules/core_financial/common.py:238-239 - // # Set Principal and Minimum Denomination - // assert principal % minimum_denomination == 0, err.INVALID_MINIMUM_DENOMINATION - dig 3 - dig 2 - % - ! - assert // Minimum denomination is not a divisor of principal - // modules/core_financial/common.py:240 - // self.unit_value = minimum_denomination - bytec 6 // "unit_value" - dig 2 - app_global_put - // modules/core_financial/common.py:241 - // self.total_units = principal // minimum_denomination - uncover 3 - uncover 2 - / - bytec 12 // "total_units" - swap - app_global_put - // modules/core_financial/common.py:242 - // self.principal_discount = principal_discount - bytec 15 // "principal_discount" - uncover 2 - app_global_put - // modules/core_financial/common.py:244-245 - // # Set Day-Count Convention - // self.assert_day_count_convention(day_count_convention.as_uint64()) - btoi - dup - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - bz asset_config_bool_true@3 - dup - // modules/core_financial/common.py:82 - // UInt64(cst.DCC_CONT), - pushint 255 - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - == - bz asset_config_bool_false@4 - -asset_config_bool_true@3: - intc_1 // 1 - -asset_config_bool_merge@5: - // modules/core_financial/common.py:79-83 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - assert // Invalid day-count convention ID - // modules/core_financial/common.py:86 - // self.day_count_convention = day_count_convention - bytec 14 // "day_count_convention" - dig 1 - app_global_put - // modules/core_financial/common.py:248-249 - // # Set Interest Rate - // self.assert_interest_rate(interest_rate.as_uint64()) - dig 5 - btoi - // modules/core_financial/no_coupon.py:14-15 - // # This subroutine must be used after the principal discount has been set - // assert interest_rate == UInt64(0), err.INVALID_INTEREST_RATE - dup - ! - assert // Interest rate is not properly defined - // modules/core_financial/common.py:94 - // self.interest_rate = interest_rate - bytec 26 // "interest_rate" - swap - app_global_put - // modules/core_financial/common.py:97 - // assert not coupon_rates.length, err.INVALID_COUPON_RATES - dig 4 - dup - ! - assert // Coupon rates are not properly defined - // modules/core_financial/common.py:100 - // self.total_coupons = coupon_rates.length - bytec 29 // "total_coupons" - dig 1 - app_global_put - // modules/core_financial/common.py:104 - // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS - pushint 4 - + - dig 3 - == - // modules/core_financial/common.py:103-105 - // assert ( - // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS - // ), err.INVALID_TIME_EVENTS_LENGTH - assert // Time events length is invalid - // modules/core_financial/common.py:258 - // self.assert_time_events_sorted(time_events) - dig 3 - callsub assert_time_events_sorted - // modules/core_financial/common.py:127 - // self.time_events.value = time_events.copy() - bytec 27 // 0x74696d654576656e7473 - box_del - pop - bytec 27 // 0x74696d654576656e7473 - dig 1 - box_put - // modules/core_financial/common.py:128-130 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ] - dup - extract 2 0 - dig 1 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:128 - // self.primary_distribution_opening_date = time_events[ - bytec 7 // "primary_distribution_opening_date" - // modules/core_financial/common.py:128-130 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:131-133 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ] - dig 1 - pushint 10 - extract_uint64 - // modules/core_financial/common.py:131 - // self.primary_distribution_closure_date = time_events[ - bytec 24 // "primary_distribution_closure_date" - // modules/core_financial/common.py:131-133 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:134 - // self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX] - dig 1 - pushint 18 - extract_uint64 - bytec 8 // "issuance_date" - swap - app_global_put - // modules/core_financial/common.py:135 - // self.maturity_date = time_events[cfg.MATURITY_DATE_IDX] - swap - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_3 // 8 - * - extract_uint64 - bytec 4 // "maturity_date" - swap - app_global_put - // modules/core_financial/common.py:138 - // assert not time_periods.length, err.INVALID_TIME_PERIODS - dig 1 - ! - assert // Time periods are not properly defined - // modules/core_financial/common.py:265 - // self.status = UInt64(enums.STATUS_ACTIVE) - bytec_2 // "status" - pushint 100 - app_global_put - // modules/actus/pam.py:26 - // @arc4.abimethod - intc_1 // 1 - return - -asset_config_bool_false@4: - intc_0 // 0 - b asset_config_bool_merge@5 - - -// modules.core_financial.no_coupon.NoCouponCashflowMixin.get_account_units_current_value[routing]() -> void: -get_account_units_current_value: - intc_0 // 0 - pushbytes "" - dupn 5 - // modules/core_financial/no_coupon.py:58 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/core_financial/no_coupon.py:78 - // self.primary_distribution_opening_date - intc_0 // 0 - bytec 7 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/no_coupon.py:78-79 - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - bz get_account_units_current_value_bool_false@4 - // modules/core_financial/no_coupon.py:79 - // and Global.latest_timestamp >= self.primary_distribution_opening_date - global LatestTimestamp - intc_0 // 0 - bytec 7 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - >= - // modules/core_financial/no_coupon.py:78-79 - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - bz get_account_units_current_value_bool_false@4 - intc_1 // 1 - -get_account_units_current_value_bool_merge@5: - // modules/core_financial/no_coupon.py:77-80 - // assert ( - // self.primary_distribution_opening_date - // and Global.latest_timestamp >= self.primary_distribution_opening_date - // ), err.NO_PRIMARY_DISTRIBUTION - assert // Primary distribution not yet executed - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 2 - concat - dup - bury 10 - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/no_coupon.py:82 - // assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - dup - bz get_account_units_current_value_bool_false@8 - dig 8 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dig 1 - >= - bz get_account_units_current_value_bool_false@8 - intc_1 // 1 - -get_account_units_current_value_bool_merge@9: - // modules/core_financial/no_coupon.py:82 - // assert 0 < units <= self.account[holding_address].units, err.INVALID_UNITS - assert // Invalid amount of units for the account - // modules/core_financial/no_coupon.py:84 - // account_units_nominal_value = self.account_units_value(holding_address, units) - dup2 - callsub account_units_value - dup - bury 8 - // modules/core_financial/no_coupon.py:86 - // account_units_nominal_value * self.principal_discount // cst.BPS - intc_0 // 0 - bytec 15 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - dig 1 - * - pushint 10000 - / - // modules/core_financial/no_coupon.py:90 - // account_units_nominal_value - account_units_discount - - - bury 8 - // modules/core_financial/no_coupon.py:93-94 - // # Accruing interest during primary distribution and at maturity - // accrued_interest = UInt64() - intc_0 // 0 - bury 6 - // modules/core_financial/no_coupon.py:95 - // numerator = UInt64() - intc_0 // 0 - bury 3 - // modules/core_financial/no_coupon.py:96 - // denominator = UInt64() - intc_0 // 0 - bury 4 - // modules/core_financial/no_coupon.py:30-31 - // # The check on maturity date ensures D-ASA has been configured as block timestamp cannot be less than 0 (init). - // return self.issuance_date <= Global.latest_timestamp < self.maturity_date - intc_0 // 0 - bytec 8 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - global LatestTimestamp - dup - bury 7 - <= - bz get_account_units_current_value_bool_false@17 - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - dig 5 - > - bz get_account_units_current_value_bool_false@17 - intc_1 // 1 - -get_account_units_current_value_bool_merge@18: - // modules/core_financial/no_coupon.py:98-99 - // # Accruing interest - // if self.is_accruing_interest(): - bz get_account_units_current_value_after_if_else@11 - // modules/core_financial/no_coupon.py:100 - // day_count_factor = self.day_count_factor() - callsub day_count_factor - // modules/core_financial/no_coupon.py:101 - // accrued_interest = self.accrued_interest_amount(holding_address, units) - dig 2 - dig 2 - callsub accrued_interest_amount - bury 7 - // modules/core_financial/no_coupon.py:102 - // numerator = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - bury 4 - // modules/core_financial/no_coupon.py:103 - // denominator = day_count_factor.denominator - intc_3 // 8 - extract_uint64 - bury 4 - -get_account_units_current_value_after_if_else@11: - // modules/core_financial/no_coupon.py:105-106 - // # Value at maturity - // if Global.latest_timestamp >= self.maturity_date: - global LatestTimestamp - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - >= - bz get_account_units_current_value_after_if_else@13 - dig 6 - bury 8 - -get_account_units_current_value_after_if_else@13: - // modules/core_financial/no_coupon.py:112-115 - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - dig 2 - itob - dig 4 - itob - concat - // modules/core_financial/no_coupon.py:109-116 - // return typ.CurrentUnitsValue( - // units_value=account_units_current_value, - // accrued_interest=accrued_interest, - // day_count_factor=typ.DayCountFactor( - // numerator=numerator, - // denominator=denominator, - // ), - // ) - dig 8 - itob - dig 7 - itob - concat - swap - concat - // modules/core_financial/no_coupon.py:58 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -get_account_units_current_value_bool_false@17: - intc_0 // 0 - b get_account_units_current_value_bool_merge@18 - -get_account_units_current_value_bool_false@8: - intc_0 // 0 - b get_account_units_current_value_bool_merge@9 - -get_account_units_current_value_bool_false@4: - intc_0 // 0 - b get_account_units_current_value_bool_merge@5 - - -// modules.core_financial.no_coupon.NoCouponCashflowMixin.get_payment_amount[routing]() -> void: -get_payment_amount: - // modules/core_financial/no_coupon.py:118 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dupn 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/no_coupon.py:134 - // principal_amount = UInt64() - intc_0 // 0 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - dup - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/no_coupon.py:135 - // if self.status_is_active(): - bz get_payment_amount_after_if_else@3 - // modules/core_financial/no_coupon.py:136 - // principal_amount = self.account_total_units_value(holding_address) - dig 1 - callsub account_total_units_value - bury 1 - -get_payment_amount_after_if_else@3: - // modules/core_financial/no_coupon.py:137 - // return typ.PaymentAmounts(interest=UInt64(0), principal=principal_amount) - intc_0 // 0 - itob - dig 1 - itob - concat - // modules/core_financial/no_coupon.py:118 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.payment_agent.principal.PrincipalPaymentAgentMixin.pay_principal[routing]() -> void: -pay_principal: - // modules/payment_agent/principal.py:30 - // @arc4.abimethod - txna ApplicationArgs 1 - dupn 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/actus/pam.py:16-17 - // # The reference implementation does not restrict caller authorization - // assert self.status_is_active(), err.UNAUTHORIZED - assert // Not authorized - // modules/actus/pam.py:18 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/actus/pam.py:19 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - cover 2 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/actus/pam.py:21 - // units = self.account[holding_address].units - box_get - pop - intc_2 // 32 - extract_uint64 - // modules/actus/pam.py:22 - // assert units > 0, err.NO_UNITS - assert // No D-ASA units - // modules/actus/pam.py:23 - // assert Global.latest_timestamp >= self.maturity_date, err.NOT_MATURE - global LatestTimestamp - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - >= - assert // Not mature - // modules/core_financial/no_coupon.py:53 - // return self.account_total_units_value(holding_address) - callsub account_total_units_value - // modules/payment_agent/common.py:13 - // if self.op_daemon.value != Global.zero_address: - intc_0 // 0 - bytec 19 // 0x52323523 - app_global_get_ex - assert // check self.op_daemon exists - global ZeroAddress - != - bz pay_principal_after_if_else@22 - // modules/payment_agent/common.py:15 - // Txn.sender == self.op_daemon.value - txn Sender - intc_0 // 0 - bytec 19 // 0x52323523 - app_global_get_ex - assert // check self.op_daemon exists - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bnz pay_principal_bool_true@19 - // modules/payment_agent/common.py:16 - // or Txn.sender == holding_address - txn Sender - dig 4 - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bnz pay_principal_bool_true@19 - // modules/payment_agent/common.py:17 - // or Txn.sender == self.account[holding_address].payment_address - txn Sender - dig 2 - box_get - assert // check self.account entry exists - extract 0 32 - == - // modules/payment_agent/common.py:15-17 - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - bz pay_principal_bool_false@20 - -pay_principal_bool_true@19: - intc_1 // 1 - -pay_principal_bool_merge@21: - // modules/payment_agent/common.py:14-18 - // assert ( - // Txn.sender == self.op_daemon.value - // or Txn.sender == holding_address - // or Txn.sender == self.account[holding_address].payment_address - // ), err.UNAUTHORIZED - assert // Not authorized - -pay_principal_after_if_else@22: - // modules/payment_agent/common.py:22 - // self.account[holding_address].payment_address.is_opted_in( - dig 1 - box_get - assert // check self.account entry exists - extract 0 32 - // modules/payment_agent/common.py:23 - // self.settlement_asset_id - intc_0 // 0 - bytec 13 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // modules/payment_agent/common.py:22-24 - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - asset_holding_get AssetBalance - bury 1 - // modules/payment_agent/common.py:22-25 - // self.account[holding_address].payment_address.is_opted_in( - // self.settlement_asset_id - // ) - // and not self.account[holding_address].suspended - bz pay_principal_bool_false@27 - // modules/payment_agent/common.py:25 - // and not self.account[holding_address].suspended - dig 1 - box_get - assert // check self.account entry exists - pushint 448 - getbit - bnz pay_principal_bool_false@27 - intc_1 // 1 - -pay_principal_bool_merge@28: - // modules/payment_agent/principal.py:56 - // if self.is_payment_executable(holding_address): - bz pay_principal_else_body@3 - // modules/payment_agent/common.py:30 - // self.settlement_asset_id.balance(Global.current_application_address) - global CurrentApplicationAddress - intc_0 // 0 - bytec 13 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - swap - dig 1 - asset_holding_get AssetBalance - assert // account opted into asset - // modules/payment_agent/common.py:30-31 - // self.settlement_asset_id.balance(Global.current_application_address) - // >= payment_amount - dig 2 - dup - cover 2 - >= - // modules/payment_agent/common.py:29-32 - // assert ( - // self.settlement_asset_id.balance(Global.current_application_address) - // >= payment_amount - // ), err.NOT_ENOUGH_FUNDS - assert // Not enough funds for the payment - // modules/payment_agent/principal.py:59-60 - // # The reference implementation has the same asset for denomination and settlement, no conversion needed - // self.pay(self.account[holding_address].payment_address, payment_amount) - dig 3 - box_get - assert // check self.account entry exists - extract 0 32 - // modules/payment_agent/common.py:35-40 - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=receiver, - // asset_amount=amount, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // modules/payment_agent/common.py:39 - // fee=Global.min_txn_fee, - global MinTxnFee - uncover 2 - itxn_field AssetAmount - swap - itxn_field AssetReceiver - swap - itxn_field XferAsset - // modules/payment_agent/common.py:35 - // itxn.AssetTransfer( - pushint 4 // axfer - itxn_field TypeEnum - itxn_field Fee - // modules/payment_agent/common.py:35-40 - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=receiver, - // asset_amount=amount, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - -pay_principal_after_if_else@4: - // modules/core_financial/common.py:199 - // self.circulating_units -= self.account[holding_address].units - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 2 - dup - cover 2 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - - - bytec_3 // "circulating_units" - swap - app_global_put - // modules/core_financial/common.py:200 - // self.account[holding_address].units = UInt64() - intc_0 // 0 - itob - swap - intc_2 // 32 - dig 2 - box_replace - // modules/core_financial/common.py:201 - // self.end_if_no_circulating_units() - callsub end_if_no_circulating_units - // modules/payment_agent/principal.py:17 - // contract_id=Global.current_application_id.id, - global CurrentApplicationID - // modules/payment_agent/principal.py:20 - // time=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/principal.py:22 - // currency_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 22 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/payment_agent/principal.py:23 - // currency_unit=self.denomination_asset_id.unit_name, - dup - asset_params_get AssetUnitName - assert // asset exists - // modules/payment_agent/principal.py:24 - // nominal_value=self.circulating_units * self.unit_value, - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - * - // modules/payment_agent/principal.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_PR), - // type_name=String("PR"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), - // nominal_accrued=UInt64(0), - // ) - uncover 4 - itob - pushbytes 0x030037 - concat - uncover 4 - itob - concat - dig 5 - itob - swap - dig 1 - concat - uncover 4 - itob - concat - dig 3 - len - itob - extract 6 2 - uncover 4 - concat - swap - pushbytes 0x003b - concat - uncover 3 - itob - concat - // modules/payment_agent/principal.py:25 - // nominal_rate_bps=arc4.UInt16(0), - bytec 30 // 0x0000 - // modules/payment_agent/principal.py:16-27 - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_PR), - // type_name=String("PR"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), - // nominal_accrued=UInt64(0), - // ) - concat - uncover 3 - concat - pushbytes 0x00025052 - concat - swap - concat - // modules/payment_agent/principal.py:15-28 - // arc4.emit( - // Event( - // contract_id=Global.current_application_id.id, - // type=arc4.UInt8(enums.EVT_TYPE_PR), - // type_name=String("PR"), - // time=Global.latest_timestamp, - // payoff=payoff, - // currency_id=self.denomination_asset_id.id, - // currency_unit=self.denomination_asset_id.unit_name, - // nominal_value=self.circulating_units * self.unit_value, - // nominal_rate_bps=arc4.UInt16(0), - // nominal_accrued=UInt64(0), - // ) - // ) - pushbytes 0x8c29904e // method "Event(uint64,uint8,string,uint64,uint64,uint64,byte[],uint64,uint16,uint64)" - swap - concat - log - // modules/payment_agent/principal.py:69 - // timestamp=Global.latest_timestamp, - global LatestTimestamp - // modules/payment_agent/principal.py:67-71 - // return typ.PaymentResult( - // amount=payment_amount, - // timestamp=Global.latest_timestamp, - // context=payment_info, # TODO: Add info on failed payment - // ) - itob - concat - dig 3 - dup - len - itob - extract 6 2 - swap - concat - swap - pushbytes 0x0012 - concat - swap - concat - // modules/payment_agent/principal.py:30 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -pay_principal_else_body@3: - // modules/payment_agent/principal.py:62-63 - // # Accounts suspended or not opted in at the time of payments must not stall the D-ASA - // payment_amount = UInt64() - intc_0 // 0 - bury 1 - b pay_principal_after_if_else@4 - -pay_principal_bool_false@27: - intc_0 // 0 - b pay_principal_bool_merge@28 - -pay_principal_bool_false@20: - intc_0 // 0 - b pay_principal_bool_merge@21 - - -// modules.transfer_agent.no_coupon.NoCouponTransferAgentMixin.asset_transfer[routing]() -> void: -asset_transfer: - intc_0 // 0 - dupn 2 - pushbytes "" - dup - // modules/transfer_agent/no_coupon.py:9 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:153-158 - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - bz asset_transfer_bool_false@6 - // modules/core_financial/common.py:154 - // and self.secondary_market_opening_date <= Global.latest_timestamp - intc_0 // 0 - bytec 16 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - global LatestTimestamp - <= - // modules/core_financial/common.py:153-158 - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - bz asset_transfer_bool_false@6 - // modules/core_financial/common.py:156 - // not self.secondary_market_closure_date - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:156-157 - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - bz asset_transfer_bool_true@5 - // modules/core_financial/common.py:157 - // or Global.latest_timestamp < self.secondary_market_closure_date - global LatestTimestamp - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - < - // modules/core_financial/common.py:156-157 - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - bz asset_transfer_bool_false@6 - -asset_transfer_bool_true@5: - intc_1 // 1 - -asset_transfer_bool_merge@7: - // modules/core_financial/common.py:152-159 - // assert ( - // self.status_is_active() - // and self.secondary_market_opening_date <= Global.latest_timestamp - // and ( - // not self.secondary_market_closure_date - // or Global.latest_timestamp < self.secondary_market_closure_date - // ) - // ), err.SECONDARY_MARKET_CLOSED - assert // Secondary market is closed - // modules/core_financial/common.py:169-171 - // # The reference implementation grants transfer right to D-ASA owners. Other implementations may relay on other - // # roles, external Apps through C2C calls (e.g., an order book), or off-chain transfer agents. - // assert Txn.sender == sender_holding_address, err.UNAUTHORIZED - txn Sender - dig 3 - dup - cover 2 - == - assert // Not authorized - // modules/core_financial/common.py:172 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:173 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 1 - concat - dup - bury 9 - dup - box_len - bury 1 - assert // Invalid account holding address - bytec_1 // 0x52333023 - dig 4 - dup - cover 2 - concat - dup - bury 10 - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/common.py:176 - // self.assert_is_not_account_suspended(sender_holding_address) - dig 3 - callsub assert_is_not_account_suspended - // modules/core_financial/common.py:177 - // self.assert_is_not_account_suspended(receiver_holding_address) - dig 1 - callsub assert_is_not_account_suspended - // modules/core_financial/common.py:190 - // assert sender_holding_address != receiver_holding_address, err.SELF_TRANSFER - uncover 3 - uncover 2 - != - assert // Sender and receiver must be different - // modules/core_financial/common.py:191 - // assert units > 0, err.NULL_TRANSFER - dig 2 - dup - assert // Transfer units must be greater than zero - // modules/core_financial/common.py:192 - // assert units <= self.account[sender_holding_address].units, err.OVER_TRANSFER - uncover 2 - box_get - assert // check self.account entry exists - dup - intc_2 // 32 - extract_uint64 - uncover 2 - >= - assert // Insufficient sender units to transfer - // modules/accounting.py:63 - // sender_unit_value = self.account[sender].unit_value - extract 40 8 - bury 9 - // modules/accounting.py:64 - // if self.account[receiver].units > UInt64(0): - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - bz asset_transfer_else_body@9 - // modules/accounting.py:58 - // self.account[sender].unit_value == self.account[receiver].unit_value - dig 6 - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - dig 6 - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - == - // modules/accounting.py:58-59 - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - bz asset_transfer_bool_false@20 - // modules/accounting.py:59 - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - dig 6 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - dig 6 - box_get - assert // check self.account entry exists - pushint 48 - extract_uint64 - == - // modules/accounting.py:58-59 - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - bz asset_transfer_bool_false@20 - intc_1 // 1 - -asset_transfer_bool_merge@21: - // modules/accounting.py:57-60 - // assert ( - // self.account[sender].unit_value == self.account[receiver].unit_value - // and self.account[sender].paid_coupons == self.account[receiver].paid_coupons - // ), err.NON_FUNGIBLE_UNITS - assert // Sender and receiver units are not fungible - -asset_transfer_after_if_else@10: - // modules/transfer_agent/no_coupon.py:45-46 - // # Transferred units value (must be computed before the transfer) - // sender_unit_value = self.account[sender_holding_address].unit_value - dig 6 - dup - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - bury 5 - // modules/core_financial/no_coupon.py:49 - // return self.accrued_interest_amount(sender_holding_address, units) - dig 3 - dig 2 - dup - cover 2 - callsub accrued_interest_amount - bury 7 - // modules/accounting.py:71 - // assert units <= self.account[holding_address].units, err.OVER_TRANSFER - dig 1 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dup2 - <= - assert // Insufficient sender units to transfer - // modules/accounting.py:72 - // self.account[holding_address].units -= units - swap - - - itob - dig 1 - intc_2 // 32 - uncover 2 - box_replace - // modules/accounting.py:52 - // if self.account[holding_address].units == UInt64(0): - box_get - pop - intc_2 // 32 - extract_uint64 - bnz asset_transfer_after_if_else@16 - // modules/accounting.py:53 - // self.account[holding_address].unit_value = UInt64(0) - intc_0 // 0 - itob - dig 7 - dup - cover 2 - pushint 40 - dig 2 - box_replace - // modules/accounting.py:54 - // self.account[holding_address].paid_coupons = UInt64(0) - pushint 48 - swap - box_replace - -asset_transfer_after_if_else@16: - // modules/accounting.py:76 - // self.account[holding_address].units += units - dig 5 - dup - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - dig 2 - dup - cover 2 - + - itob - uncover 2 - intc_2 // 32 - uncover 2 - box_replace - // modules/transfer_agent/no_coupon.py:52 - // return units * sender_unit_value + accrued_interest - dig 4 - * - dig 5 - + - // modules/transfer_agent/no_coupon.py:9 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -asset_transfer_bool_false@20: - intc_0 // 0 - b asset_transfer_bool_merge@21 - -asset_transfer_else_body@9: - // modules/accounting.py:67 - // self.account[receiver].unit_value = sender_unit_value - dig 5 - dup - pushint 40 - dig 10 - box_replace - // modules/accounting.py:68 - // self.account[receiver].paid_coupons = self.account[sender].paid_coupons - dig 7 - box_get - assert // check self.account entry exists - extract 48 8 - pushint 48 - swap - box_replace - b asset_transfer_after_if_else@10 - -asset_transfer_bool_false@6: - intc_0 // 0 - b asset_transfer_bool_merge@7 - - -// modules.core_financial.common.CoreFinancialCommonMixin.asset_create[routing]() -> void: -asset_create: - // modules/core_financial/common.py:267 - // @arc4.abimethod(create="require") - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - dig 1 - pushint 38 - extract_uint16 // on error: invalid tuple encoding - dup - pushint 40 - == - assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[])) - dig 2 - swap - dig 2 - substring3 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 42 - + - == - assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata - // modules/core_financial/common.py:276 - // self.arranger.value = arranger - bytec 5 // 0x52323023 - uncover 2 - app_global_put - // modules/core_financial/common.py:277 - // self.metadata = metadata.bytes - bytec 23 // "metadata" - swap - app_global_put - // modules/core_financial/common.py:267 - // @arc4.abimethod(create="require") - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.asset_update[routing]() -> void: -asset_update: - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txna ApplicationArgs 1 - dup - len - dig 1 - pushint 38 - extract_uint16 // on error: invalid tuple encoding - dup - pushint 40 - == - assert // invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[])) - dig 2 - swap - dig 2 - substring3 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 42 - + - == - assert // invalid number of bytes for smart_contracts.abi_types.AssetMetadata - // modules/core_financial/common.py:284-287 - // # The reference implementation grants the update permissions to the Arranger. - // # Other implementations may disable D-ASA application updatability or change its authorizations. - // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/core_financial/common.py:288 - // self.metadata = metadata.bytes - bytec 23 // "metadata" - swap - app_global_put - // modules/core_financial/common.py:279 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.set_secondary_time_events[routing]() -> void: -set_secondary_time_events: - intc_0 // 0 - // modules/core_financial/common.py:290 - // @arc4.abimethod - txna ApplicationArgs 1 - dupn 2 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - dup - intc_3 // 8 - * - pushint 2 - + - uncover 2 - len - == - assert // invalid number of bytes for arc4.dynamic_array - // modules/core_financial/common.py:311 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 4 // 200 - == - // modules/core_financial/common.py:312 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/core_financial/common.py:313 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:315 - // assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH - dup - assert // Time events length is invalid - // modules/core_financial/common.py:316 - // if secondary_market_time_events.length > 1: - intc_1 // 1 - > - bz set_secondary_time_events_after_if_else@3 - // modules/core_financial/common.py:317 - // self.assert_time_events_sorted(secondary_market_time_events) - dup - callsub assert_time_events_sorted - bury 1 - -set_secondary_time_events_after_if_else@3: - // modules/core_financial/common.py:320 - // self.issuance_date - intc_0 // 0 - bytec 8 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/common.py:321 - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - dig 1 - dup - extract 2 0 - bury 4 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:320-321 - // self.issuance_date - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - swap - dig 1 - <= - // modules/core_financial/common.py:319-322 - // assert ( - // self.issuance_date - // <= secondary_market_time_events[cfg.SECONDARY_MARKET_OPENING_DATE_IDX] - // ), err.INVALID_SECONDARY_OPENING_DATE - assert // Invalid secondary market opening date - // modules/core_financial/common.py:323 - // self.secondary_market_opening_date = secondary_market_time_events[ - bytec 16 // "secondary_market_opening_date" - // modules/core_financial/common.py:323-325 - // self.secondary_market_opening_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_OPENING_DATE_IDX - // ] - swap - app_global_put - // modules/core_financial/common.py:326 - // if self.maturity_date: - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - bz set_secondary_time_events_after_if_else@5 - // modules/core_financial/common.py:328 - // self.maturity_date - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // modules/core_financial/common.py:329 - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - dig 1 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_3 // 8 - * - dig 3 - swap - extract_uint64 - // modules/core_financial/common.py:328-329 - // self.maturity_date - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - swap - dig 1 - >= - // modules/core_financial/common.py:327-330 - // assert ( - // self.maturity_date - // >= secondary_market_time_events[cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX] - // ), err.INVALID_SECONDARY_CLOSURE_DATE - assert // Invalid secondary market closure date - // modules/core_financial/common.py:331 - // self.secondary_market_closure_date = secondary_market_time_events[ - bytec 9 // "secondary_market_closure_date" - // modules/core_financial/common.py:331-333 - // self.secondary_market_closure_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - // ] - swap - app_global_put - -set_secondary_time_events_after_if_else@5: - // modules/core_financial/common.py:335 - // secondary_market_opening_date=self.secondary_market_opening_date, - intc_0 // 0 - bytec 16 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - // modules/core_financial/common.py:336 - // secondary_market_closure_date=self.secondary_market_closure_date, - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:334-337 - // return typ.SecondaryMarketSchedule( - // secondary_market_opening_date=self.secondary_market_opening_date, - // secondary_market_closure_date=self.secondary_market_closure_date, - // ) - swap - itob - swap - itob - concat - // modules/core_financial/common.py:290 - // @arc4.abimethod - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.set_default_status[routing]() -> void: -set_default_status: - // modules/core_financial/common.py:339 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:74 - // assert self._role_is_active(self.trustee, Txn.sender), err.UNAUTHORIZED - bytec 17 // 0x52363023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/core_financial/common.py:352 - // self.asset_defaulted = defaulted - bytec 21 // "asset_defaulted" - swap - app_global_put - // modules/core_financial/common.py:353 - // return Global.latest_timestamp - global LatestTimestamp - // modules/core_financial/common.py:339 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.primary_distribution[routing]() -> void: -primary_distribution: - pushbytes "" - // modules/core_financial/common.py:355 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_3 // 8 - == - assert // invalid number of bytes for arc4.uint64 - btoi - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:145-148 - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // modules/core_financial/common.py:146 - // and self.primary_distribution_opening_date - intc_0 // 0 - bytec 7 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/common.py:147 - // <= Global.latest_timestamp - global LatestTimestamp - dup - bury 5 - // modules/core_financial/common.py:146-147 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - <= - // modules/core_financial/common.py:146-148 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // modules/core_financial/common.py:148 - // < self.primary_distribution_closure_date - intc_0 // 0 - bytec 24 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // modules/core_financial/common.py:147-148 - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - dig 3 - > - // modules/core_financial/common.py:146-148 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - intc_1 // 1 - -primary_distribution_bool_merge@6: - // modules/core_financial/common.py:144-149 - // assert ( - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - // ), err.PRIMARY_DISTRIBUTION_CLOSED - assert // Primary distribution is closed - // modules/rbac.py:71 - // assert self._role_is_active(self.primary_dealer, Txn.sender), err.UNAUTHORIZED - bytec 18 // 0x52353023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/core_financial/common.py:383 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/core_financial/common.py:384 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/core_financial/common.py:385 - // assert units > 0, err.ZERO_UNITS - dig 1 - dup - assert // Can not distribute zero units - // modules/core_financial/common.py:386 - // assert self.circulating_units + units <= self.total_units, err.OVER_DISTRIBUTION - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 1 - + - intc_0 // 0 - bytec 12 // "total_units" - app_global_get_ex - assert // check self.total_units exists - dig 1 - >= - assert // Insufficient remaining D-ASA units - // modules/core_financial/common.py:388 - // self.circulating_units += units - bytec_3 // "circulating_units" - dig 1 - app_global_put - // modules/core_financial/common.py:389 - // self.account[holding_address].units += units - dig 2 - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - uncover 2 - + - itob - dig 2 - intc_2 // 32 - uncover 2 - box_replace - // modules/core_financial/common.py:390 - // self.account[holding_address].unit_value = self.unit_value - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - itob - uncover 2 - pushint 40 - uncover 2 - box_replace - // modules/core_financial/common.py:391 - // return self.total_units - self.circulating_units - intc_0 // 0 - bytec 12 // "total_units" - app_global_get_ex - assert // check self.total_units exists - swap - - - // modules/core_financial/common.py:355 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -primary_distribution_bool_false@5: - intc_0 // 0 - b primary_distribution_bool_merge@6 - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_asset_info[routing]() -> void: -get_asset_info: - // modules/core_financial/common.py:403 - // performance = UInt64(cst.PRF_PERFORMANT) - intc_0 // 0 - // modules/core_financial/common.py:404 - // if Global.latest_timestamp > self.maturity_date > 0: - global LatestTimestamp - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - swap - dup - cover 2 - cover 3 - assert // check self.maturity_date exists - > - bz get_asset_info_after_if_else@4 - dup - bz get_asset_info_after_if_else@4 - // modules/core_financial/common.py:405 - // performance = UInt64(cst.PRF_MATURED) - pushint 4 - bury 2 - -get_asset_info_after_if_else@4: - // modules/core_financial/common.py:406-407 - // # The reference implementation has no grace or delinquency periods - // if self.asset_defaulted: - intc_0 // 0 - bytec 21 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - bz get_asset_info_after_if_else@6 - // modules/core_financial/common.py:408 - // performance = UInt64(cst.PRF_DEFAULTED) - pushint 3 - bury 2 - -get_asset_info_after_if_else@6: - // modules/core_financial/common.py:411 - // denomination_asset_id=self.denomination_asset_id.id, - intc_0 // 0 - bytec 22 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - // modules/core_financial/common.py:412 - // settlement_asset_id=self.settlement_asset_id.id, - intc_0 // 0 - bytec 13 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // modules/accounting.py:45 - // return self.circulating_units * self.unit_value - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 6 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - dup2 - * - // modules/core_financial/common.py:415 - // day_count_convention=arc4.UInt8(self.day_count_convention), - intc_0 // 0 - bytec 14 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - itob - dup - bitlen - intc_3 // 8 - <= - assert // overflow - extract 7 1 - // modules/core_financial/common.py:416 - // principal_discount=arc4.UInt16(self.principal_discount), - intc_0 // 0 - bytec 15 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - itob - dup - bitlen - pushint 16 - <= - assert // overflow - extract 6 2 - // modules/core_financial/common.py:417 - // interest_rate=arc4.UInt16(self.interest_rate), - intc_0 // 0 - bytec 26 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - itob - dup - bitlen - pushint 16 - <= - assert // overflow - extract 6 2 - // modules/core_financial/common.py:418 - // total_supply=self.total_units, - intc_0 // 0 - bytec 12 // "total_units" - app_global_get_ex - assert // check self.total_units exists - // modules/core_financial/common.py:420 - // primary_distribution_opening_date=self.primary_distribution_opening_date, - intc_0 // 0 - bytec 7 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // modules/core_financial/common.py:421 - // primary_distribution_closure_date=self.primary_distribution_closure_date, - intc_0 // 0 - bytec 24 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // modules/core_financial/common.py:422 - // issuance_date=self.issuance_date, - intc_0 // 0 - bytec 8 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // modules/core_financial/common.py:423 - // maturity_date=self.maturity_date, - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // modules/core_financial/common.py:424 - // suspended=self.asset_suspended, - intc_0 // 0 - bytec 20 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - // modules/core_financial/common.py:425 - // performance=arc4.UInt8(performance), - dig 15 - itob - dup - bitlen - intc_3 // 8 - <= - assert // overflow - extract 7 1 - // modules/core_financial/common.py:410-426 - // return typ.AssetInfo( - // denomination_asset_id=self.denomination_asset_id.id, - // settlement_asset_id=self.settlement_asset_id.id, - // outstanding_principal=self.outstanding_principal(), - // unit_value=self.unit_value, - // day_count_convention=arc4.UInt8(self.day_count_convention), - // principal_discount=arc4.UInt16(self.principal_discount), - // interest_rate=arc4.UInt16(self.interest_rate), - // total_supply=self.total_units, - // circulating_supply=self.circulating_units, - // primary_distribution_opening_date=self.primary_distribution_opening_date, - // primary_distribution_closure_date=self.primary_distribution_closure_date, - // issuance_date=self.issuance_date, - // maturity_date=self.maturity_date, - // suspended=self.asset_suspended, - // performance=arc4.UInt8(performance), - // ) - uncover 14 - itob - uncover 14 - itob - concat - uncover 11 - itob - concat - uncover 11 - itob - concat - uncover 10 - concat - uncover 9 - concat - uncover 8 - concat - uncover 7 - itob - concat - uncover 7 - itob - concat - uncover 6 - itob - concat - uncover 5 - itob - concat - uncover 4 - itob - concat - uncover 3 - itob - concat - bytec 28 // 0x00 - intc_0 // 0 - uncover 4 - setbit - concat - swap - concat - // modules/core_financial/common.py:393 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_time_events[routing]() -> void: -get_time_events: - // modules/core_financial/common.py:436 - // time_events = typ.TimeEvents() - bytec 30 // 0x0000 - // modules/accounting.py:25 - // return self.status == enm.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 - == - // modules/core_financial/common.py:437 - // if self.status_is_active(): - bz get_time_events_after_if_else@3 - // modules/core_financial/common.py:438 - // time_events = self.time_events.value.copy() - bytec 27 // 0x74696d654576656e7473 - box_get - swap - bury 2 - assert // check self.time_events exists - -get_time_events_after_if_else@3: - // modules/core_financial/common.py:428 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - dig 1 - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_secondary_market_schedule[routing]() -> void: -get_secondary_market_schedule: - // modules/core_financial/common.py:450 - // (self.secondary_market_opening_date, self.secondary_market_closure_date) - intc_0 // 0 - bytec 16 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - intc_0 // 0 - bytec 9 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // modules/core_financial/common.py:449-451 - // return typ.TimeEvents( - // (self.secondary_market_opening_date, self.secondary_market_closure_date) - // ) - swap - itob - pushbytes 0x0002 - swap - concat - swap - itob - concat - // modules/core_financial/common.py:441 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.core_financial.common.CoreFinancialCommonMixin.get_asset_metadata[routing]() -> void: -get_asset_metadata: - // modules/core_financial/common.py:462 - // return typ.AssetMetadata.from_bytes(self.metadata) - intc_0 // 0 - bytec 23 // "metadata" - app_global_get_ex - assert // check self.metadata exists - // modules/core_financial/common.py:453 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_gov_suspension[routing]() -> void: -account_gov_suspension: - // modules/accounting.py:94 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 10 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:114 - // self.account[holding_address].suspended = suspended - dup - pushint 56 - intc_1 // 1 - box_extract - intc_0 // 0 - uncover 3 - setbit - pushint 56 - swap - box_replace - // modules/accounting.py:115 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:94 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_open[routing]() -> void: -account_open: - // modules/accounting.py:117 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 11 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:28 - // return self.status == enm.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 4 // 200 - == - // modules/accounting.py:139 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // modules/accounting.py:140 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:141 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:142 - // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - ! - assert // Invalid account holding address - // modules/accounting.py:146 - // units=UInt64(0), - intc_0 // 0 - // modules/accounting.py:144-150 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=UInt64(0), - // unit_value=UInt64(0), - // paid_coupons=UInt64(0), - // suspended=False, - // ) - itob - uncover 2 - dig 1 - concat - dig 1 - concat - swap - concat - bytec 28 // 0x00 - concat - box_put - // modules/accounting.py:151 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:117 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_close[routing]() -> void: -account_close: - // modules/accounting.py:153 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:68 - // assert self._role_is_active(self.account_manager, Txn.sender), err.UNAUTHORIZED - bytec 11 // 0x52343023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/accounting.py:171 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:174 - // closed_units = self.account[holding_address].units - dup - box_get - pop - intc_2 // 32 - extract_uint64 - // modules/accounting.py:175 - // del self.account[holding_address] - swap - box_del - pop - // modules/accounting.py:176 - // self.circulating_units -= closed_units - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 1 - - - bytec_3 // "circulating_units" - swap - app_global_put - // modules/accounting.py:177 - // self.end_if_no_circulating_units() - callsub end_if_no_circulating_units - // modules/accounting.py:178 - // return closed_units, Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:153 - // @arc4.abimethod - swap - itob - swap - itob - concat - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_update_payment_address[routing]() -> void: -account_update_payment_address: - // modules/accounting.py:180 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 2 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:200 - // assert Txn.sender == holding_address, err.UNAUTHORIZED - txn Sender - dig 2 - == - assert // Not authorized - // modules/accounting.py:201 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/accounting.py:202 - // self.assert_is_not_asset_suspended() - callsub assert_is_not_asset_suspended - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - uncover 2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:204 - // self.account[holding_address].payment_address = payment_address - intc_0 // 0 - uncover 2 - box_replace - // modules/accounting.py:205 - // return Global.latest_timestamp - global LatestTimestamp - // modules/accounting.py:180 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.accounting.AccountingModule.account_get_info[routing]() -> void: -account_get_info: - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/accounting.py:31 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec_1 // 0x52333023 - swap - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // modules/accounting.py:222 - // return self.account[holding_address] - box_get - pop - // modules/accounting.py:207 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_rotate_arranger[routing]() -> void: -rbac_rotate_arranger: - // modules/rbac.py:147 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:158 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:159 - // self.arranger.value = new_arranger - bytec 5 // 0x52323023 - swap - app_global_put - // modules/rbac.py:160 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:147 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_set_op_daemon[routing]() -> void: -rbac_set_op_daemon: - // modules/rbac.py:162 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:173 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:174 - // self.op_daemon.value = address - bytec 19 // 0x52323523 - swap - app_global_put - // modules/rbac.py:175 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:162 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_assign_role[routing]() -> void: -rbac_assign_role: - // modules/rbac.py:177 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - txna ApplicationArgs 3 - dup - intc_0 // 0 - extract_uint16 // on error: invalid array length header - pushint 2 - + - dig 1 - len - == - assert // invalid number of bytes for arc4.dynamic_array - extract 2 0 - swap - // modules/rbac.py:199 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:200 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:201 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:101 - // if role_id == UInt64(cst.ROLE_ARRANGER): - pushint 20 - == - bz rbac_assign_role_after_if_else@3 - // modules/rbac.py:102 - // self.arranger.value = role_address - bytec 5 // 0x52323023 - dig 3 - app_global_put - -rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14: - // modules/rbac.py:203 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:177 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_assign_role_after_if_else@3: - // modules/rbac.py:105 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - dup - pushint 40 - == - bz rbac_assign_role_after_if_else@5 - // modules/rbac.py:106 - // assert role_address not in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 11 // 0x52343023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:107 - // self.account_manager[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@5: - // modules/rbac.py:109 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_assign_role_after_if_else@7 - // modules/rbac.py:110 - // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 18 // 0x52353023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:111 - // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@7: - // modules/rbac.py:113 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_assign_role_after_if_else@9 - // modules/rbac.py:114 - // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 17 // 0x52363023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:115 - // self.trustee[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@9: - // modules/rbac.py:117 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_assign_role_after_if_else@11 - // modules/rbac.py:118 - // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec 10 // 0x52373023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:119 - // self.authority[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - // modules/rbac.py:202 - // self._upsert_role(role_id.as_uint64(), role_address, config) - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - -rbac_assign_role_after_if_else@11: - // modules/rbac.py:121 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - // modules/rbac.py:122 - // assert role_address not in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 25 // 0x52383023 - dig 3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // modules/rbac.py:123 - // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes(config) - dig 2 - box_put - b rbac_assign_role_after_inlined_modules.rbac.RbacModule._upsert_role@14 - - -// modules.rbac.RbacModule.rbac_revoke_role[routing]() -> void: -rbac_revoke_role: - // modules/rbac.py:205 - // @arc4.abimethod - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:224 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // modules/rbac.py:225 - // self.assert_is_not_asset_defaulted() - callsub assert_is_not_asset_defaulted - // modules/rbac.py:226 - // self._assert_valid_role(role_id.as_uint64()) - btoi - dupn 2 - callsub _assert_valid_role - // modules/rbac.py:126 - // assert role_id != UInt64(cst.ROLE_ARRANGER), err.INVALID_ROLE - dup - pushint 20 - != - assert // Invalid role identifier - // modules/rbac.py:127 - // if role_id == UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushint 40 - == - bz rbac_revoke_role_after_if_else@3 - // modules/rbac.py:128 - // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 11 // 0x52343023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:129 - // del self.account_manager[role_address] - box_del - pop - -rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12: - // modules/rbac.py:228 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:205 - // @arc4.abimethod - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_revoke_role_after_if_else@3: - // modules/rbac.py:131 - // if role_id == UInt64(cst.ROLE_PRIMARY_DEALER): - dup - pushint 50 - == - bz rbac_revoke_role_after_if_else@5 - // modules/rbac.py:132 - // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 18 // 0x52353023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:133 - // del self.primary_dealer[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@5: - // modules/rbac.py:135 - // if role_id == UInt64(cst.ROLE_TRUSTEE): - dup - pushint 60 - == - bz rbac_revoke_role_after_if_else@7 - // modules/rbac.py:136 - // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 17 // 0x52363023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:137 - // del self.trustee[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@7: - // modules/rbac.py:139 - // if role_id == UInt64(cst.ROLE_AUTHORITY): - dup - pushint 70 - == - bz rbac_revoke_role_after_if_else@9 - // modules/rbac.py:140 - // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec 10 // 0x52373023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:141 - // del self.authority[role_address] - box_del - pop - // modules/rbac.py:227 - // self._delete_role(role_id.as_uint64(), role_address) - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - -rbac_revoke_role_after_if_else@9: - // modules/rbac.py:143 - // if role_id == UInt64(cst.ROLE_INTEREST_ORACLE): - dup - pushint 80 - == - bz rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - // modules/rbac.py:144 - // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 25 // 0x52383023 - dig 2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // modules/rbac.py:145 - // del self.interest_oracle[role_address] - box_del - pop - b rbac_revoke_role_after_inlined_modules.rbac.RbacModule._delete_role@12 - - -// modules.rbac.RbacModule.rbac_gov_asset_suspension[routing]() -> void: -rbac_gov_asset_suspension: - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.bool - intc_0 // 0 - getbit - // modules/rbac.py:77 - // assert self._role_is_active(self.authority, Txn.sender), err.UNAUTHORIZED - bytec 10 // 0x52373023 - txn Sender - callsub _role_is_active - assert // Not authorized - // modules/rbac.py:246 - // self.asset_suspended = suspended - bytec 20 // "asset_suspended" - swap - app_global_put - // modules/rbac.py:247 - // return Global.latest_timestamp - global LatestTimestamp - // modules/rbac.py:230 - // @arc4.abimethod # TODO: Update specs and add test - itob - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_arranger[routing]() -> void: -rbac_get_arranger: - // modules/rbac.py:257 - // return self.arranger.value - intc_0 // 0 - bytec 5 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - // modules/rbac.py:249 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_address_roles[routing]() -> void: -rbac_get_address_roles: - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:273 - // self._role_is_active(self.account_manager, address), - bytec 11 // 0x52343023 - dig 1 - callsub _role_is_active - // modules/rbac.py:274 - // self._role_is_active(self.primary_dealer, address), - bytec 18 // 0x52353023 - dig 2 - callsub _role_is_active - // modules/rbac.py:275 - // self._role_is_active(self.trustee, address), - bytec 17 // 0x52363023 - dig 3 - callsub _role_is_active - // modules/rbac.py:276 - // self._role_is_active(self.authority, address), - bytec 10 // 0x52373023 - dig 4 - callsub _role_is_active - // modules/rbac.py:277 - // self._role_is_active(self.interest_oracle, address), - bytec 25 // 0x52383023 - uncover 5 - callsub _role_is_active - // modules/rbac.py:259 - // @arc4.abimethod(readonly=True) - bytec 28 // 0x00 - intc_0 // 0 - uncover 6 - setbit - intc_1 // 1 - uncover 5 - setbit - pushint 2 - uncover 4 - setbit - pushint 3 - uncover 3 - setbit - pushint 4 - uncover 2 - setbit - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - - -// modules.rbac.RbacModule.rbac_get_role_config[routing]() -> void: -rbac_get_role_config: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - txna ApplicationArgs 1 - dup - len - intc_1 // 1 - == - assert // invalid number of bytes for arc4.uint8 - txna ApplicationArgs 2 - dup - cover 2 - len - intc_2 // 32 - == - assert // invalid number of bytes for arc4.static_array - // modules/rbac.py:294 - // role = role_id.as_uint64() - btoi - // modules/rbac.py:295 - // self._assert_valid_role(role) - dup - callsub _assert_valid_role - // modules/rbac.py:297 - // case UInt64(cst.ROLE_ARRANGER): - pushints 20 40 50 60 70 80 - // modules/rbac.py:296-327 - // match role: - // case UInt64(cst.ROLE_ARRANGER): - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.account_manager[role_address] - // case UInt64(cst.ROLE_PRIMARY_DEALER): - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.primary_dealer[role_address] - // case UInt64(cst.ROLE_TRUSTEE): - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.trustee[role_address] - // case UInt64(cst.ROLE_AUTHORITY): - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.authority[role_address] - // case UInt64(cst.ROLE_INTEREST_ORACLE): - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - // return self.interest_oracle[role_address] - // case _: - // op.err(err.INVALID_ROLE) - uncover 6 - match rbac_get_role_config_switch_case_0@2 rbac_get_role_config_switch_case_1@3 rbac_get_role_config_switch_case_2@4 rbac_get_role_config_switch_case_3@5 rbac_get_role_config_switch_case_4@6 rbac_get_role_config_switch_case_5@7 - // modules/rbac.py:327 - // op.err(err.INVALID_ROLE) - err // Invalid role identifier - -rbac_get_role_config_switch_case_5@7: - // modules/rbac.py:323 - // self.interest_oracle, role_address - bytec 25 // 0x52383023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:322-324 - // assert self._has_role( - // self.interest_oracle, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:325 - // return self.interest_oracle[role_address] - box_get - pop - -rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9: - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -rbac_get_role_config_switch_case_4@6: - // modules/rbac.py:318 - // self.authority, role_address - bytec 10 // 0x52373023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:317-319 - // assert self._has_role( - // self.authority, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:320 - // return self.authority[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_3@5: - // modules/rbac.py:313 - // self.trustee, role_address - bytec 17 // 0x52363023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:312-314 - // assert self._has_role( - // self.trustee, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:315 - // return self.trustee[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_2@4: - // modules/rbac.py:308 - // self.primary_dealer, role_address - bytec 18 // 0x52353023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:307-309 - // assert self._has_role( - // self.primary_dealer, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:310 - // return self.primary_dealer[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_1@3: - // modules/rbac.py:303 - // self.account_manager, role_address - bytec 11 // 0x52343023 - // modules/rbac.py:55 - // return role_address in role_map - dig 1 - concat - dup - box_len - bury 1 - // modules/rbac.py:302-304 - // assert self._has_role( - // self.account_manager, role_address - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // modules/rbac.py:305 - // return self.account_manager[role_address] - box_get - pop - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - -rbac_get_role_config_switch_case_0@2: - // modules/rbac.py:298-300 - // return typ.RoleConfig( - // role_validity_start=UInt64(0), role_validity_end=UInt64(0) - // ) - pushbytes 0x00000000000000000000000000000000 - // modules/rbac.py:280 - // @arc4.abimethod(readonly=True) - b rbac_get_role_config_after_inlined_modules.rbac.RbacModule.rbac_get_role_config@9 - - -// modules.core_financial.no_coupon.NoCouponCashflowMixin.day_count_factor() -> bytes: -day_count_factor: - // modules/core_financial/no_coupon.py:17 - // def day_count_factor(self) -> typ.DayCountFactor: - proto 0 1 - // modules/core_financial/no_coupon.py:18-19 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // accrued_period = Global.latest_timestamp - self.issuance_date - global LatestTimestamp - intc_0 // 0 - bytec 8 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - swap - dig 1 - - - swap - // modules/core_financial/no_coupon.py:20 - // principal_period = self.maturity_date - self.issuance_date - intc_0 // 0 - bytec 4 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - swap - - - // modules/core_financial/no_coupon.py:21 - // if self.day_count_convention == UInt64(cst.DCC_A_A): - intc_0 // 0 - bytec 14 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - bnz day_count_factor_after_if_else@2 - // modules/core_financial/common.py:162 - // return time_period // UInt64(cst.DAY_2_SEC) - frame_dig 0 - intc 5 // 86400 - / - frame_bury 0 - intc 5 // 86400 - / - -day_count_factor_after_if_else@2: - // modules/core_financial/no_coupon.py:24-27 - // return typ.DayCountFactor( - // numerator=accrued_period, - // denominator=principal_period, - // ) - frame_dig 0 - itob - swap - itob - concat - swap - retsub - - -// modules.core_financial.no_coupon.NoCouponCashflowMixin.accrued_interest_amount(holding_address: bytes, units: uint64) -> uint64: -accrued_interest_amount: - // modules/core_financial/no_coupon.py:33-35 - // def accrued_interest_amount( - // self, holding_address: Account, units: UInt64 - // ) -> UInt64: - proto 2 1 - // modules/core_financial/no_coupon.py:36 - // day_count_factor = self.day_count_factor() - callsub day_count_factor - // modules/core_financial/no_coupon.py:37 - // accrued_period = day_count_factor.numerator - dup - intc_0 // 0 - extract_uint64 - // modules/core_financial/no_coupon.py:38 - // principal_period = day_count_factor.denominator - swap - intc_3 // 8 - extract_uint64 - // modules/core_financial/no_coupon.py:40 - // self.account_units_value(holding_address, units) - frame_dig -2 - frame_dig -1 - callsub account_units_value - // modules/core_financial/no_coupon.py:41 - // * self.principal_discount - intc_0 // 0 - bytec 15 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - // modules/core_financial/no_coupon.py:40-41 - // self.account_units_value(holding_address, units) - // * self.principal_discount - * - // modules/core_financial/no_coupon.py:40-42 - // self.account_units_value(holding_address, units) - // * self.principal_discount - // * accrued_period - uncover 2 - * - // modules/core_financial/no_coupon.py:43 - // // (cst.BPS * principal_period) - pushint 10000 - uncover 2 - * - // modules/core_financial/no_coupon.py:40-43 - // self.account_units_value(holding_address, units) - // * self.principal_discount - // * accrued_period - // // (cst.BPS * principal_period) - / - // modules/core_financial/no_coupon.py:39-44 - // return ( - // self.account_units_value(holding_address, units) - // * self.principal_discount - // * accrued_period - // // (cst.BPS * principal_period) - // ) # div-by-zero: principal_period != 0 due to assert_time_events_sorted checks - retsub - - -// modules.core_financial.common.CoreFinancialCommonMixin.assert_time_events_sorted(time_events: bytes) -> bytes: -assert_time_events_sorted: - // modules/core_financial/common.py:107 - // def assert_time_events_sorted(self, time_events: typ.TimeEvents) -> None: - proto 1 1 - pushbytes "" - dupn 2 - // modules/core_financial/common.py:109 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - frame_dig -1 - extract 2 0 - frame_dig -1 - pushint 2 - extract_uint64 - // modules/core_financial/common.py:110 - // > Global.latest_timestamp - global LatestTimestamp - // modules/core_financial/common.py:109-110 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - // > Global.latest_timestamp - > - // modules/core_financial/common.py:108-111 - // assert ( - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - // > Global.latest_timestamp - // ), err.INVALID_TIME - assert // Time events must be set in the future - // modules/core_financial/common.py:112 - // for idx in urange(time_events.length - 1): - frame_dig -1 - intc_0 // 0 - extract_uint16 // on error: invalid array length header - intc_1 // 1 - - - intc_0 // 0 - -assert_time_events_sorted_for_header@1: - // modules/core_financial/common.py:112 - // for idx in urange(time_events.length - 1): - frame_dig 5 - frame_dig 4 - < - bz assert_time_events_sorted_after_for@6 - -assert_time_events_sorted_while_top@8: - pushint 75 - global OpcodeBudget - > - bz assert_time_events_sorted_after_while@13 - itxn_begin - pushint 6 // appl - itxn_field TypeEnum - pushint 5 // DeleteApplication - itxn_field OnCompletion - bytec 31 // 0x068101 - itxn_field ApprovalProgram - bytec 31 // 0x068101 - itxn_field ClearStateProgram - global MinTxnFee - itxn_field Fee - itxn_submit - b assert_time_events_sorted_while_top@8 - -assert_time_events_sorted_after_while@13: - // modules/core_financial/common.py:117 - // time_i = time_events[idx] - frame_dig 5 - dup - intc_3 // 8 - * - frame_dig 3 - dup - cover 3 - swap - extract_uint64 - dup - cover 3 - frame_bury 1 - // modules/core_financial/common.py:118 - // time_f = time_events[idx + 1] - intc_1 // 1 - + - dup - frame_bury 2 - intc_3 // 8 - * - extract_uint64 - dup - frame_bury 0 - // modules/core_financial/common.py:119 - // assert time_f > time_i, err.INVALID_SORTING - < - assert // Time events must be sorted in strictly ascending order - // modules/core_financial/common.py:120 - // if self.day_count_convention != UInt64(cst.DCC_CONT): - intc_0 // 0 - bytec 14 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - pushint 255 - != - bz assert_time_events_sorted_after_if_else@4 - // modules/core_financial/common.py:121-122 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - frame_dig 0 - frame_dig 1 - - - // modules/core_financial/common.py:121-124 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - // cst.DAY_2_SEC - // ) == 0, err.INVALID_TIME_PERIOD - intc 5 // 86400 - % - ! - assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds) - -assert_time_events_sorted_after_if_else@4: - frame_dig 2 - frame_bury 5 - b assert_time_events_sorted_for_header@1 - -assert_time_events_sorted_after_for@6: - frame_dig -1 - frame_bury 0 - retsub - - -// modules.accounting.AccountingModule.assert_is_not_account_suspended(holding_address: bytes) -> void: -assert_is_not_account_suspended: - // modules/accounting.py:33 - // def assert_is_not_account_suspended(self, holding_address: Account) -> None: - proto 1 0 - // modules/accounting.py:34 - // assert not self.account[holding_address].suspended, err.SUSPENDED - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - pushint 448 - getbit - ! - assert // Suspended operations - retsub - - -// modules.accounting.AccountingModule.account_units_value(holding_address: bytes, units: uint64) -> uint64: -account_units_value: - // modules/accounting.py:36 - // def account_units_value(self, holding_address: Account, units: UInt64) -> UInt64: - proto 2 1 - // modules/accounting.py:37 - // return units * self.account[holding_address].unit_value - bytec_1 // 0x52333023 - frame_dig -2 - concat - box_get - assert // check self.account entry exists - pushint 40 - extract_uint64 - frame_dig -1 - * - retsub - - -// modules.accounting.AccountingModule.account_total_units_value(holding_address: bytes) -> uint64: -account_total_units_value: - // modules/accounting.py:39 - // def account_total_units_value(self, holding_address: Account) -> UInt64: - proto 1 1 - // modules/accounting.py:41 - // holding_address, self.account[holding_address].units - bytec_1 // 0x52333023 - frame_dig -1 - concat - box_get - assert // check self.account entry exists - intc_2 // 32 - extract_uint64 - // modules/accounting.py:40-42 - // return self.account_units_value( - // holding_address, self.account[holding_address].units - // ) - frame_dig -1 - swap - callsub account_units_value - retsub - - -// modules.accounting.AccountingModule.end_if_no_circulating_units() -> void: -end_if_no_circulating_units: - // modules/accounting.py:48 - // if self.circulating_units == UInt64(0): - intc_0 // 0 - bytec_3 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - bnz end_if_no_circulating_units_after_if_else@2 - // modules/accounting.py:49 - // self.status = UInt64(enm.STATUS_ENDED) - bytec_2 // "status" - intc 4 // 200 - app_global_put - -end_if_no_circulating_units_after_if_else@2: - retsub - - -// modules.rbac.RbacModule._role_is_active(role_map: bytes, role_address: bytes) -> uint64: -_role_is_active: - // modules/rbac.py:57 - // def _role_is_active(self, role_map: typ.RbacRole, role_address: Account) -> bool: - proto 2 1 - pushbytes "" - // modules/rbac.py:55 - // return role_address in role_map - frame_dig -2 - frame_dig -1 - concat - dup - box_len - bury 1 - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - bz _role_is_active_bool_false@4 - // modules/rbac.py:59 - // role_map[role_address].role_validity_start - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_0 // 0 - extract_uint64 - // modules/rbac.py:60 - // <= Global.latest_timestamp - global LatestTimestamp - dup - frame_bury 0 - // modules/rbac.py:59-60 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - <= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - // modules/rbac.py:61 - // <= role_map[role_address].role_validity_end - frame_dig 1 - box_get - assert // check BoxMap entry exists - intc_3 // 8 - extract_uint64 - // modules/rbac.py:60-61 - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - frame_dig 0 - >= - // modules/rbac.py:59-61 - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - bz _role_is_active_bool_false@4 - intc_1 // 1 - -_role_is_active_bool_merge@5: - // modules/rbac.py:58-62 - // return self._has_role(role_map, role_address) and ( - // role_map[role_address].role_validity_start - // <= Global.latest_timestamp - // <= role_map[role_address].role_validity_end - // ) - frame_bury 0 - retsub - -_role_is_active_bool_false@4: - intc_0 // 0 - b _role_is_active_bool_merge@5 - - -// modules.rbac.RbacModule.assert_caller_is_arranger() -> void: -assert_caller_is_arranger: - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - txn Sender - // modules/rbac.py:52 - // return role_address == self.arranger.value - intc_0 // 0 - bytec 5 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - == - // modules/rbac.py:65 - // assert self._is_arranger(Txn.sender), err.UNAUTHORIZED - assert // Not authorized - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_defaulted() -> void: -assert_is_not_asset_defaulted: - // modules/rbac.py:83 - // assert not self.asset_defaulted, err.DEFAULTED - intc_0 // 0 - bytec 21 // "asset_defaulted" - app_global_get_ex - assert // check self.asset_defaulted exists - ! - assert // Defaulted - retsub - - -// modules.rbac.RbacModule.assert_is_not_asset_suspended() -> void: -assert_is_not_asset_suspended: - // modules/rbac.py:86 - // assert not self.asset_suspended, err.SUSPENDED - intc_0 // 0 - bytec 20 // "asset_suspended" - app_global_get_ex - assert // check self.asset_suspended exists - ! - assert // Suspended operations - retsub - - -// modules.rbac.RbacModule._assert_valid_role(role_id: uint64) -> void: -_assert_valid_role: - // modules/rbac.py:88 - // def _assert_valid_role(self, role_id: UInt64) -> None: - proto 1 0 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - frame_dig -1 - // modules/rbac.py:90 - // UInt64(cst.ROLE_ARRANGER), - pushint 20 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:91 - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - pushint 40 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:92 - // UInt64(cst.ROLE_PRIMARY_DEALER), - pushint 50 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:93 - // UInt64(cst.ROLE_TRUSTEE), - pushint 60 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:94 - // UInt64(cst.ROLE_AUTHORITY), - pushint 70 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz _assert_valid_role_bool_true@6 - frame_dig -1 - // modules/rbac.py:95 - // UInt64(cst.ROLE_INTEREST_ORACLE), - pushint 80 - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bz _assert_valid_role_bool_false@7 - -_assert_valid_role_bool_true@6: - intc_1 // 1 - -_assert_valid_role_bool_merge@8: - // modules/rbac.py:89-96 - // assert role_id in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - assert // Invalid role identifier - retsub - -_assert_valid_role_bool_false@7: - intc_0 // 0 - b _assert_valid_role_bool_merge@8 diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json deleted file mode 100644 index ec1ff365..00000000 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json +++ /dev/null @@ -1,1835 +0,0 @@ -{ - "name": "ZeroCouponBond", - "structs": { - "AccountInfo": [ - { - "name": "payment_address", - "type": "address" - }, - { - "name": "units", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "paid_coupons", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - } - ], - "AssetInfo": [ - { - "name": "denomination_asset_id", - "type": "uint64" - }, - { - "name": "settlement_asset_id", - "type": "uint64" - }, - { - "name": "outstanding_principal", - "type": "uint64" - }, - { - "name": "unit_value", - "type": "uint64" - }, - { - "name": "day_count_convention", - "type": "uint8" - }, - { - "name": "principal_discount", - "type": "uint16" - }, - { - "name": "interest_rate", - "type": "uint16" - }, - { - "name": "total_supply", - "type": "uint64" - }, - { - "name": "circulating_supply", - "type": "uint64" - }, - { - "name": "primary_distribution_opening_date", - "type": "uint64" - }, - { - "name": "primary_distribution_closure_date", - "type": "uint64" - }, - { - "name": "issuance_date", - "type": "uint64" - }, - { - "name": "maturity_date", - "type": "uint64" - }, - { - "name": "suspended", - "type": "bool" - }, - { - "name": "performance", - "type": "uint8" - } - ], - "AssetMetadata": [ - { - "name": "contract_type", - "type": "uint8" - }, - { - "name": "calendar", - "type": "uint8" - }, - { - "name": "business_day_convention", - "type": "uint8" - }, - { - "name": "end_of_month_convention", - "type": "uint8" - }, - { - "name": "prepayment_effect", - "type": "uint8" - }, - { - "name": "penalty_type", - "type": "uint8" - }, - { - "name": "prospectus_hash", - "type": "byte[32]" - }, - { - "name": "prospectus_url", - "type": "string" - } - ], - "CurrentUnitsValue": [ - { - "name": "units_value", - "type": "uint64" - }, - { - "name": "accrued_interest", - "type": "uint64" - }, - { - "name": "day_count_factor", - "type": "DayCountFactor" - } - ], - "DayCountFactor": [ - { - "name": "numerator", - "type": "uint64" - }, - { - "name": "denominator", - "type": "uint64" - } - ], - "PaymentAmounts": [ - { - "name": "interest", - "type": "uint64" - }, - { - "name": "principal", - "type": "uint64" - } - ], - "PaymentResult": [ - { - "name": "amount", - "type": "uint64" - }, - { - "name": "timestamp", - "type": "uint64" - }, - { - "name": "context", - "type": "byte[]" - } - ], - "RoleConfig": [ - { - "name": "role_validity_start", - "type": "uint64" - }, - { - "name": "role_validity_end", - "type": "uint64" - } - ], - "SecondaryMarketSchedule": [ - { - "name": "secondary_market_opening_date", - "type": "uint64" - }, - { - "name": "secondary_market_closure_date", - "type": "uint64" - } - ] - }, - "methods": [ - { - "name": "asset_config", - "args": [ - { - "type": "uint64", - "name": "denomination_asset_id", - "desc": "Denomination asset identifier" - }, - { - "type": "uint64", - "name": "settlement_asset_id", - "desc": "Settlement asset identifier" - }, - { - "type": "uint64", - "name": "principal", - "desc": "Principal, expressed in denomination asset" - }, - { - "type": "uint64", - "name": "principal_discount", - "desc": "Principal discount in bps" - }, - { - "type": "uint64", - "name": "minimum_denomination", - "desc": "Minimum denomination, expressed in denomination asset" - }, - { - "type": "uint8", - "name": "day_count_convention", - "desc": "Day-count convention for interests calculation" - }, - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rate in bps" - }, - { - "type": "uint16[]", - "name": "coupon_rates", - "desc": "Coupon interest rates in bps" - }, - { - "type": "uint64[]", - "name": "time_events", - "desc": "Time events (strictly ascending order)" - }, - { - "type": "(uint64,uint64)[]", - "name": "time_periods", - "desc": "Time periods of recurring time events" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Configure the Debt Algorand Standard Application", - "events": [], - "recommendations": {} - }, - { - "name": "get_account_units_current_value", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Account's units for the current value calculation" - } - ], - "returns": { - "type": "(uint64,uint64,(uint64,uint64))", - "struct": "CurrentUnitsValue", - "desc": "Units current value in denomination asset, Accrued interest in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account's units current value and accrued interest", - "events": [], - "recommendations": {} - }, - { - "name": "get_payment_amount", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "PaymentAmounts", - "desc": "Interest amount in denomination asset, Principal amount in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get the next payment amount", - "events": [], - "recommendations": {} - }, - { - "name": "pay_principal", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "byte[]", - "name": "payment_info", - "desc": "Additional payment information (Optional)" - } - ], - "returns": { - "type": "(uint64,uint64,byte[])", - "struct": "PaymentResult", - "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Pay the outstanding principal to an account", - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "recommendations": {} - }, - { - "name": "asset_transfer", - "args": [ - { - "type": "address", - "name": "sender_holding_address", - "desc": "Sender Account Holding Address" - }, - { - "type": "address", - "name": "receiver_holding_address", - "desc": "Receiver Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to transfer" - } - ], - "returns": { - "type": "uint64", - "desc": "Transferred actualized value in denomination asset" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Transfer D-ASA units between accounts", - "events": [], - "recommendations": {} - }, - { - "name": "asset_create", - "args": [ - { - "type": "address", - "name": "arranger", - "desc": "D-ASA Arranger Address" - }, - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "name": "metadata", - "desc": "D-ASA metadata" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [ - "NoOp" - ], - "call": [] - }, - "readonly": false, - "desc": "Create a new D-ASA", - "events": [], - "recommendations": {} - }, - { - "name": "asset_update", - "args": [ - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "name": "metadata" - } - ], - "returns": { - "type": "void" - }, - "actions": { - "create": [], - "call": [ - "UpdateApplication" - ] - }, - "readonly": false, - "desc": "Update D-ASA application.", - "events": [], - "recommendations": {} - }, - { - "name": "set_secondary_time_events", - "args": [ - { - "type": "uint64[]", - "name": "secondary_market_time_events", - "desc": "Secondary market time events (strictly ascending order)" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "SecondaryMarketSchedule", - "desc": "Secondary Market Opening Date, Secondary Market Closure Date" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set secondary market time schedule", - "events": [], - "recommendations": {} - }, - { - "name": "set_default_status", - "args": [ - { - "type": "bool", - "name": "defaulted", - "desc": "Default status" - } - ], - "returns": { - "type": "uint64" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set D-ASA default status", - "events": [], - "recommendations": {} - }, - { - "name": "primary_distribution", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to distribute" - } - ], - "returns": { - "type": "uint64", - "desc": "Remaining D-ASA units to be distributed" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Distribute D-ASA units to accounts according the primary market", - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_info", - "args": [], - "returns": { - "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "struct": "AssetInfo", - "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA info", - "events": [], - "recommendations": {} - }, - { - "name": "get_time_events", - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Time events" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA time events", - "events": [], - "recommendations": {} - }, - { - "name": "get_secondary_market_schedule", - "args": [], - "returns": { - "type": "uint64[]", - "desc": "Secondary market schedule" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get secondary market schedule", - "events": [], - "recommendations": {} - }, - { - "name": "get_asset_metadata", - "args": [], - "returns": { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "struct": "AssetMetadata", - "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get D-ASA metadata", - "events": [], - "recommendations": {} - }, - { - "name": "account_gov_suspension", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set account suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set account suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "account_open", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account opening" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Open D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_close", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "desc": "Closed units, Timestamp of the account closing" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Close D-ASA account", - "events": [], - "recommendations": {} - }, - { - "name": "account_update_payment_address", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the account update" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Update the Payment Address of an account", - "events": [], - "recommendations": {} - }, - { - "name": "account_get_info", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "returns": { - "type": "(address,uint64,uint64,uint64,bool)", - "struct": "AccountInfo", - "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get account info", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_rotate_arranger", - "args": [ - { - "type": "address", - "name": "new_arranger", - "desc": "New Arranger address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Rotate the Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_set_op_daemon", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Operation Daemon address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Non-Normative: Set the Operation Daemon address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_assign_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Assign a role to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_revoke_role", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the role revocation" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Revoke a role from an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_gov_asset_suspension", - "args": [ - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "returns": { - "type": "uint64", - "desc": "Timestamp of the set asset suspension status" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": false, - "desc": "Set asset suspension status", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_arranger", - "args": [], - "returns": { - "type": "address", - "desc": "Arranger address" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get Arranger address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_address_roles", - "args": [ - { - "type": "address", - "name": "address", - "desc": "Address to get roles for" - } - ], - "returns": { - "type": "(bool,bool,bool,bool,bool)", - "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Non-normative - Get roles assigned to an address", - "events": [], - "recommendations": {} - }, - { - "name": "rbac_get_role_config", - "args": [ - { - "type": "uint8", - "name": "role_id", - "desc": "Role Identifier" - }, - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - } - ], - "returns": { - "type": "(uint64,uint64)", - "struct": "RoleConfig", - "desc": "Role configuration" - }, - "actions": { - "create": [], - "call": [ - "NoOp" - ] - }, - "readonly": true, - "desc": "Get role configuration", - "events": [], - "recommendations": {} - } - ], - "arcs": [ - 22, - 28 - ], - "networks": {}, - "state": { - "schema": { - "global": { - "ints": 18, - "bytes": 3 - }, - "local": { - "ints": 0, - "bytes": 0 - } - }, - "keys": { - "global": { - "arranger": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjIwIw==" - }, - "op_daemon": { - "keyType": "AVMBytes", - "valueType": "address", - "key": "UjI1Iw==" - }, - "asset_suspended": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfc3VzcGVuZGVk" - }, - "asset_defaulted": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "YXNzZXRfZGVmYXVsdGVk" - }, - "total_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfdW5pdHM=" - }, - "circulating_units": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "Y2lyY3VsYXRpbmdfdW5pdHM=" - }, - "unit_value": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dW5pdF92YWx1ZQ==" - }, - "status": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c3RhdHVz" - }, - "denomination_asset_id": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk" - }, - "settlement_asset_id": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2V0dGxlbWVudF9hc3NldF9pZA==" - }, - "day_count_convention": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=" - }, - "metadata": { - "keyType": "AVMString", - "valueType": "AVMBytes", - "key": "bWV0YWRhdGE=" - }, - "principal_discount": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbmNpcGFsX2Rpc2NvdW50" - }, - "interest_rate": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "aW50ZXJlc3RfcmF0ZQ==" - }, - "total_coupons": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "dG90YWxfY291cG9ucw==" - }, - "primary_distribution_opening_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl" - }, - "primary_distribution_closure_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl" - }, - "issuance_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "aXNzdWFuY2VfZGF0ZQ==" - }, - "secondary_market_opening_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=" - }, - "secondary_market_closure_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=" - }, - "maturity_date": { - "keyType": "AVMString", - "valueType": "AVMUint64", - "key": "bWF0dXJpdHlfZGF0ZQ==" - } - }, - "local": {}, - "box": { - "time_events": { - "keyType": "AVMBytes", - "valueType": "uint64[]", - "key": "dGltZUV2ZW50cw==" - } - } - }, - "maps": { - "global": {}, - "local": {}, - "box": { - "account_manager": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjQwIw==" - }, - "primary_dealer": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjUwIw==" - }, - "trustee": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjYwIw==" - }, - "authority": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjcwIw==" - }, - "interest_oracle": { - "keyType": "address", - "valueType": "RoleConfig", - "prefix": "UjgwIw==" - }, - "account": { - "keyType": "address", - "valueType": "AccountInfo", - "prefix": "UjMwIw==" - } - } - } - }, - "bareActions": { - "create": [], - "call": [] - }, - "sourceInfo": { - "approval": { - "sourceInfo": [ - { - "pc": [ - 2349 - ], - "errorMessage": "Can not distribute zero units" - }, - { - "pc": [ - 1015 - ], - "errorMessage": "Coupon rates are not properly defined" - }, - { - "pc": [ - 910 - ], - "errorMessage": "D-ASA already configured" - }, - { - "pc": [ - 3950 - ], - "errorMessage": "Defaulted" - }, - { - "pc": [ - 917 - ], - "errorMessage": "Denomination asset is not properly set" - }, - { - "pc": [ - 928 - ], - "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" - }, - { - "pc": [ - 2365 - ], - "errorMessage": "Insufficient remaining D-ASA units" - }, - { - "pc": [ - 1848, - 1929 - ], - "errorMessage": "Insufficient sender units to transfer" - }, - { - "pc": [ - 1006 - ], - "errorMessage": "Interest rate is not properly defined" - }, - { - "pc": [ - 1152, - 1316, - 1399, - 1802, - 1817, - 2339, - 2722, - 2793, - 2845, - 2916, - 2945 - ], - "errorMessage": "Invalid account holding address" - }, - { - "pc": [ - 3087, - 3111, - 3135, - 3159, - 3183, - 3240, - 3268, - 3290, - 3312, - 3334, - 3513, - 3531, - 3546, - 3561, - 3576 - ], - "errorMessage": "Invalid account role address" - }, - { - "pc": [ - 1170 - ], - "errorMessage": "Invalid amount of units for the account" - }, - { - "pc": [ - 995 - ], - "errorMessage": "Invalid day-count convention ID" - }, - { - "pc": [ - 3224, - 3503, - 4012 - ], - "errorMessage": "Invalid role identifier" - }, - { - "pc": [ - 2210 - ], - "errorMessage": "Invalid secondary market closure date" - }, - { - "pc": [ - 2176 - ], - "errorMessage": "Invalid secondary market opening date" - }, - { - "pc": [ - 961 - ], - "errorMessage": "Minimum denomination is not a divisor of principal" - }, - { - "pc": [ - 1404 - ], - "errorMessage": "No D-ASA units" - }, - { - "pc": [ - 1381, - 1461, - 1784, - 2139, - 2253, - 2330, - 2713, - 2768, - 2777, - 2834, - 2901, - 3357, - 3942 - ], - "errorMessage": "Not authorized" - }, - { - "pc": [ - 1515 - ], - "errorMessage": "Not enough funds for the payment" - }, - { - "pc": [ - 1413 - ], - "errorMessage": "Not mature" - }, - { - "pc": [ - 2322 - ], - "errorMessage": "Primary distribution is closed" - }, - { - "pc": [ - 1141 - ], - "errorMessage": "Primary distribution not yet executed" - }, - { - "pc": [ - 1775 - ], - "errorMessage": "Secondary market is closed" - }, - { - "pc": [ - 1833 - ], - "errorMessage": "Sender and receiver must be different" - }, - { - "pc": [ - 1898 - ], - "errorMessage": "Sender and receiver units are not fungible" - }, - { - "pc": [ - 3834, - 3958 - ], - "errorMessage": "Suspended operations" - }, - { - "pc": [ - 1027, - 2144 - ], - "errorMessage": "Time events length is invalid" - }, - { - "pc": [ - 3707 - ], - "errorMessage": "Time events must be set in the future" - }, - { - "pc": [ - 3785 - ], - "errorMessage": "Time events must be sorted in strictly ascending order" - }, - { - "pc": [ - 1088 - ], - "errorMessage": "Time periods are not properly defined" - }, - { - "pc": [ - 3807 - ], - "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" - }, - { - "pc": [ - 1837 - ], - "errorMessage": "Transfer units must be greater than zero" - }, - { - "pc": [ - 533 - ], - "errorMessage": "Wrong Global Bytes allocation" - }, - { - "pc": [ - 539 - ], - "errorMessage": "Wrong Global UInts allocation" - }, - { - "pc": [ - 543 - ], - "errorMessage": "Wrong Local Bytes allocation" - }, - { - "pc": [ - 547 - ], - "errorMessage": "Wrong Local UInts allocation" - }, - { - "pc": [ - 1508 - ], - "errorMessage": "account opted into asset" - }, - { - "pc": [ - 1582 - ], - "errorMessage": "asset exists" - }, - { - "pc": [ - 3902, - 3917 - ], - "errorMessage": "check BoxMap entry exists" - }, - { - "pc": [ - 1160, - 1452, - 1465, - 1484, - 1519, - 1553, - 1841, - 1855, - 1864, - 1871, - 1882, - 1889, - 1903, - 1924, - 1966, - 2010, - 2373, - 3828, - 3844, - 3860 - ], - "errorMessage": "check self.account entry exists" - }, - { - "pc": [ - 3375, - 3940 - ], - "errorMessage": "check self.arranger exists" - }, - { - "pc": [ - 2447, - 3948 - ], - "errorMessage": "check self.asset_defaulted exists" - }, - { - "pc": [ - 2549, - 3956 - ], - "errorMessage": "check self.asset_suspended exists" - }, - { - "pc": [ - 1546, - 1586, - 2353, - 2468, - 2857, - 3873 - ], - "errorMessage": "check self.circulating_units exists" - }, - { - "pc": [ - 2480, - 3629, - 3790 - ], - "errorMessage": "check self.day_count_convention exists" - }, - { - "pc": [ - 1578, - 2459 - ], - "errorMessage": "check self.denomination_asset_id exists" - }, - { - "pc": [ - 2509 - ], - "errorMessage": "check self.interest_rate exists" - }, - { - "pc": [ - 1206, - 2160, - 2539, - 3612 - ], - "errorMessage": "check self.issuance_date exists" - }, - { - "pc": [ - 1220, - 1258, - 1411, - 2185, - 2193, - 2430, - 2544, - 3622 - ], - "errorMessage": "check self.maturity_date exists" - }, - { - "pc": [ - 2681 - ], - "errorMessage": "check self.metadata exists" - }, - { - "pc": [ - 1421, - 1434 - ], - "errorMessage": "check self.op_daemon exists" - }, - { - "pc": [ - 2314, - 2534 - ], - "errorMessage": "check self.primary_distribution_closure_date exists" - }, - { - "pc": [ - 1125, - 1135, - 2300, - 2529 - ], - "errorMessage": "check self.primary_distribution_opening_date exists" - }, - { - "pc": [ - 1182, - 2494, - 3674 - ], - "errorMessage": "check self.principal_discount exists" - }, - { - "pc": [ - 1759, - 1769, - 2224, - 2659 - ], - "errorMessage": "check self.secondary_market_closure_date exists" - }, - { - "pc": [ - 1748, - 2219, - 2654 - ], - "errorMessage": "check self.secondary_market_opening_date exists" - }, - { - "pc": [ - 1473, - 1502, - 2464 - ], - "errorMessage": "check self.settlement_asset_id exists" - }, - { - "pc": [ - 908, - 1321, - 1377, - 1737, - 2134, - 2289, - 2629, - 2772 - ], - "errorMessage": "check self.status exists" - }, - { - "pc": [ - 2642 - ], - "errorMessage": "check self.time_events exists" - }, - { - "pc": [ - 2361, - 2403, - 2524 - ], - "errorMessage": "check self.total_units exists" - }, - { - "pc": [ - 1591, - 2390, - 2473 - ], - "errorMessage": "check self.unit_value exists" - }, - { - "pc": [ - 848, - 870, - 888, - 1075, - 1361, - 2055, - 2094, - 2116, - 2197, - 3025, - 3711 - ], - "errorMessage": "invalid array length header" - }, - { - "pc": [ - 2243, - 2703, - 3347 - ], - "errorMessage": "invalid number of bytes for arc4.bool" - }, - { - "pc": [ - 861 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1369, - 3033 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 901 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array>" - }, - { - "pc": [ - 882, - 2127 - ], - "errorMessage": "invalid number of bytes for arc4.dynamic_array" - }, - { - "pc": [ - 1111, - 1309, - 1355, - 1716, - 1724, - 2032, - 2276, - 2695, - 2752, - 2760, - 2826, - 2887, - 2895, - 2937, - 2961, - 2985, - 3019, - 3207, - 3389, - 3473 - ], - "errorMessage": "invalid number of bytes for arc4.static_array" - }, - { - "pc": [ - 842 - ], - "errorMessage": "invalid number of bytes for arc4.uint16" - }, - { - "pc": [ - 786, - 795, - 804, - 813, - 822, - 1119, - 1732, - 2284 - ], - "errorMessage": "invalid number of bytes for arc4.uint64" - }, - { - "pc": [ - 831, - 3009, - 3197, - 3463 - ], - "errorMessage": "invalid number of bytes for arc4.uint8" - }, - { - "pc": [ - 2060, - 2099 - ], - "errorMessage": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata" - }, - { - "pc": [ - 2047, - 2086 - ], - "errorMessage": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))" - }, - { - "pc": [ - 2042, - 2081 - ], - "errorMessage": "invalid tuple encoding" - }, - { - "pc": [ - 2486, - 2501, - 2516, - 2557 - ], - "errorMessage": "overflow" - } - ], - "pcOffsetMethod": "none" - }, - "clear": { - "sourceInfo": [], - "pcOffsetMethod": "none" - } - }, - "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgOCAyMDAgODY0MDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzMzMDIzICJzdGF0dXMiICJjaXJjdWxhdGluZ191bml0cyIgIm1hdHVyaXR5X2RhdGUiIDB4NTIzMjMwMjMgInVuaXRfdmFsdWUiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiICJpc3N1YW5jZV9kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiIDB4NTIzNzMwMjMgMHg1MjM0MzAyMyAidG90YWxfdW5pdHMiICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJwcmluY2lwYWxfZGlzY291bnQiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzMjM1MjMgImFzc2V0X3N1c3BlbmRlZCIgImFzc2V0X2RlZmF1bHRlZCIgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgIm1ldGFkYXRhIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAweDUyMzgzMDIzICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4MDAgInRvdGFsX2NvdXBvbnMiIDB4MDAwMCAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwLTMxCiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgNSAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAxOSAvLyAweDUyMzIzNTIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMjAgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyAyMSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInRvdGFsX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMQogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMgogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW5tLlNUQVRVU19JTkFDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzEtMzIKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAyMiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgMTMgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM0CiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzUKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTQgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNy0zOAogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDIzIC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwLTQxCiAgICAvLyAjIFByaW5jaXBhbCAvIFJhdGVzCiAgICAvLyBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MgogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDI2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDI5IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA4IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjUxCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MgogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjkKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMi0yNAogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIE5vQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBOb0NvdXBvblRyYW5zZmVyQWdlbnRNaXhpbiwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHgyNWRiYTk1YiAvLyBtZXRob2QgImFzc2V0X3VwZGF0ZSgodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMi0yNAogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIE5vQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBOb0NvdXBvblRyYW5zZmVyQWdlbnRNaXhpbiwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMzCiAgICBwdXNoYnl0ZXNzIDB4ODk0NzQxMzQgMHg0NDM2M2Q0OSAweDY3ZGI0ZjIwIDB4OWM3NmI2YTMgMHg0ZmQ2YTNjYyAweDFkNmZjMjU1IDB4MjVlOTk5N2YgMHg2Yzg1ZTNlZSAweDQwMmRiYTQ3IDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IDB4ZGMwNjNiMzUgMHgxNGZjMTBlZiAweDRjMTEzZWQ1IDB4NzRhNzI5N2YgMHgxMDVjMTg0ZSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jb25maWcgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSBnZXRfcGF5bWVudF9hbW91bnQgcGF5X3ByaW5jaXBhbCBhc3NldF90cmFuc2ZlciBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzIHNldF9kZWZhdWx0X3N0YXR1cyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbiBnZXRfYXNzZXRfaW5mbyBnZXRfdGltZV9ldmVudHMgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUgZ2V0X2Fzc2V0X21ldGFkYXRhIGFjY291bnRfZ292X3N1c3BlbnNpb24gYWNjb3VudF9vcGVuIGFjY291bnRfY2xvc2UgYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X2luZm8gcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV9jb25maWcKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyLTI0CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBQQU1Db3JlTWl4aW4sCiAgICAvLyAgICAgTm9Db3Vwb25DYXNoZmxvd01peGluLAogICAgLy8gICAgIFByaW5jaXBhbFBheW1lbnRBZ2VudE1peGluLAogICAgLy8gICAgIE5vQ291cG9uVHJhbnNmZXJBZ2VudE1peGluLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDNmMGVmYzZjIC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGFzc2V0X2NyZWF0ZQogICAgZXJyCgptYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBhc3NldF91cGRhdGUKCgovLyBtb2R1bGVzLmFjdHVzLnBhbS5QQU1Db3JlTWl4aW4uYXNzZXRfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGxlbgogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQxNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciA4CiAgICBwdXNoaW50IDIKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50MTY+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAxNgogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx0dXBsZTx1aW50NjQsdWludDY0Pj4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gZW51bXMuU1RBVFVTX0lOQUNUSVZFLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU1LTU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDUKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU3CiAgICAvLyBhc3NlcnQgZXhpc3RzLCBlcnIuSU5WQUxJRF9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBEZW5vbWluYXRpb24gYXNzZXQgaXMgbm90IHByb3Blcmx5IHNldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAyMiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo2NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZGlnIDQKICAgIHVuY292ZXIgNgogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjYzLTY2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjkKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDEzIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIzOC0yMzkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCBwcmluY2lwYWwgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbiA9PSAwLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgZGlnIDMKICAgIGRpZyAyCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24KICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbCAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIGJ5dGVjIDEyIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNDIKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gcHJpbmNpcGFsX2Rpc2NvdW50CiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ0LTI0NQogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjgyCiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzktODMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo4NgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxNCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0OC0yNDkKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5hc191aW50NjQoKSkKICAgIGRpZyA1CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxNC0xNQogICAgLy8gIyBUaGlzIHN1YnJvdXRpbmUgbXVzdCBiZSB1c2VkIGFmdGVyIHRoZSBwcmluY2lwYWwgZGlzY291bnQgaGFzIGJlZW4gc2V0CiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIEludGVyZXN0IHJhdGUgaXMgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojk0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlCiAgICBieXRlYyAyNiAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGRpZyA0CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDAKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDI5IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDQKICAgIC8vIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIHB1c2hpbnQgNAogICAgKwogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDMtMTA1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNTgKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyNwogICAgLy8gc2VsZi50aW1lX2V2ZW50cy52YWx1ZSA9IHRpbWVfZXZlbnRzLmNvcHkoKQogICAgYnl0ZWMgMjcgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAyNyAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTI4LTEzMAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyOAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyOC0xMzAKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzEtMTMzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdCiAgICBkaWcgMQogICAgcHVzaGludCAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzMQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDI0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzEtMTMzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTM0CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdCiAgICBkaWcgMQogICAgcHVzaGludCAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDggLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTM1CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzgKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBkaWcgMQogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLm5vX2NvdXBvbi5Ob0NvdXBvbkNhc2hmbG93TWl4aW4uZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NzgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5Ojc4LTc5CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NzkKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NzgtNzkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo3Ny04MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwgZXJyLk5PX1BSSU1BUllfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6ODIKICAgIC8vIGFzc2VydCAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5JTlZBTElEX1VOSVRTCiAgICBkdXAKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4CiAgICBkaWcgOAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICA+PQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDgKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjgyCiAgICAvLyBhc3NlcnQgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6ODQKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZHVwMgogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6ODYKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGRpZyAxCiAgICAqCiAgICBwdXNoaW50IDEwMDAwCiAgICAvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo5MAogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlIC0gYWNjb3VudF91bml0c19kaXNjb3VudAogICAgLQogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo5My05NAogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdCBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24gYW5kIGF0IG1hdHVyaXR5CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5Ojk1CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6OTYKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjMwLTMxCiAgICAvLyAjIFRoZSBjaGVjayBvbiBtYXR1cml0eSBkYXRlIGVuc3VyZXMgRC1BU0EgaGFzIGJlZW4gY29uZmlndXJlZCBhcyBibG9jayB0aW1lc3RhbXAgY2Fubm90IGJlIGxlc3MgdGhhbiAwIChpbml0KS4KICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGJ1cnkgNwogICAgPD0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGRpZyA1CiAgICA+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTcKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo5OC05OQogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMDAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMDEKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBkaWcgMgogICAgZGlnIDIKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGJ1cnkgNwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTAyCiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTAzCiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA0CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMDUtMTA2CiAgICAvLyAjIFZhbHVlIGF0IG1hdHVyaXR5CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDYKICAgIGJ1cnkgOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTEyLTExNQogICAgLy8gZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPW51bWVyYXRvciwKICAgIC8vICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICksCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTA5LTExNgogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUsCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgZGlnIDgKICAgIGl0b2IKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDE4CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA5CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5ub19jb3Vwb24uTm9Db3Vwb25DYXNoZmxvd01peGluLmdldF9wYXltZW50X2Ftb3VudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjExOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjEzNAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTM1CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjEzNgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICBidXJ5IDEKCmdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMzcKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoaW50ZXJlc3Q9VUludDY0KDApLCBwcmluY2lwYWw9cHJpbmNpcGFsX2Ftb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBkaWcgMQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5wcmluY2lwYWwuUHJpbmNpcGFsUGF5bWVudEFnZW50TWl4aW4ucGF5X3ByaW5jaXBhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBheV9wcmluY2lwYWw6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjE2LTE3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIxCiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIyCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjMKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo1MwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTMKICAgIC8vIGlmIHNlbGYub3BfZGFlbW9uLnZhbHVlICE9IEdsb2JhbC56ZXJvX2FkZHJlc3M6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gMHg1MjMyMzUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IHBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogcGF5X3ByaW5jaXBhbF9ib29sX3RydWVAMTkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTYKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTUtMTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IHBheV9wcmluY2lwYWxfYm9vbF90cnVlQDE5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE3CiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE1LTE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IHBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAyMAoKcGF5X3ByaW5jaXBhbF9ib29sX3RydWVAMTk6CiAgICBpbnRjXzEgLy8gMQoKcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNC0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjItMjQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyLTI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDI3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI1CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICBibnogcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDI3CiAgICBpbnRjXzEgLy8gMQoKcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDI4OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo1NgogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9wcmluY2lwYWxfZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzAKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjMwLTMxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI5LTMyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NTktNjAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNS00MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzkKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTkKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyMDAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMzIKICAgIGRpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjAxCiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNwogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjAKICAgIC8vIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjIyCiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjMKICAgIC8vIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjQKICAgIC8vIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfUFIpLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIlBSIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLAogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAzMDAzNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9QUiksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI1MDUyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX1BSKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4OGMyOTkwNGUgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2OQogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2Ny03MQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NjItNjMKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKICAgIGIgcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDQKCnBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAyNzoKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYm9vbF9tZXJnZUAyOAoKcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDIxCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5ub19jb3Vwb24uTm9Db3Vwb25UcmFuc2ZlckFnZW50TWl4aW4uYXNzZXRfdHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF90cmFuc2ZlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50L25vX2NvdXBvbi5weTo5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1My0xNTgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gYW5kICgKICAgIC8vICAgICBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTQKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1My0xNTgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gYW5kICgKICAgIC8vICAgICBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYKICAgIC8vIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX3RydWVANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU3CiAgICAvLyBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1Ni0xNTcKICAgIC8vIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANgoKYXNzZXRfdHJhbnNmZXJfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA3OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTUyLTE1OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgYW5kICgKICAgIC8vICAgICAgICAgbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICAgICAgb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKQogICAgLy8gKSwgZXJyLlNFQ09OREFSWV9NQVJLRVRfQ0xPU0VECiAgICBhc3NlcnQgLy8gU2Vjb25kYXJ5IG1hcmtldCBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE2OS0xNzEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdHJhbnNmZXIgcmlnaHQgdG8gRC1BU0Egb3duZXJzLiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IHJlbGF5IG9uIG90aGVyCiAgICAvLyAjIHJvbGVzLCBleHRlcm5hbCBBcHBzIHRocm91Z2ggQzJDIGNhbGxzIChlLmcuLCBhbiBvcmRlciBib29rKSwgb3Igb2ZmLWNoYWluIHRyYW5zZmVyIGFnZW50cy4KICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3MgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTc2CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MAogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgICE9CiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciBtdXN0IGJlIGRpZmZlcmVudAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTkxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MwogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlCiAgICBleHRyYWN0IDQwIDgKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY0CiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRzID4gVUludDY0KDApOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTgKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4LTU5CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4LTU5CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAyMAogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMjE6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTctNjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuTk9OX0ZVTkdJQkxFX1VOSVRTCiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciB1bml0cyBhcmUgbm90IGZ1bmdpYmxlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9ub19jb3Vwb24ucHk6NDUtNDYKICAgIC8vICMgVHJhbnNmZXJyZWQgdW5pdHMgdmFsdWUgKG11c3QgYmUgY29tcHV0ZWQgYmVmb3JlIHRoZSB0cmFuc2ZlcikKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIGRpZyA2CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBkaWcgMwogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzEKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwMgogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBzd2FwCiAgICAtCiAgICBpdG9iCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTIKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID09IFVJbnQ2NCgwKToKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNDAKICAgIGRpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBVSW50NjQoMCkKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50L25vX2NvdXBvbi5weTo1MgogICAgLy8gcmV0dXJuIHVuaXRzICogc2VuZGVyX3VuaXRfdmFsdWUgKyBhY2NydWVkX2ludGVyZXN0CiAgICBkaWcgNAogICAgKgogICAgZGlnIDUKICAgICsKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvbm9fY291cG9uLnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAyMDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMjEKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUA5OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUgPSBzZW5kZXJfdW5pdF92YWx1ZQogICAgZGlnIDUKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgZGlnIDEwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucwogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDgKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTAKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANwoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5hc3NldF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIHB1c2hpbnQgMzgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggNyBvZiAodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIGRpZyAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNDIKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuQXNzZXRNZXRhZGF0YQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDUgLy8gMHg1MjMyMzAyMwogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc3CiAgICAvLyBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEuYnl0ZXMKICAgIGJ5dGVjIDIzIC8vICJtZXRhZGF0YSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5hc3NldF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA3IG9mICh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0MgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Bc3NldE1ldGFkYXRhCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyODQtMjg3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IGRpc2FibGUgRC1BU0EgYXBwbGljYXRpb24gdXBkYXRhYmlsaXR5IG9yIGNoYW5nZSBpdHMgYXV0aG9yaXphdGlvbnMuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyODgKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjMgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50czoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxMQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzEyCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzEzCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNQogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZHVwCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNgogICAgLy8gaWYgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPiAxOgogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTcKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZHVwCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGJ1cnkgMQoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjAKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYXQogICAgZGlnIDEKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGJ1cnkgNAogICAgcHVzaGludCAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIwLTMyMQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICBzd2FwCiAgICBkaWcgMQogICAgPD0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxOS0zMjIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYXQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjMtMzI1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI2CiAgICAvLyBpZiBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI5CiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFhdCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjgtMzI5CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWF0KICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI3LTMzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFhdCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfQ0xPU1VSRV9EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IGNsb3N1cmUgZGF0ZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMxCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMxLTMzMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM1CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1zZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNgogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGUoCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1zZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlLAogICAgLy8gKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5zZXRfZGVmYXVsdF9zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1MgogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDIxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzUzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ1LTE0OAogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ3CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ni0xNDcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDYtMTQ4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0OAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ3LTE0OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGRpZyAzCiAgICA+CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDYtMTQ4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDQtMTQ5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzEKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTggLy8gMHg1MjM1MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzgzCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4NAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODUKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5aRVJPX1VOSVRTCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4NgogICAgLy8gYXNzZXJ0IHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg4CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg5CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA0MAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzkxCiAgICAvLyByZXR1cm4gc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF9hc3NldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MDMKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfUEVSRk9STUFOVCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MDQKICAgIC8vIGlmIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5tYXR1cml0eV9kYXRlID4gMDoKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgZHVwCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwNQogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9NQVRVUkVEKQogICAgcHVzaGludCA0CiAgICBidXJ5IDIKCmdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwNi00MDcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gZ3JhY2Ugb3IgZGVsaW5xdWVuY3kgcGVyaW9kcwogICAgLy8gaWYgc2VsZi5hc3NldF9kZWZhdWx0ZWQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwOAogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9ERUZBVUxURUQpCiAgICBwdXNoaW50IDMKICAgIGJ1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDExCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTIKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmlkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDUKICAgIC8vIHJldHVybiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgZHVwMgogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE1CiAgICAvLyBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxNgogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE3CiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE4CiAgICAvLyB0b3RhbF9zdXBwbHk9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIxCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjIKICAgIC8vIGlzc3VhbmNlX2RhdGU9c2VsZi5pc3N1YW5jZV9kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyMwogICAgLy8gbWF0dXJpdHlfZGF0ZT1zZWxmLm1hdHVyaXR5X2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDI0CiAgICAvLyBzdXNwZW5kZWQ9c2VsZi5hc3NldF9zdXNwZW5kZWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjUKICAgIC8vIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgZGlnIDE1CiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTAtNDI2CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsKCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1zZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgLy8gICAgIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIC8vICAgICB0b3RhbF9zdXBwbHk9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBjaXJjdWxhdGluZ19zdXBwbHk9c2VsZi5jaXJjdWxhdGluZ191bml0cywKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUsCiAgICAvLyAgICAgcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPXNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlLAogICAgLy8gICAgIGlzc3VhbmNlX2RhdGU9c2VsZi5pc3N1YW5jZV9kYXRlLAogICAgLy8gICAgIG1hdHVyaXR5X2RhdGU9c2VsZi5tYXR1cml0eV9kYXRlLAogICAgLy8gICAgIHN1c3BlbmRlZD1zZWxmLmFzc2V0X3N1c3BlbmRlZCwKICAgIC8vICAgICBwZXJmb3JtYW5jZT1hcmM0LlVJbnQ4KHBlcmZvcm1hbmNlKSwKICAgIC8vICkKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlYyAyOCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfdGltZV9ldmVudHNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfdGltZV9ldmVudHM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MzYKICAgIC8vIHRpbWVfZXZlbnRzID0gdHlwLlRpbWVFdmVudHMoKQogICAgYnl0ZWMgMzAgLy8gMHgwMDAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzNwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MzgKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDI3IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NTAKICAgIC8vIChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ0OS00NTEKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICAoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSkKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfYXNzZXRfbWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NjIKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dvdl9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nb3Zfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDEwIC8vIDB4NTIzNzMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxMSAvLyAweDUyMzQzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNCAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDIKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDYKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0LTE1MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1VSW50NjQoMCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMjggLy8gMHgwMAogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfY2xvc2Vbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2Nsb3NlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTEgLy8gMHg1MjM0MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzQKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NQogICAgLy8gZGVsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NwogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzgKICAgIC8vIHJldHVybiBjbG9zZWRfdW5pdHMsIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwMgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMjIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDUgLy8gMHg1MjMyMzAyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzQKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMTkgLy8gMHg1MjMyMzUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnQgMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNSAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxMCAvLyAweDUyMzczMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzODMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMTggLy8gMHg1MjM1MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxNyAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEwIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzODMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gZGVsIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTAgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDIwIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMTEgLy8gMHg1MjM0MzAyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDE4IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMTAgLy8gMHg1MjM3MzAyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDI4IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX2NvbmZpZzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTQKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NwogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYtMzI3CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI3CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDEwIC8vIDB4NTIzNzMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMAogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMwogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTUKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNDMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDItMzA0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OC0zMDAKICAgIC8vIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwubm9fY291cG9uLk5vQ291cG9uQ2FzaGZsb3dNaXhpbi5kYXlfY291bnRfZmFjdG9yKCkgLT4gYnl0ZXM6CmRheV9jb3VudF9mYWN0b3I6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxNwogICAgLy8gZGVmIGRheV9jb3VudF9mYWN0b3Ioc2VsZikgLT4gdHlwLkRheUNvdW50RmFjdG9yOgogICAgcHJvdG8gMCAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxOC0xOQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIC0KICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjIwCiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gc2VsZi5tYXR1cml0eV9kYXRlIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MjEKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE2MgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNSAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjIDUgLy8gODY0MDAKICAgIC8KCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MjQtMjcKICAgIC8vIHJldHVybiB0eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFjY3J1ZWRfcGVyaW9kLAogICAgLy8gICAgIGRlbm9taW5hdG9yPXByaW5jaXBhbF9wZXJpb2QsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLm5vX2NvdXBvbi5Ob0NvdXBvbkNhc2hmbG93TWl4aW4uYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjMzLTM1CiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50LCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MzYKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTozNwogICAgLy8gYWNjcnVlZF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjM4CiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MQogICAgLy8gKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NDAtNDEKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NDAtNDIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgLy8gKiBhY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MwogICAgLy8gLy8gKGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kKQogICAgcHVzaGludCAxMDAwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MC00MwogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50CiAgICAvLyAqIGFjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoY3N0LkJQUyAqIHByaW5jaXBhbF9wZXJpb2QpCiAgICAvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTozOS00NAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50CiAgICAvLyAgICAgKiBhY2NydWVkX3BlcmlvZAogICAgLy8gICAgIC8vIChjc3QuQlBTICogcHJpbmNpcGFsX3BlcmlvZCkKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IHByaW5jaXBhbF9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCBjaGVja3MKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDcKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwOQogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExMAogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA5LTExMAogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDgtMTExCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDEzCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMzEgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAzMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTcKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW2lkeF0KICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExOAogICAgLy8gdGltZV9mID0gdGltZV9ldmVudHNbaWR4ICsgMV0KICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE5CiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMjAKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgcHVzaGludCAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTIxLTEyMgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTIxLTEyNAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDUgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgNQogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANjoKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzMKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDQ4CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzYKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCwgdW5pdHM6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzcKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKYWNjb3VudF90b3RhbF91bml0c192YWx1ZToKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozOQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0MQogICAgLy8gaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0MC00MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkgLT4gdm9pZDoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ4CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDkKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVubS5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjIDQgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDcKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOAo=", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" - }, - "byteCode": { - "approval": "DCAGAAEgCMgBgKMFJiAEFR98dQRSMzAjBnN0YXR1cxFjaXJjdWxhdGluZ191bml0cw1tYXR1cml0eV9kYXRlBFIyMCMKdW5pdF92YWx1ZSFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUNaXNzdWFuY2VfZGF0ZR1zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQRSNzAjBFI0MCMLdG90YWxfdW5pdHMTc2V0dGxlbWVudF9hc3NldF9pZBRkYXlfY291bnRfY29udmVudGlvbhJwcmluY2lwYWxfZGlzY291bnQdc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUEUjYwIwRSNTAjBFIyNSMPYXNzZXRfc3VzcGVuZGVkD2Fzc2V0X2RlZmF1bHRlZBVkZW5vbWluYXRpb25fYXNzZXRfaWQIbWV0YWRhdGEhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlBFI4MCMNaW50ZXJlc3RfcmF0ZQp0aW1lRXZlbnRzAQANdG90YWxfY291cG9ucwIAAAMGgQExGEAAbScFMgNnJxMyA2cnFCJnJxUiZycMImcrImcnBiJnKiJnJxYiZycNImcnBiJnJw4iZycXgABnJw8iZycaImcnHSJnJwciZycYImcnCCJnJxAiZycJImcnBCJnMTWBAxJEMTSBEhJEMTcURDE2FESABCXbqVs2GgCOAQDOMRkURDEYQQC3ghkEiUdBNARENj1JBGfbTyAEnHa2owRP1qPMBB1vwlUEJemZfwRshePuBEAtukcE+tIXPgQI7+o1BOSlq1QE3AY7NQQU/BDvBEwRPtUEdKcpfwQQXBhOBIL3Gy0E7wT10wQDuDMpBD2+gL0E31ToLAQBDIKZBHQGrNIEw+SylzYaAI4ZABsBWwIlAlMDtwVNBcwF6waBB1AHageFB5AHyQgTCFAIggiaCLIIygmGChwKOwpGCpAAgAQ/DvxsNhoAjgEE6wAxGYEEEjEYEERCBQ02GgFJFSUSRBc2GgJJFSUSRBc2GgNJFSUSRBc2GgRJFSUSRBc2GgVJFSUSRBc2GgZJFSMSRDYaB0lOBxWBAhJENhoISSJZSU4IgQILgQIITBUSRDYaCUlOB0kiWUlOCCULgQIITBUSRDYaCkkiWUlOCIEQC4ECCEwVEkSIC9UiKmVEFERLBXELRQFEJxZLBmdLBE8GEkQnDUsFZ7EyADIKIrISshRPBbIRgQSyELIBs0sDSwIYFEQnBksCZ08DTwIKJwxMZycPTwJnF0lBAAhJgf8BEkEAZSNEJw5LAWdLBRdJFEQnGkxnSwRJFEQnHUsBZ4EECEsDEkRLA4gKXicbvEgnG0sBv0lXAgBLAYECWycHTGdLAYEKWycYTGdLAYESWycITGdMIlkjCSULWycETGdLARREKoFkZyNDIkL/mCKAAEcFNhoBSRUkEkQ2GgJJFSUSRBciJwdlREEAqDIHIicHZUQPQQCdI0QpSwJQSUUKvUUBRElBAIhLCL5EJFtLAQ9BAHwjREqICmVJRQgiJw9lREsBC4GQTgoJRQgiRQYiRQMiRQQiJwhlRDIHSUUHDkEASSInBGVESwUNQQA+I0EAFYgJQUsCSwKICWpFB0kiW0UEJVtFBDIHIicEZUQPQQAESwZFCEsCFksEFlBLCBZLBxZQTFAoTFCwI0MiQv+/IkL/gSJC/2A2GgFHAhUkEkQpTFC9RQFEIkkqZUSBZBJBAAdLAYgJ10UBIhZLARZQKExQsCNDNhoBRwIVJBJENhoCSSJZgQIISwEVEkRXAgBMIiplRIFkEkSICf+ICgQpSwFQSU4CSb1FAUS+SCRbRDIHIicEZUQPRIgJgyInE2VEMgMTQQAiMQAiJxNlRBJAABUxAEsEEkAADTEASwK+RFcAIBJBAO8jREsBvkRXACAiJw1lRHAARQFBANZLAb5EgcADU0AAyyNBAMEyCiInDWVETEsBcABESwJJTgIPREsDvkRXACCxMgBPArISTLIUTLIRgQSyELIBsyIrZURLAklOAr5EJFsJK0xnIhZMJEsCu4gI/DIIMgciJxZlRElxA0QiK2VEIicGZUQLTwQWgAMDADdQTwQWUEsFFkxLAVBPBBZQSwMVFlcGAk8EUEyAAgA7UE8DFlAnHlBPA1CABAACUFJQTFCABIwpkE5MULAyBxZQSwNJFRZXBgJMUEyAAgASUExQKExQsCNDIkUBQv9oIkL/MiJC/w4iRwKAAEk2GgFJFSQSRDYaAkkVJBJENhoDSRUlEkQXIiplRIFkEkEBFSInEGVEMgcOQQEKIicJZURBAAsyByInCWVEDEEA9yNEMQBLA0lOAhJEiAhsiAhxKUsBUElFCUm9RQFEKUsESU4CUElFCkm9RQFESwOIB81LAYgHyE8DTwITREsCSURPAr5ESSRbTwIPRFcoCEUJvkQkW0EAiksGvkSBKFtLBr5EgShbEkEAdEsGvkSBMFtLBr5EgTBbEkEAYiNESwZJvkSBKFtFBUsDSwJJTgKIBsRFB0sBvkQkW0oOREwJFksBJE8Cu75IJFtAABAiFksHSU4CgShLAruBMEy7SwVJvkQkW0sCSU4CCBZPAiRPArtLBAtLBQgWKExQsCNDIkL/m0sFSYEoSwq7Swe+RFcwCIEwTLtC/4YiQv8GNhoBSRUkEkQ2GgJJFUsBgSZZSYEoEkRLAkxLAlIiWYEqCBJEJwVPAmcnF0xnI0M2GgFJFUsBgSZZSYEoEkRLAkxLAlIiWYEqCBJEiAcnJxdMZyNDIjYaAUcCIllJJQuBAghPAhUSRIgHCyIqZUQhBBIURIgHCUlEIw1BAAZJiAX9RQEiJwhlREsBSVcCAEUEgQJbTEsBDkQnEExnIicEZURBABoiJwRlREsBIlkjCSULSwNMW0xLAQ9EJwlMZyInEGVEIicJZURMFkwWUChMULAjQzYaAUkVIxJEIlMnETEAiAZdRCcVTGcyBxYoTFCwI0OAADYaAUkVJBJENhoCSRUlEkQXIiplRIFkEkEAdSInB2VEMgdJRQUOQQBnIicYZURLAw1BAFwjRCcSMQCIBhBEKUsCUEm9RQFEiAZBiAZGSwFJRCIrZURLAQgiJwxlREsBD0QrSwFnSwK+RCRbTwIIFksCJE8CuyInBmVEFk8CgShPArsiJwxlREwJFihMULAjQyJC/6EiMgciJwRlTElOAk4DRA1BAAhJQQAEgQRFAiInFWVEQQAEgQNFAiInFmVEIicNZUQiK2VEIicGZURKCyInDmVEFkmTJQ5EVwcBIicPZUQWSZOBEA5EVwYCIicaZUQWSZOBEA5EVwYCIicMZUQiJwdlRCInGGVEIicIZUQiJwRlRCInFGVESw8WSZMlDkRXBwFPDhZPDhZQTwsWUE8LFlBPClBPCVBPCFBPBxZQTwcWUE8GFlBPBRZQTwQWUE8DFlAnHCJPBFRQTFAoTFCwI0MnHiIqZUSBZBJBAAcnG75MRQJEKEsBULAjQyInEGVEIicJZURMFoACAAJMUEwWUChMULAjQyInF2VEKExQsCNDNhoBSRUkEkQ2GgJJFSMSRCJTJwoxAIgEkUQpTwJQSb1FAURJgTgjuiJPA1SBOEy7MgcWKExQsCNDNhoBSRUkEkQ2GgJJFSQSRCcLMQCIBFpEIiplRCEEEhREiASLiASQKU8CUEm9RQEURCIWTwJLAVBLAVBMUCccUL8yBxYoTFCwI0M2GgFJFSQSRCcLMQCIBBhEiARSKUxQSb1FAURJvkgkW0y8SCIrZURLAQkrTGeIA+syB0wWTBZQKExQsCNDNhoBSRUkEkQ2GgJJFSQSRDEASwISRIgED4gEFClPAlBJvUUBRCJPArsyBxYoTFCwI0M2GgFJFSQSRClMUEm9RQFEvkgoTFCwI0M2GgFJFSQSRIgDyScFTGcyBxYoTFCwI0M2GgFJFSQSRIgDsScTTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUkEkQ2GgNJIlmBAghLARUSRFcCAEyIA32IA4QXRwKIA46BFBJBAA4nBUsDZzIHFihMULAjQ0mBKBJBABEnC0sDUEm9RQEUREsCv0L/30mBMhJBABEnEksDUEm9RQEUREsCv0L/x0mBPBJBABEnEUsDUEm9RQEUREsCv0L/r0mBRhJBABEnCksDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSQSRIgC04gC2hdHAogC5EmBFBNEgSgSQQAVJwtLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycSSwJQSb1FAUS8SEL/4UmBPBJBAA8nEUsCUEm9RQFEvEhC/8tJgUYSQQAPJwpLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnCjEAiAINRCcUTGcyBxYoTFCwI0MiJwVlRChMULAjQzYaAUkVJBJEJwtLAYgB5ScSSwKIAd4nEUsDiAHXJwpLBIgB0CcZTwWIAcknHCJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJBJEF0mIAeGDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxlLAVBJvUUBRL5IKExQsCNDJwpLAVBJvUUBRL5IQv/rJxFLAVBJvUUBRL5IQv/cJxJLAVBJvUUBRL5IQv/NJwtLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigABMgciJwhlRExLAQlMIicEZURMCSInDmVEQAAKiwAhBQqMACEFCosAFkwWUEyJigIBiP/KSSJbTCVbi/6L/4gApiInD2VEC08CC4GQTk8CCwqJigEBgABHAov/VwIAi/+BAlsyBw1Ei/8iWSMJIosFiwQMQQBcgUsyDA1BABmxgQayEIEFshknH7IeJx+yHzIAsgGzQv/fiwVJJQuLA0lOA0xbSU4DjAEjCEmMAiULW0mMAAxEIicOZUSB/wETQQAKiwCLAQkhBRgURIsCjAVC/5yL/4wAiYoBACmL/1C+RIHAA1MURImKAgEpi/5QvkSBKFuL/wuJigEBKYv/UL5EJFuL/0yI/9+JIitlREAABCohBGeJigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJVuLAA9BAAQjjACJIkL/+TEAIicFZUQSRIkiJxVlRBREiSInFGVEFESJigEAi/+BFBJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", - "clear": "DIEBQw==" - }, - "compilerInfo": { - "compiler": "puya", - "compilerVersion": { - "major": 5, - "minor": 7, - "patch": 1 - } - }, - "events": [ - { - "name": "Event", - "args": [ - { - "type": "uint64", - "name": "contract_id" - }, - { - "type": "uint8", - "name": "type" - }, - { - "type": "string", - "name": "type_name" - }, - { - "type": "uint64", - "name": "time" - }, - { - "type": "uint64", - "name": "payoff" - }, - { - "type": "uint64", - "name": "currency_id" - }, - { - "type": "byte[]", - "name": "currency_unit" - }, - { - "type": "uint64", - "name": "nominal_value" - }, - { - "type": "uint16", - "name": "nominal_rate_bps" - }, - { - "type": "uint64", - "name": "nominal_accrued" - } - ], - "desc": "ACTUS Event." - } - ], - "templateVariables": {} -} \ No newline at end of file diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.puya.map b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.puya.map deleted file mode 100644 index d580b5c4..00000000 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.puya.map +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 3, - "sources": [], - "mappings": ";;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "pushint 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3": { - "op": "return", - "stack_out": [] - } - } -} \ No newline at end of file diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.teal b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.teal deleted file mode 100644 index a87aa802..00000000 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.clear.teal +++ /dev/null @@ -1,7 +0,0 @@ -#pragma version 12 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: -main: - pushint 1 - return diff --git a/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py b/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py deleted file mode 100644 index 6f34fffe..00000000 --- a/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py +++ /dev/null @@ -1,3675 +0,0 @@ -# flake8: noqa -# fmt: off -# mypy: ignore-errors -# This file was automatically generated by algokit-client-generator. -# DO NOT MODIFY IT BY HAND. -# requires: algokit-utils@^3.0.0 - -# common -import dataclasses -import typing -# core algosdk -import algosdk -from algosdk.transaction import OnComplete -from algosdk.atomic_transaction_composer import TransactionSigner -from algosdk.source_map import SourceMap -from algosdk.transaction import Transaction -from algosdk.v2client.models import SimulateTraceConfig -# utils -import algokit_utils -from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient - -_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Account's units for the current value calculation", "name": "units"}], "name": "get_account_units_current_value", "returns": {"type": "(uint64,uint64,(uint64,uint64))", "desc": "Units current value in denomination asset, Accrued interest in denomination asset", "struct": "CurrentUnitsValue"}, "desc": "Get account's units current value and accrued interest", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_payment_amount", "returns": {"type": "(uint64,uint64)", "desc": "Interest amount in denomination asset, Principal amount in denomination asset", "struct": "PaymentAmounts"}, "desc": "Get the next payment amount", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_principal", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay the outstanding principal to an account", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Sender Account Holding Address", "name": "sender_holding_address"}, {"type": "address", "desc": "Receiver Account Holding Address", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to transfer", "name": "units"}], "name": "asset_transfer", "returns": {"type": "uint64", "desc": "Transferred actualized value in denomination asset"}, "desc": "Transfer D-ASA units between accounts", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "account_gov_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_close", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "Timestamp of the account update"}, "desc": "Update the Payment Address of an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "account_get_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New Arranger address", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Rotate the Arranger address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation Daemon address", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Non-Normative: Set the Operation Daemon address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "rbac_gov_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Arranger address"}, "desc": "Get Arranger address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to get roles for", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask: (Account Manager, Primary Dealer, Trustee, Authority, Interest Oracle)"}, "desc": "Non-normative - Get roles assigned to an address", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role Identifier", "name": "role_id"}, {"type": "address", "desc": "Account Role Address", "name": "role_address"}], "name": "rbac_get_role_config", "returns": {"type": "(uint64,uint64)", "desc": "Role configuration", "struct": "RoleConfig"}, "desc": "Get role configuration", "events": [], "readonly": true, "recommendations": {}}], "name": "ZeroCouponBond", "state": {"keys": {"box": {"time_events": {"key": "dGltZUV2ZW50cw==", "keyType": "AVMBytes", "valueType": "uint64[]"}}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjI1Iw==", "keyType": "AVMBytes", "valueType": "address"}, "asset_suspended": {"key": "YXNzZXRfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "asset_defaulted": {"key": "YXNzZXRfZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}, "account": {"keyType": "address", "valueType": "AccountInfo", "prefix": "UjMwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 3, "ints": 18}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "CurrentUnitsValue": [{"name": "units_value", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}], "DayCountFactor": [{"name": "numerator", "type": "uint64"}, {"name": "denominator", "type": "uint64"}], "PaymentAmounts": [{"name": "interest", "type": "uint64"}, {"name": "principal", "type": "uint64"}], "PaymentResult": [{"name": "amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}]}, "byteCode": {"approval": "DCAGAAEgCMgBgKMFJiAEFR98dQRSMzAjBnN0YXR1cxFjaXJjdWxhdGluZ191bml0cw1tYXR1cml0eV9kYXRlBFIyMCMKdW5pdF92YWx1ZSFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUNaXNzdWFuY2VfZGF0ZR1zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQRSNzAjBFI0MCMLdG90YWxfdW5pdHMTc2V0dGxlbWVudF9hc3NldF9pZBRkYXlfY291bnRfY29udmVudGlvbhJwcmluY2lwYWxfZGlzY291bnQdc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUEUjYwIwRSNTAjBFIyNSMPYXNzZXRfc3VzcGVuZGVkD2Fzc2V0X2RlZmF1bHRlZBVkZW5vbWluYXRpb25fYXNzZXRfaWQIbWV0YWRhdGEhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlBFI4MCMNaW50ZXJlc3RfcmF0ZQp0aW1lRXZlbnRzAQANdG90YWxfY291cG9ucwIAAAMGgQExGEAAbScFMgNnJxMyA2cnFCJnJxUiZycMImcrImcnBiJnKiJnJxYiZycNImcnBiJnJw4iZycXgABnJw8iZycaImcnHSJnJwciZycYImcnCCJnJxAiZycJImcnBCJnMTWBAxJEMTSBEhJEMTcURDE2FESABCXbqVs2GgCOAQDOMRkURDEYQQC3ghkEiUdBNARENj1JBGfbTyAEnHa2owRP1qPMBB1vwlUEJemZfwRshePuBEAtukcE+tIXPgQI7+o1BOSlq1QE3AY7NQQU/BDvBEwRPtUEdKcpfwQQXBhOBIL3Gy0E7wT10wQDuDMpBD2+gL0E31ToLAQBDIKZBHQGrNIEw+SylzYaAI4ZABsBWwIlAlMDtwVNBcwF6waBB1AHageFB5AHyQgTCFAIggiaCLIIygmGChwKOwpGCpAAgAQ/DvxsNhoAjgEE6wAxGYEEEjEYEERCBQ02GgFJFSUSRBc2GgJJFSUSRBc2GgNJFSUSRBc2GgRJFSUSRBc2GgVJFSUSRBc2GgZJFSMSRDYaB0lOBxWBAhJENhoISSJZSU4IgQILgQIITBUSRDYaCUlOB0kiWUlOCCULgQIITBUSRDYaCkkiWUlOCIEQC4ECCEwVEkSIC9UiKmVEFERLBXELRQFEJxZLBmdLBE8GEkQnDUsFZ7EyADIKIrISshRPBbIRgQSyELIBs0sDSwIYFEQnBksCZ08DTwIKJwxMZycPTwJnF0lBAAhJgf8BEkEAZSNEJw5LAWdLBRdJFEQnGkxnSwRJFEQnHUsBZ4EECEsDEkRLA4gKXicbvEgnG0sBv0lXAgBLAYECWycHTGdLAYEKWycYTGdLAYESWycITGdMIlkjCSULWycETGdLARREKoFkZyNDIkL/mCKAAEcFNhoBSRUkEkQ2GgJJFSUSRBciJwdlREEAqDIHIicHZUQPQQCdI0QpSwJQSUUKvUUBRElBAIhLCL5EJFtLAQ9BAHwjREqICmVJRQgiJw9lREsBC4GQTgoJRQgiRQYiRQMiRQQiJwhlRDIHSUUHDkEASSInBGVESwUNQQA+I0EAFYgJQUsCSwKICWpFB0kiW0UEJVtFBDIHIicEZUQPQQAESwZFCEsCFksEFlBLCBZLBxZQTFAoTFCwI0MiQv+/IkL/gSJC/2A2GgFHAhUkEkQpTFC9RQFEIkkqZUSBZBJBAAdLAYgJ10UBIhZLARZQKExQsCNDNhoBRwIVJBJENhoCSSJZgQIISwEVEkRXAgBMIiplRIFkEkSICf+ICgQpSwFQSU4CSb1FAUS+SCRbRDIHIicEZUQPRIgJgyInE2VEMgMTQQAiMQAiJxNlRBJAABUxAEsEEkAADTEASwK+RFcAIBJBAO8jREsBvkRXACAiJw1lRHAARQFBANZLAb5EgcADU0AAyyNBAMEyCiInDWVETEsBcABESwJJTgIPREsDvkRXACCxMgBPArISTLIUTLIRgQSyELIBsyIrZURLAklOAr5EJFsJK0xnIhZMJEsCu4gI/DIIMgciJxZlRElxA0QiK2VEIicGZUQLTwQWgAMDADdQTwQWUEsFFkxLAVBPBBZQSwMVFlcGAk8EUEyAAgA7UE8DFlAnHlBPA1CABAACUFJQTFCABIwpkE5MULAyBxZQSwNJFRZXBgJMUEyAAgASUExQKExQsCNDIkUBQv9oIkL/MiJC/w4iRwKAAEk2GgFJFSQSRDYaAkkVJBJENhoDSRUlEkQXIiplRIFkEkEBFSInEGVEMgcOQQEKIicJZURBAAsyByInCWVEDEEA9yNEMQBLA0lOAhJEiAhsiAhxKUsBUElFCUm9RQFEKUsESU4CUElFCkm9RQFESwOIB81LAYgHyE8DTwITREsCSURPAr5ESSRbTwIPRFcoCEUJvkQkW0EAiksGvkSBKFtLBr5EgShbEkEAdEsGvkSBMFtLBr5EgTBbEkEAYiNESwZJvkSBKFtFBUsDSwJJTgKIBsRFB0sBvkQkW0oOREwJFksBJE8Cu75IJFtAABAiFksHSU4CgShLAruBMEy7SwVJvkQkW0sCSU4CCBZPAiRPArtLBAtLBQgWKExQsCNDIkL/m0sFSYEoSwq7Swe+RFcwCIEwTLtC/4YiQv8GNhoBSRUkEkQ2GgJJFUsBgSZZSYEoEkRLAkxLAlIiWYEqCBJEJwVPAmcnF0xnI0M2GgFJFUsBgSZZSYEoEkRLAkxLAlIiWYEqCBJEiAcnJxdMZyNDIjYaAUcCIllJJQuBAghPAhUSRIgHCyIqZUQhBBIURIgHCUlEIw1BAAZJiAX9RQEiJwhlREsBSVcCAEUEgQJbTEsBDkQnEExnIicEZURBABoiJwRlREsBIlkjCSULSwNMW0xLAQ9EJwlMZyInEGVEIicJZURMFkwWUChMULAjQzYaAUkVIxJEIlMnETEAiAZdRCcVTGcyBxYoTFCwI0OAADYaAUkVJBJENhoCSRUlEkQXIiplRIFkEkEAdSInB2VEMgdJRQUOQQBnIicYZURLAw1BAFwjRCcSMQCIBhBEKUsCUEm9RQFEiAZBiAZGSwFJRCIrZURLAQgiJwxlREsBD0QrSwFnSwK+RCRbTwIIFksCJE8CuyInBmVEFk8CgShPArsiJwxlREwJFihMULAjQyJC/6EiMgciJwRlTElOAk4DRA1BAAhJQQAEgQRFAiInFWVEQQAEgQNFAiInFmVEIicNZUQiK2VEIicGZURKCyInDmVEFkmTJQ5EVwcBIicPZUQWSZOBEA5EVwYCIicaZUQWSZOBEA5EVwYCIicMZUQiJwdlRCInGGVEIicIZUQiJwRlRCInFGVESw8WSZMlDkRXBwFPDhZPDhZQTwsWUE8LFlBPClBPCVBPCFBPBxZQTwcWUE8GFlBPBRZQTwQWUE8DFlAnHCJPBFRQTFAoTFCwI0MnHiIqZUSBZBJBAAcnG75MRQJEKEsBULAjQyInEGVEIicJZURMFoACAAJMUEwWUChMULAjQyInF2VEKExQsCNDNhoBSRUkEkQ2GgJJFSMSRCJTJwoxAIgEkUQpTwJQSb1FAURJgTgjuiJPA1SBOEy7MgcWKExQsCNDNhoBSRUkEkQ2GgJJFSQSRCcLMQCIBFpEIiplRCEEEhREiASLiASQKU8CUEm9RQEURCIWTwJLAVBLAVBMUCccUL8yBxYoTFCwI0M2GgFJFSQSRCcLMQCIBBhEiARSKUxQSb1FAURJvkgkW0y8SCIrZURLAQkrTGeIA+syB0wWTBZQKExQsCNDNhoBSRUkEkQ2GgJJFSQSRDEASwISRIgED4gEFClPAlBJvUUBRCJPArsyBxYoTFCwI0M2GgFJFSQSRClMUEm9RQFEvkgoTFCwI0M2GgFJFSQSRIgDyScFTGcyBxYoTFCwI0M2GgFJFSQSRIgDsScTTGcyBxYoTFCwI0M2GgFJFSMSRDYaAklOAhUkEkQ2GgNJIlmBAghLARUSRFcCAEyIA32IA4QXRwKIA46BFBJBAA4nBUsDZzIHFihMULAjQ0mBKBJBABEnC0sDUEm9RQEUREsCv0L/30mBMhJBABEnEksDUEm9RQEUREsCv0L/x0mBPBJBABEnEUsDUEm9RQEUREsCv0L/r0mBRhJBABEnCksDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSQSRIgC04gC2hdHAogC5EmBFBNEgSgSQQAVJwtLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycSSwJQSb1FAUS8SEL/4UmBPBJBAA8nEUsCUEm9RQFEvEhC/8tJgUYSQQAPJwpLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnCjEAiAINRCcUTGcyBxYoTFCwI0MiJwVlRChMULAjQzYaAUkVJBJEJwtLAYgB5ScSSwKIAd4nEUsDiAHXJwpLBIgB0CcZTwWIAcknHCJPBlQjTwVUgQJPBFSBA08DVIEETwJUKExQsCNDNhoBSRUjEkQ2GgJJTgIVJBJEF0mIAeGDBhQoMjxGUE8GjgYATwBAADEAIgATAAEAJxlLAVBJvUUBRL5IKExQsCNDJwpLAVBJvUUBRL5IQv/rJxFLAVBJvUUBRL5IQv/cJxJLAVBJvUUBRL5IQv/NJwtLAVBJvUUBRL5IQv++gBAAAAAAAAAAAAAAAAAAAAAAQv+pigABMgciJwhlRExLAQlMIicEZURMCSInDmVEQAAKiwAhBQqMACEFCosAFkwWUEyJigIBiP/KSSJbTCVbi/6L/4gApiInD2VEC08CC4GQTk8CCwqJigEBgABHAov/VwIAi/+BAlsyBw1Ei/8iWSMJIosFiwQMQQBcgUsyDA1BABmxgQayEIEFshknH7IeJx+yHzIAsgGzQv/fiwVJJQuLA0lOA0xbSU4DjAEjCEmMAiULW0mMAAxEIicOZUSB/wETQQAKiwCLAQkhBRgURIsCjAVC/5yL/4wAiYoBACmL/1C+RIHAA1MURImKAgEpi/5QvkSBKFuL/wuJigEBKYv/UL5EJFuL/0yI/9+JIitlREAABCohBGeJigIBgACL/ov/UEm9RQFBAB+LAb5EIlsyB0mMAA5BABCLAb5EJVuLAA9BAAQjjACJIkL/+TEAIicFZUQSRIkiJxVlRBREiSInFGVEFESJigEAi/+BFBJAACiL/4EoEkAAIIv/gTISQAAYi/+BPBJAABCL/4FGEkAACIv/gVASQQADI0SJIkL/+g==", "clear": "DIEBQw=="}, "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint8", "name": "type"}, {"type": "string", "name": "type_name"}, {"type": "uint64", "name": "time"}, {"type": "uint64", "name": "payoff"}, {"type": "uint64", "name": "currency_id"}, {"type": "byte[]", "name": "currency_unit"}, {"type": "uint64", "name": "nominal_value"}, {"type": "uint16", "name": "nominal_rate_bps"}, {"type": "uint64", "name": "nominal_accrued"}], "name": "Event", "desc": "ACTUS Event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgOCAyMDAgODY0MDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyMzMzMDIzICJzdGF0dXMiICJjaXJjdWxhdGluZ191bml0cyIgIm1hdHVyaXR5X2RhdGUiIDB4NTIzMjMwMjMgInVuaXRfdmFsdWUiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiICJpc3N1YW5jZV9kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiIDB4NTIzNzMwMjMgMHg1MjM0MzAyMyAidG90YWxfdW5pdHMiICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJwcmluY2lwYWxfZGlzY291bnQiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzMjM1MjMgImFzc2V0X3N1c3BlbmRlZCIgImFzc2V0X2RlZmF1bHRlZCIgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgIm1ldGFkYXRhIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAweDUyMzgzMDIzICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4MDAgInRvdGFsX2NvdXBvbnMiIDB4MDAwMCAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwLTMxCiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgNSAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIKICAgIC8vIHNlbGYub3BfZGFlbW9uID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9PUF9EQUVNT04pCiAgICBieXRlYyAxOSAvLyAweDUyMzIzNTIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgRC1BU0EgR292ZXJuYW5jZQogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMjAgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ5CiAgICAvLyBzZWxmLmFzc2V0X2RlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyAyMSAvLyAiYXNzZXRfZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInRvdGFsX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMQogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMgogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW5tLlNUQVRVU19JTkFDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzEtMzIKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAyMiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gQXNzZXQoKQogICAgYnl0ZWMgMTMgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM0CiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzUKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTQgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNy0zOAogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDIzIC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwLTQxCiAgICAvLyAjIFByaW5jaXBhbCAvIFJhdGVzCiAgICAvLyBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MgogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDI2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDI5IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA4IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjUxCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo1MgogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDMKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjkKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMi0yNAogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIE5vQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBOb0NvdXBvblRyYW5zZmVyQWdlbnRNaXhpbiwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICBwdXNoYnl0ZXMgMHgyNWRiYTk1YiAvLyBtZXRob2QgImFzc2V0X3VwZGF0ZSgodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF91cGRhdGVfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMi0yNAogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgUEFNQ29yZU1peGluLAogICAgLy8gICAgIE5vQ291cG9uQ2FzaGZsb3dNaXhpbiwKICAgIC8vICAgICBQcmluY2lwYWxQYXltZW50QWdlbnRNaXhpbiwKICAgIC8vICAgICBOb0NvdXBvblRyYW5zZmVyQWdlbnRNaXhpbiwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhdm1fdmVyc2lvbj0xMiwKICAgIC8vICk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDMzCiAgICBwdXNoYnl0ZXNzIDB4ODk0NzQxMzQgMHg0NDM2M2Q0OSAweDY3ZGI0ZjIwIDB4OWM3NmI2YTMgMHg0ZmQ2YTNjYyAweDFkNmZjMjU1IDB4MjVlOTk5N2YgMHg2Yzg1ZTNlZSAweDQwMmRiYTQ3IDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IDB4ZGMwNjNiMzUgMHgxNGZjMTBlZiAweDRjMTEzZWQ1IDB4NzRhNzI5N2YgMHgxMDVjMTg0ZSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHgwM2I4MzMyOSAweDNkYmU4MGJkIDB4ZGY1NGU4MmMgMHgwMTBjODI5OSAweDc0MDZhY2QyIDB4YzNlNGIyOTcgLy8gbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl1aW50NjQiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIiwgbWV0aG9kICJhY2NvdW50X2dvdl9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgImFjY291bnRfb3BlbihhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2Nsb3NlKGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9nZXRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV9jb25maWcodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jb25maWcgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSBnZXRfcGF5bWVudF9hbW91bnQgcGF5X3ByaW5jaXBhbCBhc3NldF90cmFuc2ZlciBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzIHNldF9kZWZhdWx0X3N0YXR1cyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbiBnZXRfYXNzZXRfaW5mbyBnZXRfdGltZV9ldmVudHMgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUgZ2V0X2Fzc2V0X21ldGFkYXRhIGFjY291bnRfZ292X3N1c3BlbnNpb24gYWNjb3VudF9vcGVuIGFjY291bnRfY2xvc2UgYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzIGFjY291bnRfZ2V0X2luZm8gcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2dvdl9hc3NldF9zdXNwZW5zaW9uIHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV9jb25maWcKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyLTI0CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBQQU1Db3JlTWl4aW4sCiAgICAvLyAgICAgTm9Db3Vwb25DYXNoZmxvd01peGluLAogICAgLy8gICAgIFByaW5jaXBhbFBheW1lbnRBZ2VudE1peGluLAogICAgLy8gICAgIE5vQ291cG9uVHJhbnNmZXJBZ2VudE1peGluLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHB1c2hieXRlcyAweDNmMGVmYzZjIC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGFzc2V0X2NyZWF0ZQogICAgZXJyCgptYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUA0OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDQgLy8gVXBkYXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBhc3NldF91cGRhdGUKCgovLyBtb2R1bGVzLmFjdHVzLnBhbS5QQU1Db3JlTWl4aW4uYXNzZXRfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGxlbgogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQxNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciA4CiAgICBwdXNoaW50IDIKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50MTY+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8dWludDY0PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgOAogICAgcHVzaGludCAxNgogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTx0dXBsZTx1aW50NjQsdWludDY0Pj4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gZW51bXMuU1RBVFVTX0lOQUNUSVZFLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU1LTU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDUKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjU3CiAgICAvLyBhc3NlcnQgZXhpc3RzLCBlcnIuSU5WQUxJRF9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBEZW5vbWluYXRpb24gYXNzZXQgaXMgbm90IHByb3Blcmx5IHNldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAyMiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo2NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZGlnIDQKICAgIHVuY292ZXIgNgogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjYzLTY2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NjkKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDEzIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICB1bmNvdmVyIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3MC03NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjIzOC0yMzkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCBwcmluY2lwYWwgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbiA9PSAwLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgZGlnIDMKICAgIGRpZyAyCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MAogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24KICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0MQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbCAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIGJ5dGVjIDEyIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNDIKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gcHJpbmNpcGFsX2Rpc2NvdW50CiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjQ0LTI0NQogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAzCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjgyCiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIHB1c2hpbnQgMjU1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo3OS04MwogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NzktODMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo4NgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxNCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI0OC0yNDkKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5hc191aW50NjQoKSkKICAgIGRpZyA1CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxNC0xNQogICAgLy8gIyBUaGlzIHN1YnJvdXRpbmUgbXVzdCBiZSB1c2VkIGFmdGVyIHRoZSBwcmluY2lwYWwgZGlzY291bnQgaGFzIGJlZW4gc2V0CiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIEludGVyZXN0IHJhdGUgaXMgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5Ojk0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlCiAgICBieXRlYyAyNiAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGRpZyA0CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDAKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDI5IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDQKICAgIC8vIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIHB1c2hpbnQgNAogICAgKwogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDMtMTA1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNTgKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyNwogICAgLy8gc2VsZi50aW1lX2V2ZW50cy52YWx1ZSA9IHRpbWVfZXZlbnRzLmNvcHkoKQogICAgYnl0ZWMgMjcgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAyNyAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTI4LTEzMAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyOAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEyOC0xMzAKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzEtMTMzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdCiAgICBkaWcgMQogICAgcHVzaGludCAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEzMQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDI0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzEtMTMzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTM0CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdCiAgICBkaWcgMQogICAgcHVzaGludCAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDggLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTM1CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMzgKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBkaWcgMQogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI2NQogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLm5vX2NvdXBvbi5Ob0NvdXBvbkNhc2hmbG93TWl4aW4uZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NzgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5Ojc4LTc5CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NzkKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NzgtNzkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo3Ny04MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwgZXJyLk5PX1BSSU1BUllfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6ODIKICAgIC8vIGFzc2VydCAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMsIGVyci5JTlZBTElEX1VOSVRTCiAgICBkdXAKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA4CiAgICBkaWcgOAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICA+PQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDgKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjgyCiAgICAvLyBhc3NlcnQgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6ODQKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZHVwMgogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6ODYKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGRpZyAxCiAgICAqCiAgICBwdXNoaW50IDEwMDAwCiAgICAvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo5MAogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlIC0gYWNjb3VudF91bml0c19kaXNjb3VudAogICAgLQogICAgYnVyeSA4CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo5My05NAogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdCBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24gYW5kIGF0IG1hdHVyaXR5CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5Ojk1CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6OTYKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjMwLTMxCiAgICAvLyAjIFRoZSBjaGVjayBvbiBtYXR1cml0eSBkYXRlIGVuc3VyZXMgRC1BU0EgaGFzIGJlZW4gY29uZmlndXJlZCBhcyBibG9jayB0aW1lc3RhbXAgY2Fubm90IGJlIGxlc3MgdGhhbiAwIChpbml0KS4KICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGJ1cnkgNwogICAgPD0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAxNwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGRpZyA1CiAgICA+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTcKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo5OC05OQogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMDAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMDEKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBkaWcgMgogICAgZGlnIDIKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGJ1cnkgNwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTAyCiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgNAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTAzCiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA0CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMDUtMTA2CiAgICAvLyAjIFZhbHVlIGF0IG1hdHVyaXR5CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMwogICAgZGlnIDYKICAgIGJ1cnkgOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTEyLTExNQogICAgLy8gZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPW51bWVyYXRvciwKICAgIC8vICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICksCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTA5LTExNgogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUsCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9bnVtZXJhdG9yLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1kZW5vbWluYXRvciwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgZGlnIDgKICAgIGl0b2IKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDE4CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA5CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5ub19jb3Vwb24uTm9Db3Vwb25DYXNoZmxvd01peGluLmdldF9wYXltZW50X2Ftb3VudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjExOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjEzNAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19BQ1RJVkUKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MTM1CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjEzNgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBkaWcgMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICBidXJ5IDEKCmdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMzcKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoaW50ZXJlc3Q9VUludDY0KDApLCBwcmluY2lwYWw9cHJpbmNpcGFsX2Ftb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBkaWcgMQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucGF5bWVudF9hZ2VudC5wcmluY2lwYWwuUHJpbmNpcGFsUGF5bWVudEFnZW50TWl4aW4ucGF5X3ByaW5jaXBhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBheV9wcmluY2lwYWw6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjE2LTE3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzL3BhbS5weToxOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIxCiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXMvcGFtLnB5OjIyCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9hY3R1cy9wYW0ucHk6MjMKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo1MwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTMKICAgIC8vIGlmIHNlbGYub3BfZGFlbW9uLnZhbHVlICE9IEdsb2JhbC56ZXJvX2FkZHJlc3M6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gMHg1MjMyMzUyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IHBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vIDB4NTIzMjM1MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNS0xNwogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBibnogcGF5X3ByaW5jaXBhbF9ib29sX3RydWVAMTkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTYKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MTUtMTcKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IHBheV9wcmluY2lwYWxfYm9vbF90cnVlQDE5CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE3CiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjE1LTE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJ6IHBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAyMAoKcGF5X3ByaW5jaXBhbF9ib29sX3RydWVAMTk6CiAgICBpbnRjXzEgLy8gMQoKcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDIxOgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToxNC0xOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weToyMwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MjItMjQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5pc19vcHRlZF9pbigKICAgIC8vICAgICBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjIyLTI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgYnogcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDI3CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI1CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ0OAogICAgZ2V0Yml0CiAgICBibnogcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDI3CiAgICBpbnRjXzEgLy8gMQoKcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDI4OgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo1NgogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9wcmluY2lwYWxfZWxzZV9ib2R5QDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzAKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjMwLTMxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID49CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvY29tbW9uLnB5OjI5LTMyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NTktNjAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L2NvbW1vbi5weTozNS00MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzkKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9jb21tb24ucHk6MzUtNDAKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxOTkKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAtCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyMDAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMzIKICAgIGRpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MjAxCiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNwogICAgLy8gY29udHJhY3RfaWQ9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjAKICAgIC8vIHRpbWU9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjIyCiAgICAvLyBjdXJyZW5jeV9pZD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC5pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjMKICAgIC8vIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjQKICAgIC8vIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQvcHJpbmNpcGFsLnB5OjE2LTI3CiAgICAvLyBFdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICB0eXBlPWFyYzQuVUludDgoZW51bXMuRVZUX1RZUEVfUFIpLAogICAgLy8gICAgIHR5cGVfbmFtZT1TdHJpbmcoIlBSIiksCiAgICAvLyAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkLmlkLAogICAgLy8gICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgIG5vbWluYWxfdmFsdWU9c2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSwKICAgIC8vICAgICBub21pbmFsX3JhdGVfYnBzPWFyYzQuVUludDE2KDApLAogICAgLy8gICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAzMDAzNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwM2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MjUKICAgIC8vIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICBieXRlYyAzMCAvLyAweDAwMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MTYtMjcKICAgIC8vIEV2ZW50KAogICAgLy8gICAgIGNvbnRyYWN0X2lkPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgLy8gICAgIHR5cGU9YXJjNC5VSW50OChlbnVtcy5FVlRfVFlQRV9QUiksCiAgICAvLyAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICB0aW1lPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgY3VycmVuY3lfdW5pdD1zZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZC51bml0X25hbWUsCiAgICAvLyAgICAgbm9taW5hbF92YWx1ZT1zZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlLAogICAgLy8gICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgbm9taW5hbF9hY2NydWVkPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDI1MDUyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weToxNS0yOAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgdHlwZT1hcmM0LlVJbnQ4KGVudW1zLkVWVF9UWVBFX1BSKSwKICAgIC8vICAgICAgICAgdHlwZV9uYW1lPVN0cmluZygiUFIiKSwKICAgIC8vICAgICAgICAgdGltZT1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICAgICAgcGF5b2ZmPXBheW9mZiwKICAgIC8vICAgICAgICAgY3VycmVuY3lfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIGN1cnJlbmN5X3VuaXQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQudW5pdF9uYW1lLAogICAgLy8gICAgICAgICBub21pbmFsX3ZhbHVlPXNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgICAgIG5vbWluYWxfcmF0ZV9icHM9YXJjNC5VSW50MTYoMCksCiAgICAvLyAgICAgICAgIG5vbWluYWxfYWNjcnVlZD1VSW50NjQoMCksCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4OGMyOTkwNGUgLy8gbWV0aG9kICJFdmVudCh1aW50NjQsdWludDgsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSx1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2OQogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50L3ByaW5jaXBhbC5weTo2Ny03MQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1wYXltZW50X2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC9wcmluY2lwYWwucHk6NjItNjMKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEKICAgIGIgcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDQKCnBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAyNzoKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYm9vbF9tZXJnZUAyOAoKcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDIwOgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDIxCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5ub19jb3Vwb24uTm9Db3Vwb25UcmFuc2ZlckFnZW50TWl4aW4uYXNzZXRfdHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF90cmFuc2ZlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50L25vX2NvdXBvbi5weTo5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1My0xNTgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gYW5kICgKICAgIC8vICAgICBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTQKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1My0xNTgKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gYW5kICgKICAgIC8vICAgICBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgIG9yIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA2CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYKICAgIC8vIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNTYtMTU3CiAgICAvLyBub3Qgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX3RydWVANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTU3CiAgICAvLyBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE1Ni0xNTcKICAgIC8vIG5vdCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyBvciBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANgoKYXNzZXRfdHJhbnNmZXJfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA3OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTUyLTE1OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgYW5kICgKICAgIC8vICAgICAgICAgbm90IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICAgICAgb3IgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKQogICAgLy8gKSwgZXJyLlNFQ09OREFSWV9NQVJLRVRfQ0xPU0VECiAgICBhc3NlcnQgLy8gU2Vjb25kYXJ5IG1hcmtldCBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE2OS0xNzEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdHJhbnNmZXIgcmlnaHQgdG8gRC1BU0Egb3duZXJzLiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IHJlbGF5IG9uIG90aGVyCiAgICAvLyAjIHJvbGVzLCBleHRlcm5hbCBBcHBzIHRocm91Z2ggQzJDIGNhbGxzIChlLmcuLCBhbiBvcmRlciBib29rKSwgb3Igb2ZmLWNoYWluIHRyYW5zZmVyIGFnZW50cy4KICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3MgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTc2CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAzCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE3NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MAogICAgLy8gYXNzZXJ0IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MgIT0gcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzLCBlcnIuU0VMRl9UUkFOU0ZFUgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgICE9CiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciBtdXN0IGJlIGRpZmZlcmVudAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTkxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDIKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE5MgogICAgLy8gYXNzZXJ0IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2MwogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlCiAgICBleHRyYWN0IDQwIDgKICAgIGJ1cnkgOQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY0CiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRzID4gVUludDY0KDApOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTgKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4LTU5CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgNgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU4LTU5CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAyMAogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMjE6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTctNjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuTk9OX0ZVTkdJQkxFX1VOSVRTCiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciB1bml0cyBhcmUgbm90IGZ1bmdpYmxlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC9ub19jb3Vwb24ucHk6NDUtNDYKICAgIC8vICMgVHJhbnNmZXJyZWQgdW5pdHMgdmFsdWUgKG11c3QgYmUgY29tcHV0ZWQgYmVmb3JlIHRoZSB0cmFuc2ZlcikKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIGRpZyA2CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA1CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0OQogICAgLy8gcmV0dXJuIHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBkaWcgMwogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzEKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwMgogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzIKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzIC09IHVuaXRzCiAgICBzd2FwCiAgICAtCiAgICBpdG9iCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NTIKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID09IFVJbnQ2NCgwKToKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo1MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNDAKICAgIGRpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBVSW50NjQoMCkKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojc2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50L25vX2NvdXBvbi5weTo1MgogICAgLy8gcmV0dXJuIHVuaXRzICogc2VuZGVyX3VuaXRfdmFsdWUgKyBhY2NydWVkX2ludGVyZXN0CiAgICBkaWcgNAogICAgKgogICAgZGlnIDUKICAgICsKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQvbm9fY291cG9uLnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAyMDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMjEKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUA5OgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUgPSBzZW5kZXJfdW5pdF92YWx1ZQogICAgZGlnIDUKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgZGlnIDEwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucwogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDgKICAgIHB1c2hpbnQgNDgKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTAKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANwoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5hc3NldF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIHB1c2hpbnQgMzgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggNyBvZiAodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIGRpZyAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNDIKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuQXNzZXRNZXRhZGF0YQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIKICAgIGJ5dGVjIDUgLy8gMHg1MjMyMzAyMwogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mjc3CiAgICAvLyBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEuYnl0ZXMKICAgIGJ5dGVjIDIzIC8vICJtZXRhZGF0YSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5hc3NldF91cGRhdGVbcm91dGluZ10oKSAtPiB2b2lkOgphc3NldF91cGRhdGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAzOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA3IG9mICh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OFszMl0sKGxlbit1dGY4W10pKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0MgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Bc3NldE1ldGFkYXRhCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyODQtMjg3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IGRpc2FibGUgRC1BU0EgYXBwbGljYXRpb24gdXBkYXRhYmlsaXR5IG9yIGNoYW5nZSBpdHMgYXV0aG9yaXphdGlvbnMuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyODgKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjMgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjI3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50czoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxMQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gZW5tLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzEyCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzEzCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNQogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZHVwCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxNgogICAgLy8gaWYgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPiAxOgogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMTcKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZHVwCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGJ1cnkgMQoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjAKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYXQogICAgZGlnIDEKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGJ1cnkgNAogICAgcHVzaGludCAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzIwLTMyMQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFhdCiAgICBzd2FwCiAgICBkaWcgMQogICAgPD0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMxOS0zMjIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1tjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYXQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjMtMzI1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI2CiAgICAvLyBpZiBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMyOAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI5CiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFhdCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMjgtMzI5CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWF0KICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzI3LTMzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzW2NmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFhdCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfQ0xPU1VSRV9EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IGNsb3N1cmUgZGF0ZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMxCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDkgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzMxLTMzMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzM1CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1zZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNgogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGUoCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9c2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1zZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlLAogICAgLy8gKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToyOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5zZXRfZGVmYXVsdF9zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYudHJ1c3RlZSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1MgogICAgLy8gc2VsZi5hc3NldF9kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDIxIC8vICJhc3NldF9kZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzUzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGVubS5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwCiAgICA9PQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ1LTE0OAogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ3CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0Ni0xNDcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDYtMTQ4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE0OAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTQ3LTE0OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGRpZyAzCiAgICA+CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDYtMTQ4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxNDQtMTQ5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzEKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTggLy8gMHg1MjM1MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjMxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzgzCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4NAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozODUKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5aRVJPX1VOSVRTCiAgICBkaWcgMQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM4NgogICAgLy8gYXNzZXJ0IHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cyA8PSBzZWxmLnRvdGFsX3VuaXRzLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg4CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6Mzg5CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMzIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjM5MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA0MAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MzkxCiAgICAvLyByZXR1cm4gc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF9hc3NldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MDMKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfUEVSRk9STUFOVCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MDQKICAgIC8vIGlmIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5tYXR1cml0eV9kYXRlID4gMDoKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANAogICAgZHVwCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwNQogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9NQVRVUkVEKQogICAgcHVzaGludCA0CiAgICBidXJ5IDIKCmdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwNi00MDcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gZ3JhY2Ugb3IgZGVsaW5xdWVuY3kgcGVyaW9kcwogICAgLy8gaWYgc2VsZi5hc3NldF9kZWZhdWx0ZWQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQwOAogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9ERUZBVUxURUQpCiAgICBwdXNoaW50IDMKICAgIGJ1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDExCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTIKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmlkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDUKICAgIC8vIHJldHVybiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgZHVwMgogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE1CiAgICAvLyBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQxNgogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE3CiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDE4CiAgICAvLyB0b3RhbF9zdXBwbHk9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1zZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDIxCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjIKICAgIC8vIGlzc3VhbmNlX2RhdGU9c2VsZi5pc3N1YW5jZV9kYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQyMwogICAgLy8gbWF0dXJpdHlfZGF0ZT1zZWxmLm1hdHVyaXR5X2RhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDI0CiAgICAvLyBzdXNwZW5kZWQ9c2VsZi5hc3NldF9zdXNwZW5kZWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MjUKICAgIC8vIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgZGlnIDE1CiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MTAtNDI2CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9c2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuaWQsCiAgICAvLyAgICAgb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsKCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1zZWxmLnVuaXRfdmFsdWUsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgLy8gICAgIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIC8vICAgICB0b3RhbF9zdXBwbHk9c2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBjaXJjdWxhdGluZ19zdXBwbHk9c2VsZi5jaXJjdWxhdGluZ191bml0cywKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9c2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUsCiAgICAvLyAgICAgcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPXNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlLAogICAgLy8gICAgIGlzc3VhbmNlX2RhdGU9c2VsZi5pc3N1YW5jZV9kYXRlLAogICAgLy8gICAgIG1hdHVyaXR5X2RhdGU9c2VsZi5tYXR1cml0eV9kYXRlLAogICAgLy8gICAgIHN1c3BlbmRlZD1zZWxmLmFzc2V0X3N1c3BlbmRlZCwKICAgIC8vICAgICBwZXJmb3JtYW5jZT1hcmM0LlVJbnQ4KHBlcmZvcm1hbmNlKSwKICAgIC8vICkKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIHVuY292ZXIgMTQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlYyAyOCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTozOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfdGltZV9ldmVudHNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfdGltZV9ldmVudHM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MzYKICAgIC8vIHRpbWVfZXZlbnRzID0gdHlwLlRpbWVFdmVudHMoKQogICAgYnl0ZWMgMzAgLy8gMHgwMDAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQzNwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0MzgKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDI3IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5jb3JlX2ZpbmFuY2lhbC5jb21tb24uQ29yZUZpbmFuY2lhbENvbW1vbk1peGluLmdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGU6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NTAKICAgIC8vIChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlLCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjQ0OS00NTEKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICAoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSkKICAgIC8vICkKICAgIHN3YXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5nZXRfYXNzZXRfbWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weTo0NjIKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6NDUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dvdl9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nb3Zfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzcKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDEwIC8vIDB4NTIzNzMwMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgNTYKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTE1CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF9vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9vcGVuOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY4CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAxMSAvLyAweDUyMzQzMDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjgKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBlbm0uU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNCAvLyAyMDAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE0MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9hc3NldF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDIKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDYKICAgIC8vIHVuaXRzPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0LTE1MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1VSW50NjQoMCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPVVJbnQ2NCgwKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9RmFsc2UsCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMjggLy8gMHgwMAogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfY2xvc2Vbcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X2Nsb3NlOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2OAogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTEgLy8gMHg1MjM0MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzQKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NQogICAgLy8gZGVsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE3NwogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNzgKICAgIC8vIHJldHVybiBjbG9zZWRfdW5pdHMsIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHN3YXAKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzczoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcywgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwMgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzID0gcGF5bWVudF9hZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIwNQogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X2dldF9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfaW5mbzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMjIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTkKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDUgLy8gMHg1MjMyMzAyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjAKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzQKICAgIC8vIHNlbGYub3BfZGFlbW9uLnZhbHVlID0gYWRkcmVzcwogICAgYnl0ZWMgMTkgLy8gMHg1MjMyMzUyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19hc3NpZ25fcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfYXNzaWduX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9hc3NldF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnQgMjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMgogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgNSAvLyAweDUyMzIzMDIzCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwNwogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIHNlbGYuX3Vwc2VydF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgY29uZmlnKQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3Vwc2VydF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gc2VsZi5fdXBzZXJ0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCBjb25maWcpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNQogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxMCAvLyAweDUyMzczMDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTkKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZykKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBzZWxmLl91cHNlcnRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIGNvbmZpZykKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIGR1cAogICAgcHVzaGludCA4MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fdXBzZXJ0X3JvbGVAMTQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzODMwMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl91cHNlcnRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI2CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI3CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludCA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNDMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjgKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIGR1cAogICAgcHVzaGludCA1MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMTggLy8gMHg1MjM1MzAyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMzCiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM1CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAxNyAvLyAweDUyMzYzMDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzcKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDEwIC8vIDB4NTIzNzMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MQogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQ0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzODMwMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NQogICAgLy8gZGVsIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nb3ZfYXNzZXRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ292X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo3NwogICAgLy8gYXNzZXJ0IHNlbGYuX3JvbGVfaXNfYWN0aXZlKHNlbGYuYXV0aG9yaXR5LCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMTAgLy8gMHg1MjM3MzAyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NgogICAgLy8gc2VsZi5hc3NldF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDIwIC8vICJhc3NldF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0NwogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QgICMgVE9ETzogVXBkYXRlIHNwZWNzIGFuZCBhZGQgdGVzdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X2FycmFuZ2VyW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19nZXRfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyByZXR1cm4gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MwogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMTEgLy8gMHg1MjM0MzAyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDE4IC8vIDB4NTIzNTMwMjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3NgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMTAgLy8gMHg1MjM3MzAyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc3CiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmludGVyZXN0X29yYWNsZSwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyMzgzMDIzCiAgICB1bmNvdmVyIDUKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDI4IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX2NvbmZpZzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTQKICAgIC8vIHJvbGUgPSByb2xlX2lkLmFzX3VpbnQ2NCgpCiAgICBidG9pCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlKQogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5NwogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYtMzI3CiAgICAvLyBtYXRjaCByb2xlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlQ29uZmlnKAogICAgLy8gICAgICAgICAgICAgcm9sZV92YWxpZGl0eV9zdGFydD1VSW50NjQoMCksIHJvbGVfdmFsaWRpdHlfZW5kPVVJbnQ2NCgwKQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgICAgICAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8xQDMgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV80QDYgcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI3CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfNUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjUgLy8gMHg1MjM4MzAyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU1CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMi0zMjQKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLmludGVyZXN0X29yYWNsZSwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzI1CiAgICAvLyByZXR1cm4gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTgKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDEwIC8vIDB4NTIzNzMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMAogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfM0A1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMxMwogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE3IC8vIDB4NTIzNjMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTItMzE0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTUKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV9jb25maWdfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX2NvbmZpZ0A5CgpyYmFjX2dldF9yb2xlX2NvbmZpZ19zd2l0Y2hfY2FzZV8yQDQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDE4IC8vIDB4NTIzNTMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzEwCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX2NvbmZpZ19hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfY29uZmlnQDkKCnJiYWNfZ2V0X3JvbGVfY29uZmlnX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDMKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDExIC8vIDB4NTIzNDMwMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NQogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDItMzA0CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwNQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKcmJhY19nZXRfcm9sZV9jb25maWdfc3dpdGNoX2Nhc2VfMEAyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OC0zMDAKICAgIC8vIHJldHVybiB0eXAuUm9sZUNvbmZpZygKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfY29uZmlnX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV9jb25maWdAOQoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwubm9fY291cG9uLk5vQ291cG9uQ2FzaGZsb3dNaXhpbi5kYXlfY291bnRfZmFjdG9yKCkgLT4gYnl0ZXM6CmRheV9jb3VudF9mYWN0b3I6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxNwogICAgLy8gZGVmIGRheV9jb3VudF9mYWN0b3Ioc2VsZikgLT4gdHlwLkRheUNvdW50RmFjdG9yOgogICAgcHJvdG8gMCAxCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weToxOC0xOQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgIC0KICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjIwCiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gc2VsZi5tYXR1cml0eV9kYXRlIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MjEKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjE2MgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNSAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjIDUgLy8gODY0MDAKICAgIC8KCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MjQtMjcKICAgIC8vIHJldHVybiB0eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFjY3J1ZWRfcGVyaW9kLAogICAgLy8gICAgIGRlbm9taW5hdG9yPXByaW5jaXBhbF9wZXJpb2QsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmNvcmVfZmluYW5jaWFsLm5vX2NvdXBvbi5Ob0NvdXBvbkNhc2hmbG93TWl4aW4uYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjMzLTM1CiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50LCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6MzYKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTozNwogICAgLy8gYWNjcnVlZF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvcgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvbm9fY291cG9uLnB5OjM4CiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvcgogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MQogICAgLy8gKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NDAtNDEKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgKgogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9ub19jb3Vwb24ucHk6NDAtNDIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgLy8gKiBhY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MwogICAgLy8gLy8gKGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kKQogICAgcHVzaGludCAxMDAwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTo0MC00MwogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50CiAgICAvLyAqIGFjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoY3N0LkJQUyAqIHByaW5jaXBhbF9wZXJpb2QpCiAgICAvCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL25vX2NvdXBvbi5weTozOS00NAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50CiAgICAvLyAgICAgKiBhY2NydWVkX3BlcmlvZAogICAgLy8gICAgIC8vIChjc3QuQlBTICogcHJpbmNpcGFsX3BlcmlvZCkKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IHByaW5jaXBhbF9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCBjaGVja3MKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuY29yZV9maW5hbmNpYWwuY29tbW9uLkNvcmVGaW5hbmNpYWxDb21tb25NaXhpbi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDcKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjEwOQogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExMAogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTA5LTExMAogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMDgtMTExCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDEzCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMzEgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAzMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTM6CiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMTcKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW2lkeF0KICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvY29yZV9maW5hbmNpYWwvY29tbW9uLnB5OjExOAogICAgLy8gdGltZV9mID0gdGltZV9ldmVudHNbaWR4ICsgMV0KICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTE5CiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL2NvcmVfZmluYW5jaWFsL2NvbW1vbi5weToxMjAKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgcHVzaGludCAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTIxLTEyMgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gbW9kdWxlcy9jb3JlX2ZpbmFuY2lhbC9jb21tb24ucHk6MTIxLTEyNAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDUgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgNQogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANjoKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzMKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjM0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgNDQ4CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzYKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCwgdW5pdHM6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MzcKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKYWNjb3VudF90b3RhbF91bml0c192YWx1ZToKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozOQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBBY2NvdW50KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0MQogICAgLy8gaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo0MC00MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkgLT4gdm9pZDoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ4CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IFVJbnQ2NCgwKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NDkKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVubS5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjIDQgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTUKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYwCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5LTYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjEKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OS02MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTgtNjIKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUyCiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzID09IHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hcnJhbmdlcihUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImFzc2V0X2RlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5hc3NlcnRfaXNfbm90X2Fzc2V0X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfYXNzZXRfc3VzcGVuZGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYXNzZXRfc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImFzc2V0X3N1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRfdmFsaWRfcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfcm9sZShzZWxmLCByb2xlX2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OS05NgogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NQogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODktOTYKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDcKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg5LTk2CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOAo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2349], "errorMessage": "Can not distribute zero units"}, {"pc": [1015], "errorMessage": "Coupon rates are not properly defined"}, {"pc": [910], "errorMessage": "D-ASA already configured"}, {"pc": [3950], "errorMessage": "Defaulted"}, {"pc": [917], "errorMessage": "Denomination asset is not properly set"}, {"pc": [928], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [2365], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [1848, 1929], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1006], "errorMessage": "Interest rate is not properly defined"}, {"pc": [1152, 1316, 1399, 1802, 1817, 2339, 2722, 2793, 2845, 2916, 2945], "errorMessage": "Invalid account holding address"}, {"pc": [3087, 3111, 3135, 3159, 3183, 3240, 3268, 3290, 3312, 3334, 3513, 3531, 3546, 3561, 3576], "errorMessage": "Invalid account role address"}, {"pc": [1170], "errorMessage": "Invalid amount of units for the account"}, {"pc": [995], "errorMessage": "Invalid day-count convention ID"}, {"pc": [3224, 3503, 4012], "errorMessage": "Invalid role identifier"}, {"pc": [2210], "errorMessage": "Invalid secondary market closure date"}, {"pc": [2176], "errorMessage": "Invalid secondary market opening date"}, {"pc": [961], "errorMessage": "Minimum denomination is not a divisor of principal"}, {"pc": [1404], "errorMessage": "No D-ASA units"}, {"pc": [1381, 1461, 1784, 2139, 2253, 2330, 2713, 2768, 2777, 2834, 2901, 3357, 3942], "errorMessage": "Not authorized"}, {"pc": [1515], "errorMessage": "Not enough funds for the payment"}, {"pc": [1413], "errorMessage": "Not mature"}, {"pc": [2322], "errorMessage": "Primary distribution is closed"}, {"pc": [1141], "errorMessage": "Primary distribution not yet executed"}, {"pc": [1775], "errorMessage": "Secondary market is closed"}, {"pc": [1833], "errorMessage": "Sender and receiver must be different"}, {"pc": [1898], "errorMessage": "Sender and receiver units are not fungible"}, {"pc": [3834, 3958], "errorMessage": "Suspended operations"}, {"pc": [1027, 2144], "errorMessage": "Time events length is invalid"}, {"pc": [3707], "errorMessage": "Time events must be set in the future"}, {"pc": [3785], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [1088], "errorMessage": "Time periods are not properly defined"}, {"pc": [3807], "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)"}, {"pc": [1837], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [533], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [539], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [543], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [547], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1508], "errorMessage": "account opted into asset"}, {"pc": [1582], "errorMessage": "asset exists"}, {"pc": [3902, 3917], "errorMessage": "check BoxMap entry exists"}, {"pc": [1160, 1452, 1465, 1484, 1519, 1553, 1841, 1855, 1864, 1871, 1882, 1889, 1903, 1924, 1966, 2010, 2373, 3828, 3844, 3860], "errorMessage": "check self.account entry exists"}, {"pc": [3375, 3940], "errorMessage": "check self.arranger exists"}, {"pc": [2447, 3948], "errorMessage": "check self.asset_defaulted exists"}, {"pc": [2549, 3956], "errorMessage": "check self.asset_suspended exists"}, {"pc": [1546, 1586, 2353, 2468, 2857, 3873], "errorMessage": "check self.circulating_units exists"}, {"pc": [2480, 3629, 3790], "errorMessage": "check self.day_count_convention exists"}, {"pc": [1578, 2459], "errorMessage": "check self.denomination_asset_id exists"}, {"pc": [2509], "errorMessage": "check self.interest_rate exists"}, {"pc": [1206, 2160, 2539, 3612], "errorMessage": "check self.issuance_date exists"}, {"pc": [1220, 1258, 1411, 2185, 2193, 2430, 2544, 3622], "errorMessage": "check self.maturity_date exists"}, {"pc": [2681], "errorMessage": "check self.metadata exists"}, {"pc": [1421, 1434], "errorMessage": "check self.op_daemon exists"}, {"pc": [2314, 2534], "errorMessage": "check self.primary_distribution_closure_date exists"}, {"pc": [1125, 1135, 2300, 2529], "errorMessage": "check self.primary_distribution_opening_date exists"}, {"pc": [1182, 2494, 3674], "errorMessage": "check self.principal_discount exists"}, {"pc": [1759, 1769, 2224, 2659], "errorMessage": "check self.secondary_market_closure_date exists"}, {"pc": [1748, 2219, 2654], "errorMessage": "check self.secondary_market_opening_date exists"}, {"pc": [1473, 1502, 2464], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [908, 1321, 1377, 1737, 2134, 2289, 2629, 2772], "errorMessage": "check self.status exists"}, {"pc": [2642], "errorMessage": "check self.time_events exists"}, {"pc": [2361, 2403, 2524], "errorMessage": "check self.total_units exists"}, {"pc": [1591, 2390, 2473], "errorMessage": "check self.unit_value exists"}, {"pc": [848, 870, 888, 1075, 1361, 2055, 2094, 2116, 2197, 3025, 3711], "errorMessage": "invalid array length header"}, {"pc": [2243, 2703, 3347], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [861], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1369, 3033], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [901], "errorMessage": "invalid number of bytes for arc4.dynamic_array>"}, {"pc": [882, 2127], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1111, 1309, 1355, 1716, 1724, 2032, 2276, 2695, 2752, 2760, 2826, 2887, 2895, 2937, 2961, 2985, 3019, 3207, 3389, 3473], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [842], "errorMessage": "invalid number of bytes for arc4.uint16"}, {"pc": [786, 795, 804, 813, 822, 1119, 1732, 2284], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [831, 3009, 3197, 3463], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2060, 2099], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.AssetMetadata"}, {"pc": [2047, 2086], "errorMessage": "invalid tail pointer at index 7 of (uint8,uint8,uint8,uint8,uint8,uint8,uint8[32],(len+utf8[]))"}, {"pc": [2042, 2081], "errorMessage": "invalid tuple encoding"}, {"pc": [2486, 2501, 2516, 2557], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" -APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) - -def _parse_abi_args(args: object | None = None) -> list[object] | None: - """Helper to parse ABI args into the format expected by underlying client""" - if args is None: - return None - - def convert_dataclass(value: object) -> object: - if dataclasses.is_dataclass(value): - return tuple(convert_dataclass(getattr(value, field.name)) for field in dataclasses.fields(value)) - elif isinstance(value, (list, tuple)): - return type(value)(convert_dataclass(item) for item in value) - return value - - match args: - case tuple(): - method_args = list(args) - case _ if dataclasses.is_dataclass(args): - method_args = [getattr(args, field.name) for field in dataclasses.fields(args)] - case _: - raise ValueError("Invalid 'args' type. Expected 'tuple' or 'TypedDict' for respective typed arguments.") - - return [ - convert_dataclass(arg) if not isinstance(arg, algokit_utils.AppMethodCallTransactionArgument) else arg - for arg in method_args - ] if method_args else None - -def _init_dataclass(cls: type, data: dict) -> object: - """ - Recursively instantiate a dataclass of type `cls` from `data`. - - For each field on the dataclass, if the field type is also a dataclass - and the corresponding data is a dict, instantiate that field recursively. - """ - field_values = {} - for field in dataclasses.fields(cls): - field_value = data.get(field.name) - # Check if the field expects another dataclass and the value is a dict. - if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict): - field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value) - else: - field_values[field.name] = field_value - return cls(**field_values) - -@dataclasses.dataclass(frozen=True) -class AccountInfo: - """Struct for AccountInfo""" - payment_address: str - units: int - unit_value: int - paid_coupons: int - suspended: bool - -@dataclasses.dataclass(frozen=True) -class AssetInfo: - """Struct for AssetInfo""" - denomination_asset_id: int - settlement_asset_id: int - outstanding_principal: int - unit_value: int - day_count_convention: int - principal_discount: int - interest_rate: int - total_supply: int - circulating_supply: int - primary_distribution_opening_date: int - primary_distribution_closure_date: int - issuance_date: int - maturity_date: int - suspended: bool - performance: int - -@dataclasses.dataclass(frozen=True) -class AssetMetadata: - """Struct for AssetMetadata""" - contract_type: int - calendar: int - business_day_convention: int - end_of_month_convention: int - prepayment_effect: int - penalty_type: int - prospectus_hash: bytes - prospectus_url: str - -@dataclasses.dataclass(frozen=True) -class DayCountFactor: - """Struct for DayCountFactor""" - numerator: int - denominator: int - -@dataclasses.dataclass(frozen=True) -class CurrentUnitsValue: - """Struct for CurrentUnitsValue""" - units_value: int - accrued_interest: int - day_count_factor: DayCountFactor - -@dataclasses.dataclass(frozen=True) -class PaymentAmounts: - """Struct for PaymentAmounts""" - interest: int - principal: int - -@dataclasses.dataclass(frozen=True) -class PaymentResult: - """Struct for PaymentResult""" - amount: int - timestamp: int - context: bytes - -@dataclasses.dataclass(frozen=True) -class RoleConfig: - """Struct for RoleConfig""" - role_validity_start: int - role_validity_end: int - -@dataclasses.dataclass(frozen=True) -class SecondaryMarketSchedule: - """Struct for SecondaryMarketSchedule""" - secondary_market_opening_date: int - secondary_market_closure_date: int - - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetConfigArgs: - """Dataclass for asset_config arguments""" - denomination_asset_id: int - settlement_asset_id: int - principal: int - principal_discount: int - minimum_denomination: int - day_count_convention: int - interest_rate: int - coupon_rates: list[int] - time_events: list[int] - time_periods: list[tuple[int, int]] - - @property - def abi_method_signature(self) -> str: - return "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class GetAccountUnitsCurrentValueArgs: - """Dataclass for get_account_units_current_value arguments""" - holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class GetPaymentAmountArgs: - """Dataclass for get_payment_amount arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "get_payment_amount(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PayPrincipalArgs: - """Dataclass for pay_principal arguments""" - holding_address: str - payment_info: bytes | str - - @property - def abi_method_signature(self) -> str: - return "pay_principal(address,byte[])(uint64,uint64,byte[])" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetTransferArgs: - """Dataclass for asset_transfer arguments""" - sender_holding_address: str - receiver_holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "asset_transfer(address,address,uint64)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class SetSecondaryTimeEventsArgs: - """Dataclass for set_secondary_time_events arguments""" - secondary_market_time_events: list[int] - - @property - def abi_method_signature(self) -> str: - return "set_secondary_time_events(uint64[])(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class SetDefaultStatusArgs: - """Dataclass for set_default_status arguments""" - defaulted: bool - - @property - def abi_method_signature(self) -> str: - return "set_default_status(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class PrimaryDistributionArgs: - """Dataclass for primary_distribution arguments""" - holding_address: str - units: int - - @property - def abi_method_signature(self) -> str: - return "primary_distribution(address,uint64)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGovSuspensionArgs: - """Dataclass for account_gov_suspension arguments""" - holding_address: str - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "account_gov_suspension(address,bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountOpenArgs: - """Dataclass for account_open arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_open(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountCloseArgs: - """Dataclass for account_close arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_close(address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountUpdatePaymentAddressArgs: - """Dataclass for account_update_payment_address arguments""" - holding_address: str - payment_address: str - - @property - def abi_method_signature(self) -> str: - return "account_update_payment_address(address,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AccountGetInfoArgs: - """Dataclass for account_get_info arguments""" - holding_address: str - - @property - def abi_method_signature(self) -> str: - return "account_get_info(address)(address,uint64,uint64,uint64,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRotateArrangerArgs: - """Dataclass for rbac_rotate_arranger arguments""" - new_arranger: str - - @property - def abi_method_signature(self) -> str: - return "rbac_rotate_arranger(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacSetOpDaemonArgs: - """Dataclass for rbac_set_op_daemon arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_set_op_daemon(address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacAssignRoleArgs: - """Dataclass for rbac_assign_role arguments""" - role_id: int - role_address: str - config: bytes | str - - @property - def abi_method_signature(self) -> str: - return "rbac_assign_role(uint8,address,byte[])uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacRevokeRoleArgs: - """Dataclass for rbac_revoke_role arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_revoke_role(uint8,address)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGovAssetSuspensionArgs: - """Dataclass for rbac_gov_asset_suspension arguments""" - suspended: bool - - @property - def abi_method_signature(self) -> str: - return "rbac_gov_asset_suspension(bool)uint64" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetAddressRolesArgs: - """Dataclass for rbac_get_address_roles arguments""" - address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class RbacGetRoleConfigArgs: - """Dataclass for rbac_get_role_config arguments""" - role_id: int - role_address: str - - @property - def abi_method_signature(self) -> str: - return "rbac_get_role_config(uint8,address)(uint64,uint64)" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetCreateArgs: - """Dataclass for asset_create arguments""" - arranger: str - metadata: AssetMetadata - - @property - def abi_method_signature(self) -> str: - return "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - -@dataclasses.dataclass(frozen=True, kw_only=True) -class AssetUpdateArgs: - """Dataclass for asset_update arguments""" - metadata: AssetMetadata - - @property - def abi_method_signature(self) -> str: - return "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void" - - -class _ZeroCouponBondUpdate: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppUpdateMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - return self.app_client.params.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - -class ZeroCouponBondParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_ZeroCouponBondUpdate": - return _ZeroCouponBondUpdate(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - })) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - })) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - })) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - })) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - })) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - })) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - })) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - })) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - })) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - })) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - })) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.AppCallMethodCallParams: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> algokit_utils.AppCallParams: - return self.app_client.params.bare.clear_state( - params, - - ) - - -class _ZeroCouponBondUpdateTransaction: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - return self.app_client.create_transaction.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - -class ZeroCouponBondCreateTransactionParams: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_ZeroCouponBondUpdateTransaction": - return _ZeroCouponBondUpdateTransaction(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - })) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - })) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - })) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - })) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - })) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - })) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - })) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - })) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - })) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - })) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - })) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - })) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - })) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - })) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - })) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - })) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - })) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - })) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - })) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - })) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - })) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - })) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - })) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - })) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - })) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None - ) -> algokit_utils.BuiltTransactions: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - })) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - - ) -> Transaction: - return self.app_client.create_transaction.bare.clear_state( - params, - - ) - - -class _ZeroCouponBondUpdateSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() - response = self.app_client.send.update(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - }), send_params=send_params, compilation_params=compilation_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppUpdateTransactionResult[None], parsed_response) - - -class ZeroCouponBondSend: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def update(self) -> "_ZeroCouponBondUpdateSend": - return _ZeroCouponBondUpdateSend(self.app_client) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[None], parsed_response) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[CurrentUnitsValue]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CurrentUnitsValue, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[CurrentUnitsValue], parsed_response) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentAmounts]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentAmounts, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentAmounts], parsed_response) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[PaymentResult]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(PaymentResult, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[PaymentResult], parsed_response) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[SecondaryMarketSchedule]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(SecondaryMarketSchedule, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[SecondaryMarketSchedule], parsed_response) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AssetInfo]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AssetInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AssetInfo], parsed_response) - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[list[int]]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[list[int]], parsed_response) - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AssetMetadata]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AssetMetadata, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AssetMetadata], parsed_response) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[int, int]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[int, int]], parsed_response) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[AccountInfo]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AccountInfo, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[AccountInfo], parsed_response) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[int]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[str]: - - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[str], parsed_response) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[RoleConfig]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": method_args, - }), send_params=send_params) - parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleConfig, typing.cast(dict, response.abi_return))) # type: ignore - return typing.cast(algokit_utils.SendAppTransactionResult[RoleConfig], parsed_response) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[None]: - method_args = _parse_abi_args(args) - params = params or algokit_utils.CommonAppCallParams() - response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": method_args, - }), send_params=send_params) - parsed_response = response - return typing.cast(algokit_utils.SendAppTransactionResult[None], parsed_response) - - def clear_state( - self, - params: algokit_utils.AppClientBareCallParams | None = None, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAppTransactionResult[algokit_utils.ABIReturn]: - return self.app_client.send.bare.clear_state( - params, - send_params=send_params, - ) - - -class GlobalStateValue(typing.TypedDict): - """Shape of global_state state key values""" - arranger: str - op_daemon: str - asset_suspended: int - asset_defaulted: int - total_units: int - circulating_units: int - unit_value: int - status: int - denomination_asset_id: int - settlement_asset_id: int - day_count_convention: int - metadata: bytes - principal_discount: int - interest_rate: int - total_coupons: int - primary_distribution_opening_date: int - primary_distribution_closure_date: int - issuance_date: int - secondary_market_opening_date: int - secondary_market_closure_date: int - maturity_date: int - -class BoxStateValue(typing.TypedDict): - """Shape of box state key values""" - time_events: list[int] - -class ZeroCouponBondState: - """Methods to access state for the current ZeroCouponBond app""" - - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - @property - def global_state( - self - ) -> "_GlobalState": - """Methods to access global_state for the current app""" - return _GlobalState(self.app_client) - - @property - def box( - self - ) -> "_BoxState": - """Methods to access box for the current app""" - return _BoxState(self.app_client) - -class _GlobalState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = {} - - def get_all(self) -> GlobalStateValue: - """Get all current keyed values from global_state state""" - result = self.app_client.state.global_state.get_all() - if not result: - return typing.cast(GlobalStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.global_state.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(GlobalStateValue, converted) - - @property - def arranger(self) -> str: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def op_daemon(self) -> str: - """Get the current value of the op_daemon key in global_state state""" - value = self.app_client.state.global_state.get_value("op_daemon") - if isinstance(value, dict) and "address" in self._struct_classes: - return _init_dataclass(self._struct_classes["address"], value) # type: ignore - return typing.cast(str, value) - - @property - def asset_suspended(self) -> int: - """Get the current value of the asset_suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def asset_defaulted(self) -> int: - """Get the current value of the asset_defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("asset_defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def status(self) -> int: - """Get the current value of the status key in global_state state""" - value = self.app_client.state.global_state.get_value("status") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMBytes"], value) # type: ignore - return typing.cast(bytes, value) - - @property - def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def primary_distribution_opening_date(self) -> int: - """Get the current value of the primary_distribution_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def secondary_market_opening_date(self) -> int: - """Get the current value of the secondary_market_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - - @property - def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore - return typing.cast(int, value) - -class _BoxState: - def __init__(self, app_client: algokit_utils.AppClient): - self.app_client = app_client - - # Pre-generated mapping of value types to their struct classes - self._struct_classes: dict[str, typing.Type[typing.Any]] = { - "RoleConfig": RoleConfig, - "AccountInfo": AccountInfo - } - - def get_all(self) -> BoxStateValue: - """Get all current keyed values from box state""" - result = self.app_client.state.box.get_all() - if not result: - return typing.cast(BoxStateValue, {}) - - converted = {} - for key, value in result.items(): - key_info = self.app_client.app_spec.state.keys.box.get(key) - struct_class = self._struct_classes.get(key_info.value_type) if key_info else None - converted[key] = ( - _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) - else value - ) - return typing.cast(BoxStateValue, converted) - - @property - def time_events(self) -> list[int]: - """Get the current value of the time_events key in box state""" - value = self.app_client.state.box.get_value("time_events") - if isinstance(value, dict) and "uint64[]" in self._struct_classes: - return _init_dataclass(self._struct_classes["uint64[]"], value) # type: ignore - return typing.cast(list[int], value) - - @property - def account_manager(self) -> "_MapState[str, RoleConfig]": - """Get values from the account_manager map in box state""" - return _MapState( - self.app_client.state.box, - "account_manager", - self._struct_classes.get("RoleConfig") - ) - - @property - def primary_dealer(self) -> "_MapState[str, RoleConfig]": - """Get values from the primary_dealer map in box state""" - return _MapState( - self.app_client.state.box, - "primary_dealer", - self._struct_classes.get("RoleConfig") - ) - - @property - def trustee(self) -> "_MapState[str, RoleConfig]": - """Get values from the trustee map in box state""" - return _MapState( - self.app_client.state.box, - "trustee", - self._struct_classes.get("RoleConfig") - ) - - @property - def authority(self) -> "_MapState[str, RoleConfig]": - """Get values from the authority map in box state""" - return _MapState( - self.app_client.state.box, - "authority", - self._struct_classes.get("RoleConfig") - ) - - @property - def interest_oracle(self) -> "_MapState[str, RoleConfig]": - """Get values from the interest_oracle map in box state""" - return _MapState( - self.app_client.state.box, - "interest_oracle", - self._struct_classes.get("RoleConfig") - ) - - @property - def account(self) -> "_MapState[str, AccountInfo]": - """Get values from the account map in box state""" - return _MapState( - self.app_client.state.box, - "account", - self._struct_classes.get("AccountInfo") - ) - -_KeyType = typing.TypeVar("_KeyType") -_ValueType = typing.TypeVar("_ValueType") - -class _AppClientStateMethodsProtocol(typing.Protocol): - def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: - ... - def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: - ... - -class _MapState(typing.Generic[_KeyType, _ValueType]): - """Generic class for accessing state maps with strongly typed keys and values""" - - def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, - struct_class: typing.Type[_ValueType] | None = None): - self._state_accessor = state_accessor - self._map_name = map_name - self._struct_class = struct_class - - def get_map(self) -> dict[_KeyType, _ValueType]: - """Get all current values in the map""" - result = self._state_accessor.get_map(self._map_name) - if self._struct_class and result: - return {k: _init_dataclass(self._struct_class, v) if isinstance(v, dict) else v - for k, v in result.items()} # type: ignore - return typing.cast(dict[_KeyType, _ValueType], result or {}) - - def get_value(self, key: _KeyType) -> _ValueType | None: - """Get a value from the map by key""" - key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore - value = self._state_accessor.get_map_value(self._map_name, key_value) - if value is not None and self._struct_class and isinstance(value, dict): - return _init_dataclass(self._struct_class, value) # type: ignore - return typing.cast(_ValueType | None, value) - - -class ZeroCouponBondClient: - """Client for interacting with ZeroCouponBond smart contract""" - - @typing.overload - def __init__(self, app_client: algokit_utils.AppClient) -> None: ... - - @typing.overload - def __init__( - self, - *, - algorand: _AlgoKitAlgorandClient, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: ... - - def __init__( - self, - app_client: algokit_utils.AppClient | None = None, - *, - algorand: _AlgoKitAlgorandClient | None = None, - app_id: int | None = None, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> None: - if app_client: - self.app_client = app_client - elif algorand and app_id: - self.app_client = algokit_utils.AppClient( - algokit_utils.AppClientParams( - algorand=algorand, - app_spec=APP_SPEC, - app_id=app_id, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - else: - raise ValueError("Either app_client or algorand and app_id must be provided") - - self.params = ZeroCouponBondParams(self.app_client) - self.create_transaction = ZeroCouponBondCreateTransactionParams(self.app_client) - self.send = ZeroCouponBondSend(self.app_client) - self.state = ZeroCouponBondState(self.app_client) - - @staticmethod - def from_creator_and_name( - creator_address: str, - app_name: str, - algorand: _AlgoKitAlgorandClient, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - ) -> "ZeroCouponBondClient": - return ZeroCouponBondClient( - algokit_utils.AppClient.from_creator_and_name( - creator_address=creator_address, - app_name=app_name, - app_spec=APP_SPEC, - algorand=algorand, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ignore_cache=ignore_cache, - app_lookup_cache=app_lookup_cache, - ) - ) - - @staticmethod - def from_network( - algorand: _AlgoKitAlgorandClient, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "ZeroCouponBondClient": - return ZeroCouponBondClient( - algokit_utils.AppClient.from_network( - app_spec=APP_SPEC, - algorand=algorand, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - @property - def app_id(self) -> int: - return self.app_client.app_id - - @property - def app_address(self) -> str: - return self.app_client.app_address - - @property - def app_name(self) -> str: - return self.app_client.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_client.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_client.algorand - - def clone( - self, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> "ZeroCouponBondClient": - return ZeroCouponBondClient( - self.app_client.clone( - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - approval_source_map=approval_source_map, - clear_source_map=clear_source_map, - ) - ) - - def new_group(self) -> "ZeroCouponBondComposer": - return ZeroCouponBondComposer(self) - - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))"], - return_value: algokit_utils.ABIReturn | None - ) -> CurrentUnitsValue | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_payment_amount(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentAmounts | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["pay_principal(address,byte[])(uint64,uint64,byte[])"], - return_value: algokit_utils.ABIReturn | None - ) -> PaymentResult | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_transfer(address,address,uint64)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["set_secondary_time_events(uint64[])(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> SecondaryMarketSchedule | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["set_default_status(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["primary_distribution(address,uint64)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)"], - return_value: algokit_utils.ABIReturn | None - ) -> AssetInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_time_events()uint64[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_secondary_market_schedule()uint64[]"], - return_value: algokit_utils.ABIReturn | None - ) -> list[int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)"], - return_value: algokit_utils.ABIReturn | None - ) -> AssetMetadata | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_gov_suspension(address,bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_open(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_close(address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[int, int] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_update_payment_address(address,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["account_get_info(address)(address,uint64,uint64,uint64,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> AccountInfo | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_rotate_arranger(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_set_op_daemon(address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_assign_role(uint8,address,byte[])uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_revoke_role(uint8,address)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_gov_asset_suspension(bool)uint64"], - return_value: algokit_utils.ABIReturn | None - ) -> int | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_arranger()address"], - return_value: algokit_utils.ABIReturn | None - ) -> str | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_address_roles(address)(bool,bool,bool,bool,bool)"], - return_value: algokit_utils.ABIReturn | None - ) -> tuple[bool, bool, bool, bool, bool] | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["rbac_get_role_config(uint8,address)(uint64,uint64)"], - return_value: algokit_utils.ABIReturn | None - ) -> RoleConfig | None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: typing.Literal["asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void"], - return_value: algokit_utils.ABIReturn | None - ) -> None: ... - @typing.overload - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None: ... - - def decode_return_value( - self, - method: str, - return_value: algokit_utils.ABIReturn | None - ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | AccountInfo | AssetInfo | AssetMetadata | CurrentUnitsValue | None | PaymentAmounts | PaymentResult | RoleConfig | SecondaryMarketSchedule | int | list[int] | str | tuple[bool, bool, bool, bool, bool] | tuple[int, int]: - """Decode ABI return value for the given method.""" - if return_value is None: - return None - - arc56_method = self.app_spec.get_arc56_method(method) - decoded = return_value.get_arc56_value(arc56_method, self.app_spec.structs) - - # If method returns a struct, convert the dict to appropriate dataclass - if (arc56_method and - arc56_method.returns and - arc56_method.returns.struct and - isinstance(decoded, dict)): - struct_class = globals().get(arc56_method.returns.struct) - if struct_class: - return struct_class(**typing.cast(dict, decoded)) - return decoded - - -@dataclasses.dataclass(frozen=True) -class ZeroCouponBondMethodCallCreateParams( - algokit_utils.AppClientCreateSchema, algokit_utils.BaseAppClientMethodCallParams[ - AssetCreateArgs, - str | None, - ] -): - """Parameters for creating ZeroCouponBond contract using ABI""" - on_complete: typing.Literal[OnComplete.NoOpOC] | None = None - method: str | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallCreateParams: - method_args = _parse_abi_args(self.args) - return algokit_utils.AppClientMethodCallCreateParams( - **{ - **self.__dict__, - "method": self.method or getattr(self.args, "abi_method_signature", None), - "args": method_args, - } - ) - -@dataclasses.dataclass(frozen=True) -class ZeroCouponBondMethodCallUpdateParams( - algokit_utils.BaseAppClientMethodCallParams[ - AssetUpdateArgs, - str | None, - ] -): - """Parameters for calling ZeroCouponBond contract using ABI""" - on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None - method: str | None = None - - def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallParams: - method_args = _parse_abi_args(self.args) - return algokit_utils.AppClientMethodCallParams( - **{ - **self.__dict__, - "method": self.method or getattr(self.args, "abi_method_signature", None), - "args": method_args, - } - ) - -class ZeroCouponBondFactory(algokit_utils.TypedAppFactoryProtocol[ZeroCouponBondMethodCallCreateParams, ZeroCouponBondMethodCallUpdateParams, None]): - """Factory for deploying and managing ZeroCouponBondClient smart contracts""" - - def __init__( - self, - algorand: _AlgoKitAlgorandClient, - *, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - version: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ): - self.app_factory = algokit_utils.AppFactory( - params=algokit_utils.AppFactoryParams( - algorand=algorand, - app_spec=APP_SPEC, - app_name=app_name, - default_sender=default_sender, - default_signer=default_signer, - version=version, - compilation_params=compilation_params, - ) - ) - self.params = ZeroCouponBondFactoryParams(self.app_factory) - self.create_transaction = ZeroCouponBondFactoryCreateTransaction(self.app_factory) - self.send = ZeroCouponBondFactorySend(self.app_factory) - - @property - def app_name(self) -> str: - return self.app_factory.app_name - - @property - def app_spec(self) -> algokit_utils.Arc56Contract: - return self.app_factory.app_spec - - @property - def algorand(self) -> _AlgoKitAlgorandClient: - return self.app_factory.algorand - - def deploy( - self, - *, - on_update: algokit_utils.OnUpdate | None = None, - on_schema_break: algokit_utils.OnSchemaBreak | None = None, - create_params: ZeroCouponBondMethodCallCreateParams | None = None, - update_params: ZeroCouponBondMethodCallUpdateParams | None = None, - delete_params: None = None, - existing_deployments: algokit_utils.ApplicationLookup | None = None, - ignore_cache: bool = False, - app_name: str | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - send_params: algokit_utils.SendParams | None = None, - ) -> tuple[ZeroCouponBondClient, algokit_utils.AppFactoryDeployResult]: - """Deploy the application""" - deploy_response = self.app_factory.deploy( - on_update=on_update, - on_schema_break=on_schema_break, - create_params=create_params.to_algokit_utils_params() if create_params else None, - update_params=update_params.to_algokit_utils_params() if update_params else None, - delete_params=delete_params, - existing_deployments=existing_deployments, - ignore_cache=ignore_cache, - app_name=app_name, - compilation_params=compilation_params, - send_params=send_params, - ) - - return ZeroCouponBondClient(deploy_response[0]), deploy_response[1] - - def get_app_client_by_creator_and_name( - self, - creator_address: str, - app_name: str, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - ignore_cache: bool | None = None, - app_lookup_cache: algokit_utils.ApplicationLookup | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> ZeroCouponBondClient: - """Get an app client by creator address and name""" - return ZeroCouponBondClient( - self.app_factory.get_app_client_by_creator_and_name( - creator_address, - app_name, - default_sender, - default_signer, - ignore_cache, - app_lookup_cache, - approval_source_map, - clear_source_map, - ) - ) - - def get_app_client_by_id( - self, - app_id: int, - app_name: str | None = None, - default_sender: str | None = None, - default_signer: TransactionSigner | None = None, - approval_source_map: SourceMap | None = None, - clear_source_map: SourceMap | None = None, - ) -> ZeroCouponBondClient: - """Get an app client by app ID""" - return ZeroCouponBondClient( - self.app_factory.get_app_client_by_id( - app_id, - app_name, - default_sender, - default_signer, - approval_source_map, - clear_source_map, - ) - ) - - -class ZeroCouponBondFactoryParams: - """Parameters for creating transactions for ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = ZeroCouponBondFactoryCreateParams(app_factory) - self.update = ZeroCouponBondFactoryUpdateParams(app_factory) - self.delete = ZeroCouponBondFactoryDeleteParams(app_factory) - -class ZeroCouponBondFactoryCreateParams: - """Parameters for 'create' operations of ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateParams: - """Creates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - compilation_params=compilation_params) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64)) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_payment_amount(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_payment_amount(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the pay_principal(address,byte[])(uint64,uint64,byte[]) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "pay_principal(address,byte[])(uint64,uint64,byte[])", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_transfer(address,address,uint64)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_transfer(address,address,uint64)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_secondary_time_events(uint64[])(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "set_secondary_time_events(uint64[])(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the set_default_status(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "set_default_status(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the primary_distribution(address,uint64)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "primary_distribution(address,uint64)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def get_asset_info( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_time_events( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_time_events()uint64[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_time_events()uint64[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_secondary_market_schedule( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_secondary_market_schedule()uint64[] ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_secondary_market_schedule()uint64[]", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def get_asset_metadata( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_gov_suspension(address,bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_gov_suspension(address,bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_open(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_open(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_close(address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_close(address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_update_payment_address(address,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_update_payment_address(address,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the account_get_info(address)(address,uint64,uint64,uint64,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "account_get_info(address)(address,uint64,uint64,uint64,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_rotate_arranger(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_rotate_arranger(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_set_op_daemon(address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_set_op_daemon(address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_assign_role(uint8,address,byte[])uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_assign_role(uint8,address,byte[])uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_revoke_role(uint8,address)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_revoke_role(uint8,address)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_gov_asset_suspension(bool)uint64 ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_gov_asset_suspension(bool)uint64", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_arranger( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_arranger()address ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_arranger()address", - "args": None, - } - ), - compilation_params=compilation_params - ) - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_address_roles(address)(bool,bool,bool,bool,bool) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the rbac_get_role_config(uint8,address)(uint64,uint64) ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "rbac_get_role_config(uint8,address)(uint64,uint64)", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> algokit_utils.AppCreateMethodCallParams: - """Creates a new instance using the asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - compilation_params=compilation_params - ) - -class ZeroCouponBondFactoryUpdateParams: - """Parameters for 'update' operations of ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppUpdateParams: - """Updates an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_update( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - -class ZeroCouponBondFactoryDeleteParams: - """Parameters for 'delete' operations of ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - - ) -> algokit_utils.AppDeleteParams: - """Deletes an instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.params.bare.deploy_delete( - algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), - ) - - -class ZeroCouponBondFactoryCreateTransaction: - """Create transactions for ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = ZeroCouponBondFactoryCreateTransactionCreate(app_factory) - - -class ZeroCouponBondFactoryCreateTransactionCreate: - """Create new instances of ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - params: algokit_utils.CommonAppCallCreateParams | None = None, - ) -> Transaction: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - return self.app_factory.create_transaction.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - ) - - -class ZeroCouponBondFactorySend: - """Send calls to ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - self.create = ZeroCouponBondFactorySendCreate(app_factory) - - -class ZeroCouponBondFactorySendCreate: - """Send create calls to ZeroCouponBond contract""" - - def __init__(self, app_factory: algokit_utils.AppFactory): - self.app_factory = app_factory - - def bare( - self, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None, - ) -> tuple[ZeroCouponBondClient, algokit_utils.SendAppCreateTransactionResult]: - """Creates a new instance using a bare call""" - params = params or algokit_utils.CommonAppCallCreateParams() - result = self.app_factory.send.bare.create( - algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), - send_params=send_params, - compilation_params=compilation_params - ) - return ZeroCouponBondClient(result[0]), result[1] - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - *, - params: algokit_utils.CommonAppCallCreateParams | None = None, - send_params: algokit_utils.SendParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> tuple[ZeroCouponBondClient, algokit_utils.AppFactoryCreateMethodCallResult[None]]: - """Creates and sends a transaction using the asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void ABI method""" - params = params or algokit_utils.CommonAppCallCreateParams() - client, result = self.app_factory.send.create( - algokit_utils.AppFactoryCreateMethodCallParams( - **{ - **dataclasses.asdict(params), - "method": "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", - "args": _parse_abi_args(args), - } - ), - send_params=send_params, - compilation_params=compilation_params - ) - return_value = None if result.abi_return is None else typing.cast(None, result.abi_return) - - return ZeroCouponBondClient(client), algokit_utils.AppFactoryCreateMethodCallResult[None]( - **{ - **result.__dict__, - "app_id": result.app_id, - "abi_return": return_value, - "transaction": result.transaction, - "confirmation": result.confirmation, - "group_id": result.group_id, - "tx_ids": result.tx_ids, - "transactions": result.transactions, - "confirmations": result.confirmations, - "app_address": result.app_address, - } - ) - - -class _ZeroCouponBondUpdateComposer: - def __init__(self, composer: "ZeroCouponBondComposer"): - self.composer = composer - def asset_update( - self, - args: tuple[AssetMetadata] | AssetUpdateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self.composer._composer.add_app_update_method_call( - self.composer.client.params.update.asset_update( - args=args, - params=params, - compilation_params=compilation_params - ) - ) - self.composer._result_mappers.append( - lambda v: self.composer.client.decode_return_value( - "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", v - ) - ) - return self.composer - - -class ZeroCouponBondComposer: - """Composer for creating transaction groups for ZeroCouponBond contract calls""" - - def __init__(self, client: "ZeroCouponBondClient"): - self.client = client - self._composer = client.algorand.new_group() - self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] - - @property - def update(self) -> "_ZeroCouponBondUpdateComposer": - return _ZeroCouponBondUpdateComposer(self) - - def asset_config( - self, - args: tuple[int, int, int, int, int, int, int, list[int], list[int], list[tuple[int, int]]] | AssetConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", v - ) - ) - return self - - def get_account_units_current_value( - self, - args: tuple[str, int] | GetAccountUnitsCurrentValueArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_account_units_current_value( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", v - ) - ) - return self - - def get_payment_amount( - self, - args: tuple[str] | GetPaymentAmountArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_payment_amount( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_payment_amount(address)(uint64,uint64)", v - ) - ) - return self - - def pay_principal( - self, - args: tuple[str, bytes | str] | PayPrincipalArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.pay_principal( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "pay_principal(address,byte[])(uint64,uint64,byte[])", v - ) - ) - return self - - def asset_transfer( - self, - args: tuple[str, str, int] | AssetTransferArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_transfer( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_transfer(address,address,uint64)uint64", v - ) - ) - return self - - def set_secondary_time_events( - self, - args: tuple[list[int]] | SetSecondaryTimeEventsArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.set_secondary_time_events( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "set_secondary_time_events(uint64[])(uint64,uint64)", v - ) - ) - return self - - def set_default_status( - self, - args: tuple[bool] | SetDefaultStatusArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.set_default_status( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "set_default_status(bool)uint64", v - ) - ) - return self - - def primary_distribution( - self, - args: tuple[str, int] | PrimaryDistributionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.primary_distribution( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "primary_distribution(address,uint64)uint64", v - ) - ) - return self - - def get_asset_info( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_asset_info( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", v - ) - ) - return self - - def get_time_events( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_time_events( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_time_events()uint64[]", v - ) - ) - return self - - def get_secondary_market_schedule( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_secondary_market_schedule( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_secondary_market_schedule()uint64[]", v - ) - ) - return self - - def get_asset_metadata( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.get_asset_metadata( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", v - ) - ) - return self - - def account_gov_suspension( - self, - args: tuple[str, bool] | AccountGovSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_gov_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_gov_suspension(address,bool)uint64", v - ) - ) - return self - - def account_open( - self, - args: tuple[str, str] | AccountOpenArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_open( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_open(address,address)uint64", v - ) - ) - return self - - def account_close( - self, - args: tuple[str] | AccountCloseArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_close( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_close(address)(uint64,uint64)", v - ) - ) - return self - - def account_update_payment_address( - self, - args: tuple[str, str] | AccountUpdatePaymentAddressArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_update_payment_address( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_update_payment_address(address,address)uint64", v - ) - ) - return self - - def account_get_info( - self, - args: tuple[str] | AccountGetInfoArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.account_get_info( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "account_get_info(address)(address,uint64,uint64,uint64,bool)", v - ) - ) - return self - - def rbac_rotate_arranger( - self, - args: tuple[str] | RbacRotateArrangerArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_rotate_arranger( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_rotate_arranger(address)uint64", v - ) - ) - return self - - def rbac_set_op_daemon( - self, - args: tuple[str] | RbacSetOpDaemonArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_set_op_daemon( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_set_op_daemon(address)uint64", v - ) - ) - return self - - def rbac_assign_role( - self, - args: tuple[int, str, bytes | str] | RbacAssignRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_assign_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_assign_role(uint8,address,byte[])uint64", v - ) - ) - return self - - def rbac_revoke_role( - self, - args: tuple[int, str] | RbacRevokeRoleArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_revoke_role( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_revoke_role(uint8,address)uint64", v - ) - ) - return self - - def rbac_gov_asset_suspension( - self, - args: tuple[bool] | RbacGovAssetSuspensionArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_gov_asset_suspension( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_gov_asset_suspension(bool)uint64", v - ) - ) - return self - - def rbac_get_arranger( - self, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_arranger( - - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_arranger()address", v - ) - ) - return self - - def rbac_get_address_roles( - self, - args: tuple[str] | RbacGetAddressRolesArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_address_roles( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", v - ) - ) - return self - - def rbac_get_role_config( - self, - args: tuple[int, str] | RbacGetRoleConfigArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.rbac_get_role_config( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "rbac_get_role_config(uint8,address)(uint64,uint64)", v - ) - ) - return self - - def asset_create( - self, - args: tuple[str, AssetMetadata] | AssetCreateArgs, - params: algokit_utils.CommonAppCallParams | None = None, - compilation_params: algokit_utils.AppClientCompilationParams | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_app_call_method_call( - self.client.params.asset_create( - args=args, - params=params, - ) - ) - self._result_mappers.append( - lambda v: self.client.decode_return_value( - "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", v - ) - ) - return self - - def clear_state( - self, - *, - args: list[bytes] | None = None, - params: algokit_utils.CommonAppCallParams | None = None, - ) -> "ZeroCouponBondComposer": - params=params or algokit_utils.CommonAppCallParams() - self._composer.add_app_call( - self.client.params.clear_state( - algokit_utils.AppClientBareCallParams( - **{ - **dataclasses.asdict(params), - "args": args - } - ) - ) - ) - return self - - def add_transaction( - self, txn: Transaction, signer: TransactionSigner | None = None - ) -> "ZeroCouponBondComposer": - self._composer.add_transaction(txn, signer) - return self - - def composer(self) -> algokit_utils.TransactionComposer: - return self._composer - - def simulate( - self, - allow_more_logs: bool | None = None, - allow_empty_signatures: bool | None = None, - allow_unnamed_resources: bool | None = None, - extra_opcode_budget: int | None = None, - exec_trace_config: SimulateTraceConfig | None = None, - simulation_round: int | None = None, - skip_signatures: bool | None = None, - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.simulate( - allow_more_logs=allow_more_logs, - allow_empty_signatures=allow_empty_signatures, - allow_unnamed_resources=allow_unnamed_resources, - extra_opcode_budget=extra_opcode_budget, - exec_trace_config=exec_trace_config, - simulation_round=simulation_round, - skip_signatures=skip_signatures, - ) - - def send( - self, - send_params: algokit_utils.SendParams | None = None - ) -> algokit_utils.SendAtomicTransactionComposerResults: - return self._composer.send(send_params) diff --git a/smart_contracts/config.py b/smart_contracts/config.py index 0e6214cb..64a87c52 100644 --- a/smart_contracts/config.py +++ b/smart_contracts/config.py @@ -1,31 +1,13 @@ from typing import Final # State Schema -GLOBAL_BYTES: Final[int] = 3 -GLOBAL_UINTS: Final[int] = 18 -LOCAL_BYTES: Final[int] = 0 -LOCAL_UINTS: Final[int] = 0 - -# Time Schedule Limits -TIME_SCHEDULE_LIMITS: Final[int] = 4 -PRIMARY_DISTRIBUTION_OPENING_DATE_IDX: Final[int] = 0 -PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX: Final[int] = 1 -ISSUANCE_DATE_IDX: Final[int] = 2 -MATURITY_DATE_IDX: Final[int] = -1 - -# Secondary Market Schedule Limits -SECONDARY_MARKET_OPENING_DATE_IDX: Final[int] = 0 -SECONDARY_MARKET_CLOSURE_DATE_IDX: Final[int] = -1 +GLOBAL_BYTES_ACTUAL: Final[int] = 4 +GLOBAL_BYTES_SPARE: Final[int] = 6 +GLOBAL_BYTES: Final[int] = GLOBAL_BYTES_ACTUAL + GLOBAL_BYTES_SPARE -# Coupon Due Dates -FIRST_COUPON_DATE_IDX: Final[int] = ISSUANCE_DATE_IDX + 1 +GLOBAL_UINTS_ACTUAL: Final[int] = 34 +GLOBAL_UINTS_SPARE: Final[int] = 20 +GLOBAL_UINTS: Final[int] = GLOBAL_UINTS_ACTUAL + GLOBAL_UINTS_SPARE -# Ensure OpCode Budgets, estimated empirically -OP_UP_TIME_EVENT_SORTING: Final[int] = ( - 65 # Depends on the complexity of `assert_time_events_sorted` subroutine -) - -# Ensure OpCode Budgets, estimated empirically -OP_UP_COUPON_DUE_COUNTING: Final[int] = ( - 255 # Depends on the complexity of `count_due_coupons` subroutine -) +LOCAL_BYTES: Final[int] = 0 +LOCAL_UINTS: Final[int] = 0 diff --git a/smart_contracts/constants.py b/smart_contracts/constants.py index 4e9b7c10..e943c79c 100644 --- a/smart_contracts/constants.py +++ b/smart_contracts/constants.py @@ -1,76 +1,42 @@ from typing import Final +################################################################################ +# AVM +################################################################################ +MAX_UINT64: Final[int] = 2**64 - 1 +MAX_ARGS_SIZE: Final[int] = 2048 +OP_UP_CONTRACT_CONFIG_BASE_BUDGET: Final[int] = 1_500 +OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET: Final[int] = 100 +OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET: Final[int] = 1_500 +OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET: Final[int] = 100 +OP_UP_NON_CASH_BASE_BUDGET: Final[int] = 1_500 +OP_UP_NON_CASH_PER_ENTRY_BUDGET: Final[int] = 100 +SCHEDULE_PAGE_SIZE: Final[int] = 16 + +################################################################################ # Conversions +################################################################################ BPS: Final[int] = 10_000 +FIXED_POINT_SCALE: Final[int] = 1_000_000_000 +DAY_2_SEC: Final[int] = 24 * 60 * 60 -# Contract Types -CT_PAM: Final[int] = 0 -CT_PBN: Final[int] = 255 # FIXME: Once ACTUS defines it - -# Day-count Conventions -DAY_2_SEC: Final[int] = 24 * 3_600 -DCC_A_A: Final[int] = 0 -DCC_A_360: Final[int] = 1 -DCC_A_365: Final[int] = 2 -DCC_30_360_ISDA: Final[int] = 3 -DCC_30_360: Final[int] = 4 -DCC_28_336: Final[int] = 5 -DCC_30_365: Final[int] = 6 -DCC_CONT: Final[int] = 255 - -# Calendar -CLDR_NC: Final[int] = 0 -CLDR_MF: Final[int] = 1 -CLDR_CUST: Final[int] = 255 - -# Business Day Convention -BDC_NOS: Final[int] = 0 - -# End of Month Convention -EOMC_SD: Final[int] = 0 - -# Prepayment Effect -PPEF_N: Final[int] = 0 -PPEF_A: Final[int] = 1 -PPEF_M: Final[int] = 2 -PPEF_CUS: Final[int] = 255 - -# Penalty Type -PYTP_N: Final[int] = 0 -PYTP_A: Final[int] = 1 -PYTP_R: Final[int] = 2 -PYTP_I: Final[int] = 3 -PYTP_CUS: Final[int] = 255 - -# Contract Performance -PRF_PERFORMANT: Final[int] = 0 -PRF_DELAYED: Final[int] = 1 -PRF_DELINQUENT: Final[int] = 2 -PRF_DEFAULTED: Final[int] = 3 -PRF_MATURED: Final[int] = 4 -PRF_TERMINATED: Final[int] = 5 - -# Role IDs -ROLE_BORROWER: Final[int] = 1 -ROLE_ARRANGER: Final[int] = 20 -ROLE_LENDER: Final[int] = 30 -ROLE_ACCOUNT_MANAGER: Final[int] = 40 -ROLE_PRIMARY_DEALER: Final[int] = 50 -ROLE_TRUSTEE: Final[int] = 60 -ROLE_AUTHORITY: Final[int] = 70 -ROLE_INTEREST_ORACLE: Final[int] = 80 - +################################################################################ # Role Keys Prefix -PREFIX_ID_ARRANGER: Final[bytes] = b"R20#" -PREFIX_ID_OP_DAEMON: Final[bytes] = b"R25#" -PREFIX_ID_ACCOUNT: Final[bytes] = b"R30#" -PREFIX_ID_ACCOUNT_MANAGER: Final[bytes] = b"R40#" -PREFIX_ID_PRIMARY_DEALER: Final[bytes] = b"R50#" -PREFIX_ID_TRUSTEE: Final[bytes] = b"R60#" -PREFIX_ID_AUTHORITY: Final[bytes] = b"R70#" -PREFIX_ID_INTEREST_ORACLE: Final[bytes] = b"R80#" - -# Box IDs -BOX_ID_COUPON_RATES: Final[bytes] = b"couponRates" -BOX_ID_TIME_EVENTS: Final[bytes] = b"timeEvents" -BOX_ID_TIME_PERIODS: Final[bytes] = b"timePeriods" +################################################################################ +PREFIX_ID_ARRANGER: Final[bytes] = b"R:ARR#" +PREFIX_ID_OP_DAEMON: Final[bytes] = b"R:OPD#" +PREFIX_ID_ACCOUNT_MANAGER: Final[bytes] = b"R:MNG#" +PREFIX_ID_PRIMARY_DEALER: Final[bytes] = b"R:PYD#" +PREFIX_ID_TRUSTEE: Final[bytes] = b"R:TRS#" +PREFIX_ID_AUTHORITY: Final[bytes] = b"R:AUT#" +PREFIX_ID_OBSERVER: Final[bytes] = b"R:MOC#" + +################################################################################ +# Accounting Prefix +################################################################################ +PREFIX_ID_ACCOUNT: Final[bytes] = b"A#" + +################################################################################ +# ACTUS Schedule Prefix +################################################################################ +PREFIX_ID_SCHEDULE_PAGE: Final[bytes] = b"S#" diff --git a/smart_contracts/zero_coupon_bond/contract.py b/smart_contracts/d_asa/contract.py similarity index 64% rename from smart_contracts/zero_coupon_bond/contract.py rename to smart_contracts/d_asa/contract.py index ff4c8515..fe6d1c5a 100644 --- a/smart_contracts/zero_coupon_bond/contract.py +++ b/smart_contracts/d_asa/contract.py @@ -1,19 +1,13 @@ from algopy import StateTotals, Txn -from modules.actus import PAMCoreMixin -from modules.core_financial import NoCouponCashflowMixin -from modules.payment_agent import PrincipalPaymentAgentMixin -from modules.transfer_agent import NoCouponTransferAgentMixin +from modules import PaymentAgent, TransferAgent +from smart_contracts import config as cfg from smart_contracts import errors as err -from . import config as cfg - -class ZeroCouponBond( - PAMCoreMixin, - NoCouponCashflowMixin, - PrincipalPaymentAgentMixin, - NoCouponTransferAgentMixin, +class DASA( + PaymentAgent, + TransferAgent, state_totals=StateTotals( global_bytes=cfg.GLOBAL_BYTES, global_uints=cfg.GLOBAL_UINTS, @@ -22,6 +16,8 @@ class ZeroCouponBond( ), avm_version=12, ): + """Debt Algorand Standard Application.""" + def __init__(self) -> None: super().__init__() assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES diff --git a/smart_contracts/d_asa/deploy_config.py b/smart_contracts/d_asa/deploy_config.py new file mode 100644 index 00000000..9730a066 --- /dev/null +++ b/smart_contracts/d_asa/deploy_config.py @@ -0,0 +1,447 @@ +from __future__ import annotations + +import logging +import os +from collections.abc import Callable, Mapping +from dataclasses import dataclass +from typing import cast + +import algokit_utils +from algokit_utils import ( + AlgoAmount, + AssetCreateParams, + CommonAppCallParams, + PaymentParams, + SendParams, + SigningAccount, +) +from algosdk.constants import ZERO_ADDRESS + +from d_asa import ( + ExecutionScheduleEntry, + NormalizationResult, + normalize_contract_attributes, +) +from d_asa.artifacts.dasa_client import ( + ContractConfigArgs, + ContractCreateArgs, + ContractScheduleArgs, + DasaClient, + DasaFactory, + DasaMethodCallCreateParams, + InitialKernelState, + NormalizedActusTerms, + Prospectus, +) +from d_asa.contracts import ( + make_pam_fixed_coupon_bond_profile, + make_pam_zero_coupon_bond, +) +from d_asa.schedule import Cycle +from smart_contracts import constants as cst +from smart_contracts import enums + +logger = logging.getLogger(__name__) + +AlgodStatus = Mapping[str, int] +AlgodBlock = Mapping[str, int] +AlgodBlockInfo = Mapping[str, object] + +DEMO_APP_FUNDING_ALGO = 2 +DEMO_ASSET_DECIMALS = 2 +DEMO_ASSET_NAME = "D-ASA Demo Euro" +DEMO_ASSET_TOTAL = 10_000_000 +DEMO_ASSET_UNIT_NAME = "€" +DEMO_FCB_APP_NAME = "dasa-demo-fcb" +DEMO_FCB_NOMINAL_RATE = 0.02 +DEMO_FCB_PROSPECTUS_URL = "D-ASA demo fixed coupon bond" +DEMO_FIXED_COUPON_MATURITY_CYCLE = Cycle.parse_cycle("1800D") +DEMO_FIXED_COUPON_PAYMENT_CYCLE = Cycle.parse_cycle("90D") +DEMO_ISSUANCE_DELAY_CYCLE = Cycle.parse_cycle("30D") +DEMO_NOTIONAL_PRINCIPAL = 10_000 +DEMO_NOTIONAL_UNIT_VALUE = 100 +DEMO_ZCB_APP_NAME = "dasa-demo-zcb" +DEMO_ZCB_DISCOUNT_BPS = 200 +DEMO_ZCB_MATURITY_CYCLE = Cycle.parse_cycle("360D") +DEMO_ZCB_PROSPECTUS_URL = "D-ASA demo zero coupon bond" + + +@dataclass(frozen=True, slots=True) +class DenominationAsset: + asset_id: int + decimals: int + + +@dataclass(frozen=True, slots=True) +class DemoDeploymentContext: + current_ts: int + denomination_asset: DenominationAsset + + +@dataclass(frozen=True, slots=True) +class DemoInstrumentSpec: + label: str + prospectus_url: str + normalized: NormalizationResult + + +def _get_arranger_account( + *, + algorand: algokit_utils.AlgorandClient, + deployer: SigningAccount, +) -> SigningAccount: + arranger_address = os.getenv("ARRANGER_ADDRESS") + arranger: SigningAccount | None = None + + try: + arranger = algorand.account.from_environment("ARRANGER") + except Exception: # pragma: no cover - environment-driven branch + arranger = None + + if arranger_address and arranger_address != ZERO_ADDRESS: + if arranger is not None: + if arranger.address != arranger_address: + raise ValueError( + "ARRANGER account signer does not match ARRANGER_ADDRESS" + ) + return arranger + if arranger_address == deployer.address: + logger.info("ARRANGER_ADDRESS matches DEPLOYER; using deployer signer") + return deployer + raise ValueError( + "ARRANGER_ADDRESS is set but no ARRANGER signer is configured. " + "Set ARRANGER credentials or unset ARRANGER_ADDRESS to use DEPLOYER." + ) + + if arranger is not None: + logger.info("Using ARRANGER signer from environment") + return arranger + + logger.info("ARRANGER is unset; defaulting arranger to DEPLOYER") + return deployer + + +def _cycle_duration_seconds(cycle: Cycle) -> int: + if cycle.unit == "D": + return cycle.count * cst.DAY_2_SEC + if cycle.unit == "W": + return cycle.count * 7 * cst.DAY_2_SEC + raise ValueError(f"Unsupported fixed-duration ACTUS cycle: {cycle}") + + +def _get_latest_timestamp(algorand: algokit_utils.AlgorandClient) -> int: + algod_client = algorand.client.algod + status = cast(AlgodStatus, algod_client.status()) + last_round = status["last-round"] + block_info = cast(AlgodBlockInfo, algod_client.block_info(last_round)) + block = cast(AlgodBlock, block_info["block"]) + return block["ts"] + + +def _resolve_denomination_asset( + *, + algorand: algokit_utils.AlgorandClient, + issuer: SigningAccount, +) -> DenominationAsset: + denomination_asset_id = os.getenv("DENOMINATION_ASSET_ID") + if denomination_asset_id: + asset = algorand.asset.get_by_id(int(denomination_asset_id)) + logger.info( + "Using existing denomination asset %s (%s)", + asset.asset_id, + asset.unit_name or "unknown unit", + ) + return DenominationAsset(asset_id=asset.asset_id, decimals=asset.decimals) + + decimals: int = int( + os.getenv("DENOMINATION_ASSET_DECIMALS", str(DEMO_ASSET_DECIMALS)) + ) + asset_total: int = int(os.getenv("DENOMINATION_ASSET_TOTAL", str(DEMO_ASSET_TOTAL))) + scale: int = 10**decimals + total: int = asset_total * scale + asset_name: str = os.getenv("DENOMINATION_ASSET_NAME", DEMO_ASSET_NAME) + unit_name: str = os.getenv("DENOMINATION_ASSET_UNIT_NAME", DEMO_ASSET_UNIT_NAME) + + asset_id = algorand.send.asset_create( + AssetCreateParams( + sender=issuer.address, + signer=issuer.signer, + total=total, + decimals=decimals, + asset_name=asset_name, + unit_name=unit_name, + ) + ).asset_id + logger.info("Created denomination asset %s (%s)", asset_id, unit_name) + return DenominationAsset(asset_id=asset_id, decimals=decimals) + + +def _get_demo_context( + *, + algorand: algokit_utils.AlgorandClient, + deployer: SigningAccount, +) -> DemoDeploymentContext: + return DemoDeploymentContext( + current_ts=_get_latest_timestamp(algorand), + denomination_asset=_resolve_denomination_asset( + algorand=algorand, + issuer=deployer, + ), + ) + + +def build_fixed_coupon_bond_demo(context: DemoDeploymentContext) -> DemoInstrumentSpec: + issuance_delay = _cycle_duration_seconds(DEMO_ISSUANCE_DELAY_CYCLE) + coupon_period = _cycle_duration_seconds(DEMO_FIXED_COUPON_PAYMENT_CYCLE) + issuance_date = context.current_ts + issuance_delay + maturity_date = issuance_date + _cycle_duration_seconds( + DEMO_FIXED_COUPON_MATURITY_CYCLE + ) + first_coupon_date = issuance_date + coupon_period + + attrs = make_pam_fixed_coupon_bond_profile( + contract_id=1, + status_date=context.current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=DEMO_NOTIONAL_PRINCIPAL, + nominal_interest_rate=DEMO_FCB_NOMINAL_RATE, + interest_payment_cycle=DEMO_FIXED_COUPON_PAYMENT_CYCLE, + interest_payment_anchor=first_coupon_date, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=context.denomination_asset.asset_id, + denomination_asset_decimals=context.denomination_asset.decimals, + notional_unit_value=DEMO_NOTIONAL_UNIT_VALUE, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + return DemoInstrumentSpec( + label="FCB", + prospectus_url=DEMO_FCB_PROSPECTUS_URL, + normalized=normalized, + ) + + +def build_zero_coupon_bond_demo(context: DemoDeploymentContext) -> DemoInstrumentSpec: + issuance_date = context.current_ts + _cycle_duration_seconds( + DEMO_ISSUANCE_DELAY_CYCLE + ) + maturity_date = issuance_date + _cycle_duration_seconds(DEMO_ZCB_MATURITY_CYCLE) + discount_amount = DEMO_NOTIONAL_PRINCIPAL * DEMO_ZCB_DISCOUNT_BPS // cst.BPS + + attrs = make_pam_zero_coupon_bond( + contract_id=2, + status_date=context.current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=DEMO_NOTIONAL_PRINCIPAL, + premium_discount_at_ied=discount_amount, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=context.denomination_asset.asset_id, + denomination_asset_decimals=context.denomination_asset.decimals, + notional_unit_value=DEMO_NOTIONAL_UNIT_VALUE, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + return DemoInstrumentSpec( + label="ZCB", + prospectus_url=DEMO_ZCB_PROSPECTUS_URL, + normalized=normalized, + ) + + +def _client_terms(result: NormalizationResult) -> NormalizedActusTerms: + return NormalizedActusTerms( + contract_type=result.terms.contract_type, + denomination_asset_id=result.terms.denomination_asset_id, + settlement_asset_id=result.terms.denomination_asset_id, + total_units=result.terms.total_units, + notional_principal=result.terms.notional_principal, + initial_exchange_amount=result.terms.initial_exchange_amount, + initial_exchange_date=result.terms.initial_exchange_date, + maturity_date=result.terms.maturity_date or 0, + day_count_convention=int(result.terms.day_count_convention), + rate_reset_spread=result.terms.rate_reset_spread, + rate_reset_multiplier=result.terms.rate_reset_multiplier, + rate_reset_floor=result.terms.rate_reset_floor, + rate_reset_cap=result.terms.rate_reset_cap, + rate_reset_next=result.terms.rate_reset_next, + has_rate_reset_floor=result.terms.has_rate_reset_floor, + has_rate_reset_cap=result.terms.has_rate_reset_cap, + dynamic_principal_redemption=result.terms.dynamic_principal_redemption, + fixed_point_scale=result.terms.fixed_point_scale, + ) + + +def _client_initial_state(result: NormalizationResult) -> InitialKernelState: + return InitialKernelState( + status_date=result.initial_state.status_date, + event_cursor=result.initial_state.event_cursor, + outstanding_principal=result.initial_state.outstanding_principal, + interest_calculation_base=result.initial_state.interest_calculation_base, + nominal_interest_rate=result.initial_state.nominal_interest_rate, + accrued_interest=result.initial_state.accrued_interest, + next_principal_redemption=result.initial_state.next_principal_redemption, + cumulative_interest_index=result.initial_state.cumulative_interest_index, + cumulative_principal_index=result.initial_state.cumulative_principal_index, + ) + + +def _client_schedule_page( + page: tuple[ExecutionScheduleEntry, ...], +) -> list[tuple[int, int, int, int, int, int, int, int, int]]: + from d_asa.registry import EVENT_TYPE_IDS + + return [ + ( + entry.event_id, + EVENT_TYPE_IDS[entry.event_type], + entry.scheduled_time, + entry.accrual_factor, + entry.redemption_accrual_factor, + entry.next_nominal_interest_rate, + entry.next_principal_redemption, + entry.next_outstanding_principal, + entry.flags, + ) + for entry in page + ] + + +def _fund_app_account( + *, + algorand: algokit_utils.AlgorandClient, + payer: SigningAccount, + app_address: str, +) -> None: + funding_amount = int( + os.getenv("APP_ACCOUNT_FUNDING_ALGO", str(DEMO_APP_FUNDING_ALGO)) + ) + algorand.send.payment( + PaymentParams( + sender=payer.address, + signer=payer.signer, + receiver=app_address, + amount=AlgoAmount.from_algo(funding_amount), + ) + ) + + +def _configure_demo_app( + *, + client: DasaClient, + spec: DemoInstrumentSpec, +) -> None: + client.send.contract_config( + ContractConfigArgs( + terms=_client_terms(spec.normalized), + initial_state=_client_initial_state(spec.normalized), + prospectus=Prospectus(hash=bytes(32), url=spec.prospectus_url), + ), + params=CommonAppCallParams(max_fee=AlgoAmount.from_micro_algo(5_000)), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + + pages = spec.normalized.schedule_pages(cst.SCHEDULE_PAGE_SIZE) + for index, page in enumerate(pages): + client.send.contract_schedule( + ContractScheduleArgs( + schedule_page_index=index, + is_last_page=index == len(pages) - 1, + schedule_page=_client_schedule_page(page), + ), + params=CommonAppCallParams(max_fee=AlgoAmount.from_micro_algo(5_000)), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + + +def _needs_configuration( + *, + client: DasaClient, + operation: algokit_utils.OperationPerformed, +) -> bool: + if operation in ( + algokit_utils.OperationPerformed.Create, + algokit_utils.OperationPerformed.Replace, + ): + return True + return client.state.global_state.status == enums.STATUS_INACTIVE + + +def _deploy_instrument( + *, + app_name: str, + factory: DasaFactory, + arranger: SigningAccount, + deployer: SigningAccount, + algorand: algokit_utils.AlgorandClient, + build_spec: Callable[[DemoDeploymentContext], DemoInstrumentSpec], + demo_context: DemoDeploymentContext | None, +) -> DemoDeploymentContext | None: + client, result = factory.deploy( + app_name=app_name, + create_params=DasaMethodCallCreateParams( + args=ContractCreateArgs(arranger=arranger.address) + ), + on_update=algokit_utils.OnUpdate.AppendApp, + on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, + ) + + if not _needs_configuration(client=client, operation=result.operation_performed): + logger.info( + "%s app %s already configured at app id %s; skipped configuration", + app_name, + result.operation_performed.name, + client.app_id, + ) + return demo_context + + if demo_context is None: + demo_context = _get_demo_context(algorand=algorand, deployer=deployer) + spec = build_spec(demo_context) + + _fund_app_account( + algorand=algorand, + payer=deployer, + app_address=client.app_address, + ) + _configure_demo_app(client=client, spec=spec) + logger.info( + "Configured %s demo app at app id %s (%s)", + spec.label, + client.app_id, + result.operation_performed.name, + ) + return demo_context + + +# define deployment behaviour based on supplied app spec +def deploy() -> None: + algorand = algokit_utils.AlgorandClient.from_environment() + deployer = algorand.account.from_environment("DEPLOYER") + arranger = _get_arranger_account(algorand=algorand, deployer=deployer) + + factory = algorand.client.get_typed_app_factory( + DasaFactory, + default_sender=arranger.address, + default_signer=arranger.signer, + ) + + demo_context: DemoDeploymentContext | None = None + for app_name, build_spec in ( + (DEMO_FCB_APP_NAME, build_fixed_coupon_bond_demo), + (DEMO_ZCB_APP_NAME, build_zero_coupon_bond_demo), + ): + demo_context = _deploy_instrument( + app_name=app_name, + factory=factory, + arranger=arranger, + deployer=deployer, + algorand=algorand, + build_spec=build_spec, + demo_context=demo_context, + ) diff --git a/smart_contracts/enums.py b/smart_contracts/enums.py index 8ab77b57..34a9b570 100644 --- a/smart_contracts/enums.py +++ b/smart_contracts/enums.py @@ -1,10 +1,120 @@ from typing import Final -# Status # TODO: Use Contract Performance instead +################################################################################ +# AVM Contract Status +################################################################################ STATUS_INACTIVE: Final[int] = 0 +STATUS_PENDING_IED: Final[int] = 50 STATUS_ACTIVE: Final[int] = 100 STATUS_ENDED: Final[int] = 200 -# ACTUS Events -EVT_TYPE_PR: Final[int] = 3 -EVT_TYPE_IP: Final[int] = 8 +################################################################################ +# ACTUS Contract Types +################################################################################ +CT_PAM: Final[int] = 0 +CT_ANN: Final[int] = 1 +CT_NAM: Final[int] = 2 +CT_LAM: Final[int] = 3 +CT_LAX: Final[int] = 4 +CT_CLM: Final[int] = 5 + +################################################################################ +# ACTUS Event types +################################################################################ +EVT_AD: Final[int] = 0 +EVT_IED: Final[int] = 1 +EVT_PR: Final[int] = 3 +EVT_PI: Final[int] = 4 # FIXME: This is not defined in ACTUS +EVT_PRF: Final[int] = 5 +EVT_PY: Final[int] = 6 +EVT_PP: Final[int] = 7 +EVT_IP: Final[int] = 8 +EVT_RRF: Final[int] = 11 +EVT_RR: Final[int] = 12 +EVT_IPCB: Final[int] = 18 +EVT_MD: Final[int] = 19 + +################################################################################ +# Event flags +################################################################################ +FLAG_CASH_EVENT: Final[int] = 1 << 0 +FLAG_NON_CASH_EVENT: Final[int] = 1 << 1 +FLAG_OBSERVED_EVENT: Final[int] = 1 << 2 +FLAG_INITIAL_PRF: Final[int] = 1 << 3 + +################################################################################ +# Day-count Conventions +################################################################################ +DCC_AA: Final[int] = 0 +DCC_A360: Final[int] = 1 +DCC_A365: Final[int] = 2 +DCC_30E360ISDA: Final[int] = 3 +DCC_30E360: Final[int] = 4 + +################################################################################ +# Calendar +################################################################################ +CLDR_NC: Final[int] = 0 +CLDR_MF: Final[int] = 1 +CLDR_CUST: Final[int] = 255 + +################################################################################ +# Business Day Convention +################################################################################ +BDC_NOS: Final[int] = 0 +BDC_SCF: Final[int] = 1 +BDC_SCMF: Final[int] = 2 +BDC_CSF: Final[int] = 3 +BDC_CSMF: Final[int] = 4 +BDC_SCP: Final[int] = 5 +BDC_SCMP: Final[int] = 6 +BDC_CSP: Final[int] = 7 +BDC_CSMP: Final[int] = 8 + +################################################################################ +# End of Month Convention +################################################################################ +EOMC_SD: Final[int] = 0 +EOMC_EOM: Final[int] = 1 + +################################################################################ +# Prepayment Effect +################################################################################ +PPEF_N: Final[int] = 0 +PPEF_A: Final[int] = 1 +PPEF_M: Final[int] = 2 + +################################################################################ +# Penalty Type +################################################################################ +PYTP_N: Final[int] = 0 +PYTP_A: Final[int] = 1 +PYTP_R: Final[int] = 2 +PYTP_I: Final[int] = 3 + +################################################################################ +# Contract Performance +################################################################################ +PRF_PERFORMANT: Final[int] = 0 +PRF_DELAYED: Final[int] = 1 +PRF_DELINQUENT: Final[int] = 2 +PRF_DEFAULTED: Final[int] = 3 +PRF_MATURED: Final[int] = 4 +PRF_TERMINATED: Final[int] = 5 + +################################################################################ +# Role IDs +################################################################################ +ROLE_ARRANGER: Final[int] = 20 +ROLE_OP_DAEMON: Final[int] = 25 +ROLE_ACCOUNT_MANAGER: Final[int] = 40 +ROLE_PRIMARY_DEALER: Final[int] = 50 +ROLE_TRUSTEE: Final[int] = 60 +ROLE_AUTHORITY: Final[int] = 70 +ROLE_OBSERVER: Final[int] = 80 + +################################################################################ +# Payoff Sign +################################################################################ +PAYOFF_SIGN_POSITIVE: Final[int] = 1 +PAYOFF_SIGN_NEGATIVE: Final[int] = 255 diff --git a/smart_contracts/errors.py b/smart_contracts/errors.py index b0a8a53c..9731d743 100644 --- a/smart_contracts/errors.py +++ b/smart_contracts/errors.py @@ -1,6 +1,3 @@ -# Build -INVALID_MIXIN_COMPOSITION = "Invalid mixin composition" - # State Schema WRONG_GLOBAL_BYTES = "Wrong Global Bytes allocation" WRONG_GLOBAL_UINTS = "Wrong Global UInts allocation" @@ -12,58 +9,49 @@ DEFAULTED = "Defaulted" SUSPENDED = "Suspended operations" INVALID_HOLDING_ADDRESS = "Invalid account holding address" -INVALID_TIME_EVENTS_LENGTH = "Time events length is invalid" INVALID_SORTING = "Time events must be sorted in strictly ascending order" -PENDING_COUPON_PAYMENT = "Pending due coupon payment" NOT_ENOUGH_FUNDS = "Not enough funds for the payment" NO_UNITS = "No D-ASA units" -# Asset Config +# Contract Config +NOT_CONFIGURED = "D-ASA not configured" +TERMS_NOT_CONFIGURED = "D-ASA terms not configured" ALREADY_CONFIGURED = "D-ASA already configured" +INVALID_ACTUS_CONFIG = "Invalid ACTUS configuration" INVALID_DENOMINATION = "Denomination asset is not properly set" -INVALID_MINIMUM_DENOMINATION = "Minimum denomination is not a divisor of principal" INVALID_DAY_COUNT_CONVENTION = "Invalid day-count convention ID" -INVALID_INTEREST_RATE = "Interest rate is not properly defined" -INVALID_TIME = "Time events must be set in the future" -INVALID_TIME_PERIOD = "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" INVALID_SETTLEMENT_ASSET = ( "Different settlement asset not supported, must be equal to denomination asset" ) -INVALID_TIME_PERIODS = "Time periods are not properly defined" -INVALID_TIME_PERIOD_DURATION = ( - "Time period durations must be strictly greater than zero" -) -INVALID_TIME_PERIOD_REPETITIONS = "Time period repetitions are not properly defined" -INVALID_COUPON_RATES = "Coupon rates are not properly defined" -# Set Secondary Time Events -INVALID_SECONDARY_OPENING_DATE = "Invalid secondary market opening date" -INVALID_SECONDARY_CLOSURE_DATE = "Invalid secondary market closure date" +# Initial Exchange Date +NOT_EVT_IED = "Not IED event" +PENDING_IED = "IED not yet executed" +INVALID_IED = "IED must be set in the future" + +# Schedule +INVALID_EVENT_ID = "Invalid event id" +INVALID_EVENT_TYPE = "Invalid event type" +INVALID_EVENT_CURSOR = "Invalid event cursor" +INVALID_SCHEDULE_PAGE = "Invalid schedule page" +PENDING_ACTUS_EVENT = "ACTUS event not yet executed" +OBSERVED_EVENT_REQUIRED = "Observed event required to execute this action" + +# Cashflows +NO_DUE_CASHFLOW = "No due cashflow to pay" -# Open and Close Account +# RBAC INVALID_ROLE = "Invalid role identifier" INVALID_ROLE_ADDRESS = "Invalid account role address" # Primary Distribution ZERO_UNITS = "Can not distribute zero units" OVER_DISTRIBUTION = "Insufficient remaining D-ASA units" +PRIMARY_DISTRIBUTION_INCOMPLETE = "Primary distribution is not complete" PRIMARY_DISTRIBUTION_CLOSED = "Primary distribution is closed" -# Asset Transfer -SECONDARY_MARKET_CLOSED = "Secondary market is closed" +# Transfer SELF_TRANSFER = "Sender and receiver must be different" NULL_TRANSFER = "Transfer units must be greater than zero" OVER_TRANSFER = "Insufficient sender units to transfer" -NON_FUNGIBLE_UNITS = "Sender and receiver units are not fungible" - -# Pay Coupon -NO_DUE_COUPON = "No due coupon to pay" - -# Pay Principal -NOT_MATURE = "Not mature" - -# Get Account Units Current Value -NO_PRIMARY_DISTRIBUTION = "Primary distribution not yet executed" - -# Get Accrued Interest Amount -INVALID_UNITS = "Invalid amount of units for the account" +CLOSED_TRANSFER = "Transfer is closed" diff --git a/smart_contracts/events.py b/smart_contracts/events.py index b89d638f..87af2581 100644 --- a/smart_contracts/events.py +++ b/smart_contracts/events.py @@ -1,20 +1,20 @@ from typing import TypeAlias -from algopy import Bytes, String, UInt64, arc4 +from algopy import Asset, UInt64, arc4 Timestamp: TypeAlias = UInt64 -class Event(arc4.Struct, kw_only=True): - """ACTUS Event.""" +class ExecutionEvent(arc4.Struct, kw_only=True): + """Non-normative receipt for on-chain execution of a scheduled ACTUS event.""" contract_id: UInt64 - type: arc4.UInt8 - type_name: String - time: Timestamp + event_id: UInt64 + event_type: arc4.UInt8 + scheduled_time: Timestamp + applied_at: Timestamp payoff: UInt64 - currency_id: UInt64 - currency_unit: Bytes - nominal_value: UInt64 - nominal_rate_bps: arc4.UInt16 - nominal_accrued: UInt64 + payoff_sign: arc4.UInt8 + settled_amount: UInt64 + currency_id: Asset + sequence: UInt64 diff --git a/smart_contracts/fixed_coupon_bond/config.py b/smart_contracts/fixed_coupon_bond/config.py deleted file mode 100644 index 21ca9bb1..00000000 --- a/smart_contracts/fixed_coupon_bond/config.py +++ /dev/null @@ -1,9 +0,0 @@ -from typing import Final - -from smart_contracts import config as base_cfg - -# State Schema -GLOBAL_BYTES: Final[int] = base_cfg.GLOBAL_BYTES -GLOBAL_UINTS: Final[int] = base_cfg.GLOBAL_UINTS + 2 -LOCAL_BYTES: Final[int] = base_cfg.LOCAL_BYTES -LOCAL_UINTS: Final[int] = base_cfg.LOCAL_UINTS diff --git a/smart_contracts/fixed_coupon_bond/contract.py b/smart_contracts/fixed_coupon_bond/contract.py deleted file mode 100644 index 1311cbcd..00000000 --- a/smart_contracts/fixed_coupon_bond/contract.py +++ /dev/null @@ -1,36 +0,0 @@ -from algopy import StateTotals, Txn - -from modules.actus import PAMCoreMixin -from modules.core_financial import ( - FixedCouponCashflowMixin, -) -from modules.payment_agent import ( - CouponPaymentAgentMixin, - PrincipalPaymentAgentMixin, -) -from modules.transfer_agent import CouponTransferAgentMixin -from smart_contracts import errors as err - -from . import config as cfg - - -class FixedCouponBond( - PAMCoreMixin, - FixedCouponCashflowMixin, - CouponPaymentAgentMixin, - PrincipalPaymentAgentMixin, - CouponTransferAgentMixin, - state_totals=StateTotals( - global_bytes=cfg.GLOBAL_BYTES, - global_uints=cfg.GLOBAL_UINTS, - local_bytes=cfg.LOCAL_BYTES, - local_uints=cfg.LOCAL_UINTS, - ), - avm_version=12, -): - def __init__(self) -> None: - super().__init__() - assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES - assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS - assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES - assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS diff --git a/smart_contracts/fixed_coupon_bond/deploy_config.py b/smart_contracts/fixed_coupon_bond/deploy_config.py deleted file mode 100644 index e72e4ba8..00000000 --- a/smart_contracts/fixed_coupon_bond/deploy_config.py +++ /dev/null @@ -1,61 +0,0 @@ -import logging -import os - -import algokit_utils - -from smart_contracts import constants as sc_cst - -logger = logging.getLogger(__name__) - - -# define deployment behaviour based on supplied app spec -def deploy() -> None: - from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetCreateArgs, - AssetMetadata, - AssetUpdateArgs, - FixedCouponBondFactory, - FixedCouponBondMethodCallCreateParams, - FixedCouponBondMethodCallUpdateParams, - ) - - algorand = algokit_utils.AlgorandClient.from_environment() - deployer = algorand.account.from_environment("DEPLOYER") - - factory = algorand.client.get_typed_app_factory( - FixedCouponBondFactory, default_sender=deployer.address - ) - - factory.deploy( - on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, - on_update=algokit_utils.OnUpdate.UpdateApp, - create_params=FixedCouponBondMethodCallCreateParams( - args=AssetCreateArgs( - arranger=os.environ["ARRANGER_ADDRESS"], - metadata=AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Fixed Coupon Bond Prospectus", - ), - ), - ), - update_params=FixedCouponBondMethodCallUpdateParams( - args=AssetUpdateArgs( - metadata=AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Fixed Coupon Bond Prospectus", - ) - ), - ), - ) diff --git a/smart_contracts/mixin_composition.py b/smart_contracts/mixin_composition.py deleted file mode 100644 index 61fe165e..00000000 --- a/smart_contracts/mixin_composition.py +++ /dev/null @@ -1,353 +0,0 @@ -import ast -from dataclasses import dataclass -from pathlib import Path - - -@dataclass(frozen=True) -class ClassInfo: - fqcn: str - module: str - name: str - bases: tuple[str, ...] - methods: frozenset[str] - path: Path - - -class CompositionValidationError(ValueError): - pass - - -_SAFETY_RULES: tuple[tuple[str, tuple[str, ...], str], ...] = ( - ( - "modules.transfer_agent.coupon.CouponTransferAgentMixin", - ("core_prepare_transfer_with_coupon",), - "modules.transfer_agent.common.TransferAgentCommonMixin", - ), - ( - "modules.transfer_agent.no_coupon.NoCouponTransferAgentMixin", - ("core_prepare_transfer_no_coupon",), - "modules.transfer_agent.common.TransferAgentCommonMixin", - ), - ( - "modules.payment_agent.coupon.CouponPaymentAgentMixin", - ("core_prepare_coupon_payment", "core_apply_coupon_payment"), - "modules.payment_agent.common.PaymentAgentCommonMixin", - ), - ( - "modules.payment_agent.principal.PrincipalPaymentAgentMixin", - ("core_prepare_principal_payment", "core_apply_principal_payment"), - "modules.payment_agent.common.PaymentAgentCommonMixin", - ), - ( - "modules.transfer_agent.coupon.CouponTransferAgentMixin", - ("count_due_coupons", "all_due_coupons_paid"), - "modules.core_financial.common.CoreFinancialCommonMixin", - ), - ( - "modules.payment_agent.coupon.CouponPaymentAgentMixin", - ("count_due_coupons", "all_due_coupons_paid"), - "modules.core_financial.common.CoreFinancialCommonMixin", - ), - ( - "modules.payment_agent.principal.PrincipalPaymentAgentMixin", - ("assert_pay_principal_authorization",), - "modules.core_financial.common.CoreFinancialCommonMixin", - ), -) - - -def validate_contract_composition(contract_path: Path, source_root: Path) -> None: - class_map, alias_map = _index_classes(_resolve_source_roots(source_root)) - normalized_contract_path = contract_path.resolve() - target_classes = [ - info - for info in class_map.values() - if info.path.resolve() == normalized_contract_path - and not info.name.endswith("Mixin") - ] - if not target_classes: - raise CompositionValidationError( - f"No concrete contract class found in {contract_path}" - ) - - errors: list[str] = [] - mro_cache: dict[str, tuple[str, ...]] = {} - for target in target_classes: - errors.extend(_validate_class(target.fqcn, class_map, alias_map, mro_cache)) - - if errors: - raise CompositionValidationError("\n".join(errors)) - - -def _validate_class( - contract_fqcn: str, - class_map: dict[str, ClassInfo], - alias_map: dict[str, str], - mro_cache: dict[str, tuple[str, ...]], -) -> list[str]: - mro = _linearize(contract_fqcn, class_map, alias_map, mro_cache, set()) - mro_set = set(mro) - errors: list[str] = [] - - for agent_mixin, hooks, forbidden_owner in _SAFETY_RULES: - if agent_mixin not in mro_set: - continue - for hook in hooks: - owner = _resolve_hook_owner(hook, mro, class_map) - if owner is None: - errors.append( - f"Invalid mixin composition for {contract_fqcn}: hook '{hook}' " - "could not be resolved in MRO. Include the appropriate cashflow " - "mixin before agent mixins or provide an explicit safe override." - ) - continue - if owner == forbidden_owner: - errors.append( - f"Invalid mixin composition for {contract_fqcn}: hook '{hook}' " - f"resolves to unsafe default '{owner}'. Include the appropriate " - "cashflow mixin before agent mixins or provide an explicit safe " - "override." - ) - - return errors - - -def _resolve_hook_owner( - hook_name: str, mro: tuple[str, ...], class_map: dict[str, ClassInfo] -) -> str | None: - for class_fqcn in mro: - class_info = class_map.get(class_fqcn) - if class_info and hook_name in class_info.methods: - return class_fqcn - return None - - -def _linearize( - class_fqcn: str, - class_map: dict[str, ClassInfo], - alias_map: dict[str, str], - mro_cache: dict[str, tuple[str, ...]], - active_stack: set[str], -) -> tuple[str, ...]: - class_fqcn = _canonicalize_fqcn(class_fqcn, alias_map) - if class_fqcn in mro_cache: - return mro_cache[class_fqcn] - if class_fqcn in active_stack: - raise CompositionValidationError( - f"Cyclic inheritance detected while resolving MRO for {class_fqcn}" - ) - - class_info = class_map.get(class_fqcn) - if class_info is None: - mro_cache[class_fqcn] = (class_fqcn,) - return mro_cache[class_fqcn] - - active_stack.add(class_fqcn) - bases = [_canonicalize_fqcn(base, alias_map) for base in class_info.bases] - merged_bases = _c3_merge( - [ - list(_linearize(base, class_map, alias_map, mro_cache, active_stack)) - for base in bases - ] - + [bases.copy()] - ) - active_stack.remove(class_fqcn) - - mro_cache[class_fqcn] = (class_fqcn, *merged_bases) - return mro_cache[class_fqcn] - - -def _c3_merge(sequences: list[list[str]]) -> tuple[str, ...]: - result: list[str] = [] - work = [seq.copy() for seq in sequences if seq] - while work: - candidate = None - for seq in work: - head = seq[0] - if all(head not in other[1:] for other in work): - candidate = head - break - if candidate is None: - raise CompositionValidationError("Cannot resolve class MRO with C3 merge") - - result.append(candidate) - next_work: list[list[str]] = [] - for seq in work: - if seq and seq[0] == candidate: - seq = seq[1:] - if seq: - next_work.append(seq) - work = next_work - - return tuple(result) - - -def _resolve_source_roots(source_root: Path) -> tuple[Path, ...]: - """ - Build source roots for composition indexing. - - Contracts live under `smart_contracts/`, while shared mixins now live in the - sibling top-level `modules/` package. - """ - resolved_source_root = source_root.resolve() - source_roots: list[Path] = [resolved_source_root] - - sibling_modules_root = resolved_source_root.parent / "modules" - if ( - sibling_modules_root.is_dir() - and (sibling_modules_root / "__init__.py").exists() - ): - source_roots.append(sibling_modules_root.resolve()) - - deduped_roots: list[Path] = [] - seen_roots: set[Path] = set() - for root in source_roots: - if root in seen_roots: - continue - seen_roots.add(root) - deduped_roots.append(root) - return tuple(deduped_roots) - - -def _index_classes( - source_roots: tuple[Path, ...], -) -> tuple[dict[str, ClassInfo], dict[str, str]]: - class_map: dict[str, ClassInfo] = {} - alias_map: dict[str, str] = {} - for source_root in source_roots: - for source_file in source_root.rglob("*.py"): - if "artifacts" in source_file.parts: - continue - - module_name = _module_name_from_path(source_file, source_root) - source_ast = ast.parse(source_file.read_text(encoding="utf-8")) - module_class_names = { - node.name for node in source_ast.body if isinstance(node, ast.ClassDef) - } - import_map = _build_import_map( - source_ast, module_name, is_package=source_file.name == "__init__.py" - ) - for local_name, target_name in import_map.items(): - alias_map[f"{module_name}.{local_name}"] = target_name - - for node in source_ast.body: - if not isinstance(node, ast.ClassDef): - continue - base_names = tuple( - _resolve_base_name( - base, module_name, import_map, module_class_names - ) - for base in node.bases - ) - methods = frozenset( - child.name - for child in node.body - if isinstance(child, (ast.FunctionDef, ast.AsyncFunctionDef)) - ) - fqcn = f"{module_name}.{node.name}" - class_map[fqcn] = ClassInfo( - fqcn=fqcn, - module=module_name, - name=node.name, - bases=base_names, - methods=methods, - path=source_file, - ) - return class_map, alias_map - - -def _build_import_map( - module_ast: ast.Module, module_name: str, *, is_package: bool -) -> dict[str, str]: - import_map: dict[str, str] = {} - for node in module_ast.body: - if isinstance(node, ast.Import): - for alias in node.names: - local_name = alias.asname or alias.name.split(".")[0] - import_map[local_name] = alias.name - elif isinstance(node, ast.ImportFrom): - if node.module is None and node.level == 0: - continue - absolute_module = _resolve_import_module( - module_name, node.module, node.level, is_package=is_package - ) - for alias in node.names: - if alias.name == "*": - continue - local_name = alias.asname or alias.name - import_map[local_name] = f"{absolute_module}.{alias.name}" - return import_map - - -def _resolve_base_name( - base: ast.expr, - module_name: str, - import_map: dict[str, str], - module_class_names: set[str], -) -> str: - if isinstance(base, ast.Name): - if base.id in import_map: - return import_map[base.id] - if base.id in module_class_names: - return f"{module_name}.{base.id}" - return base.id - - dotted = _dotted_name(base) - if dotted is None: - return ast.unparse(base) - - root, _, remainder = dotted.partition(".") - if root in import_map: - imported = import_map[root] - return imported if not remainder else f"{imported}.{remainder}" - if root in module_class_names: - return f"{module_name}.{dotted}" - return dotted - - -def _dotted_name(node: ast.expr) -> str | None: - if isinstance(node, ast.Name): - return node.id - if isinstance(node, ast.Attribute): - base = _dotted_name(node.value) - if base is None: - return None - return f"{base}.{node.attr}" - return None - - -def _module_name_from_path(path: Path, source_root: Path) -> str: - parts = list(path.relative_to(source_root.parent).with_suffix("").parts) - if parts and parts[-1] == "__init__": - parts = parts[:-1] - return ".".join(parts) - - -def _resolve_import_module( - module_name: str, imported_module: str | None, level: int, *, is_package: bool -) -> str: - if level == 0: - if imported_module is None: - return module_name - return imported_module - - package_parts = module_name.split(".") - if not is_package: - package_parts = package_parts[:-1] - if level > len(package_parts): - raise CompositionValidationError( - f"Invalid relative import level {level} in module {module_name}" - ) - prefix = package_parts[: len(package_parts) - (level - 1)] - if imported_module: - return ".".join((*prefix, imported_module)) - return ".".join(prefix) - - -def _canonicalize_fqcn(fqcn: str, alias_map: dict[str, str]) -> str: - resolved = fqcn - seen: set[str] = set() - while resolved in alias_map and resolved not in seen: - seen.add(resolved) - resolved = alias_map[resolved] - return resolved diff --git a/smart_contracts/mock_module_accounting/contract.py b/smart_contracts/mock_module_accounting/contract.py deleted file mode 100644 index 9c68af05..00000000 --- a/smart_contracts/mock_module_accounting/contract.py +++ /dev/null @@ -1,16 +0,0 @@ -from algopy import Txn, arc4 - -from modules.accounting import AccountingModule - - -class MockAccountingModule(AccountingModule): - """ - Accounting Module for testing - """ - - def __init__(self) -> None: - super().__init__() - - @arc4.baremethod(create="require") - def create(self) -> None: - self.arranger.value = Txn.sender diff --git a/smart_contracts/perpetual_bond/config.py b/smart_contracts/perpetual_bond/config.py deleted file mode 100644 index 621dff2c..00000000 --- a/smart_contracts/perpetual_bond/config.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Final - -from smart_contracts import config as base_cfg - -# State Schema -GLOBAL_BYTES: Final[int] = base_cfg.GLOBAL_BYTES -GLOBAL_UINTS: Final[int] = base_cfg.GLOBAL_UINTS + 2 -LOCAL_BYTES: Final[int] = base_cfg.LOCAL_BYTES -LOCAL_UINTS: Final[int] = base_cfg.LOCAL_UINTS - -# Time Schedule Limits -# Perpetual bond has no maturity date -TIME_SCHEDULE_LIMITS: Final[int] = base_cfg.TIME_SCHEDULE_LIMITS - 1 diff --git a/smart_contracts/perpetual_bond/contract.py b/smart_contracts/perpetual_bond/contract.py deleted file mode 100644 index c4d66499..00000000 --- a/smart_contracts/perpetual_bond/contract.py +++ /dev/null @@ -1,34 +0,0 @@ -from algopy import StateTotals, Txn - -from modules.actus import PBNCoreMixin -from modules.core_financial import PerpetualCouponCashflowMixin -from modules.payment_agent import ( - CouponPaymentAgentMixin, - NoPrincipalPaymentMixin, -) -from modules.transfer_agent import CouponTransferAgentMixin -from smart_contracts import errors as err - -from . import config as cfg - - -class PerpetualBond( - PBNCoreMixin, - PerpetualCouponCashflowMixin, - NoPrincipalPaymentMixin, - CouponPaymentAgentMixin, - CouponTransferAgentMixin, - state_totals=StateTotals( - global_bytes=cfg.GLOBAL_BYTES, - global_uints=cfg.GLOBAL_UINTS, - local_bytes=cfg.LOCAL_BYTES, - local_uints=cfg.LOCAL_UINTS, - ), - avm_version=12, -): - def __init__(self) -> None: - super().__init__() - assert Txn.global_num_byte_slice == cfg.GLOBAL_BYTES, err.WRONG_GLOBAL_BYTES - assert Txn.global_num_uint == cfg.GLOBAL_UINTS, err.WRONG_GLOBAL_UINTS - assert Txn.local_num_byte_slice == cfg.LOCAL_BYTES, err.WRONG_LOCAL_BYTES - assert Txn.local_num_uint == cfg.LOCAL_UINTS, err.WRONG_LOCAL_UINTS diff --git a/smart_contracts/perpetual_bond/deploy_config.py b/smart_contracts/perpetual_bond/deploy_config.py deleted file mode 100644 index c8ea7cc5..00000000 --- a/smart_contracts/perpetual_bond/deploy_config.py +++ /dev/null @@ -1,61 +0,0 @@ -import logging -import os - -import algokit_utils - -from smart_contracts import constants as sc_cst - -logger = logging.getLogger(__name__) - - -# define deployment behaviour based on supplied app spec -def deploy() -> None: - from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetCreateArgs, - AssetMetadata, - AssetUpdateArgs, - PerpetualBondFactory, - PerpetualBondMethodCallCreateParams, - PerpetualBondMethodCallUpdateParams, - ) - - algorand = algokit_utils.AlgorandClient.from_environment() - deployer = algorand.account.from_environment("DEPLOYER") - - factory = algorand.client.get_typed_app_factory( - PerpetualBondFactory, default_sender=deployer.address - ) - - factory.deploy( - on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, - on_update=algokit_utils.OnUpdate.UpdateApp, - create_params=PerpetualBondMethodCallCreateParams( - args=AssetCreateArgs( - arranger=os.environ["ARRANGER_ADDRESS"], - metadata=AssetMetadata( - contract_type=sc_cst.CT_PBN, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Perpetual Bond Prospectus", - ), - ), - ), - update_params=PerpetualBondMethodCallUpdateParams( - args=AssetUpdateArgs( - metadata=AssetMetadata( - contract_type=sc_cst.CT_PBN, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Perpetual Bond Prospectus", - ), - ), - ), - ) diff --git a/smart_contracts/zero_coupon_bond/config.py b/smart_contracts/zero_coupon_bond/config.py deleted file mode 100644 index 05e93a6d..00000000 --- a/smart_contracts/zero_coupon_bond/config.py +++ /dev/null @@ -1,9 +0,0 @@ -from typing import Final - -from smart_contracts import config as base_cfg - -# State Schema -GLOBAL_BYTES: Final[int] = base_cfg.GLOBAL_BYTES -GLOBAL_UINTS: Final[int] = base_cfg.GLOBAL_UINTS -LOCAL_BYTES: Final[int] = base_cfg.LOCAL_BYTES -LOCAL_UINTS: Final[int] = base_cfg.LOCAL_UINTS diff --git a/smart_contracts/zero_coupon_bond/deploy_config.py b/smart_contracts/zero_coupon_bond/deploy_config.py deleted file mode 100644 index f482b04c..00000000 --- a/smart_contracts/zero_coupon_bond/deploy_config.py +++ /dev/null @@ -1,61 +0,0 @@ -import logging -import os - -import algokit_utils - -from smart_contracts import constants as sc_cst - -logger = logging.getLogger(__name__) - - -# define deployment behaviour based on supplied app spec -def deploy() -> None: - from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetCreateArgs, - AssetMetadata, - AssetUpdateArgs, - ZeroCouponBondFactory, - ZeroCouponBondMethodCallCreateParams, - ZeroCouponBondMethodCallUpdateParams, - ) - - algorand = algokit_utils.AlgorandClient.from_environment() - deployer = algorand.account.from_environment("DEPLOYER") - - factory = algorand.client.get_typed_app_factory( - ZeroCouponBondFactory, default_sender=deployer.address - ) - - factory.deploy( - on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, - on_update=algokit_utils.OnUpdate.UpdateApp, - create_params=ZeroCouponBondMethodCallCreateParams( - args=AssetCreateArgs( - arranger=os.environ["ARRANGER_ADDRESS"], - metadata=AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Zero Coupon Bond Prospectus", - ), - ), - ), - update_params=ZeroCouponBondMethodCallUpdateParams( - args=AssetUpdateArgs( - metadata=AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Zero Coupon Bond Prospectus", - ), - ), - ), - ) diff --git a/src/d_asa/__init__.py b/src/d_asa/__init__.py new file mode 100644 index 00000000..dc007c6a --- /dev/null +++ b/src/d_asa/__init__.py @@ -0,0 +1,86 @@ +# ruff: noqa: RUF022 +""" +Debt Algorand Standard Application (D-ASA) SDK. +""" + +from . import constants, enums +from .contracts import ( + ContractAttributes, + make_pam_fixed_coupon_bond_profile, + make_pam_zero_coupon_bond, +) +from .dasa import ( + AccountManagerRole, + AccountValuation, + AddressRoles, + ArrangerRole, + AuthorityRole, + ClaimResult, + ContractState, + ContractView, + DAsa, + DAsaRole, + FundingResult, + HoldingAccount, + ObserverRole, + OpDaemonRole, + OtcDvpDraft, + PricingContext, + PrimaryDealerRole, + RoleValidityWindow, + TradeQuote, + TradeQuoteInput, + TrusteeRole, +) +from .errors import ActusNormalizationError, UnsupportedActusFeatureError +from .models import ( + AccountPosition, + ExecutionScheduleEntry, + InitialKernelState, + NormalizationResult, + NormalizedActusTerms, + ObservedCashEventRequest, + ObservedEventRequest, +) +from .normalization import normalize_contract_attributes +from .schedule import Cycle + +__all__ = ( + "AccountManagerRole", + "AccountPosition", + "AccountValuation", + "ActusNormalizationError", + "AddressRoles", + "ArrangerRole", + "AuthorityRole", + "ClaimResult", + "constants", + "ContractAttributes", + "ContractState", + "ContractView", + "Cycle", + "DAsa", + "DAsaRole", + "ExecutionScheduleEntry", + "enums", + "FundingResult", + "HoldingAccount", + "InitialKernelState", + "make_pam_fixed_coupon_bond_profile", + "make_pam_zero_coupon_bond", + "NormalizationResult", + "normalize_contract_attributes", + "NormalizedActusTerms", + "ObservedCashEventRequest", + "ObservedEventRequest", + "ObserverRole", + "OpDaemonRole", + "OtcDvpDraft", + "PricingContext", + "PrimaryDealerRole", + "RoleValidityWindow", + "TradeQuote", + "TradeQuoteInput", + "TrusteeRole", + "UnsupportedActusFeatureError", +) diff --git a/src/d_asa/_dasa_mappers.py b/src/d_asa/_dasa_mappers.py new file mode 100644 index 00000000..2ab0b42e --- /dev/null +++ b/src/d_asa/_dasa_mappers.py @@ -0,0 +1,197 @@ +from __future__ import annotations + +from .artifacts.dasa_client import ( + AccountPosition as _ClientAccountPosition, +) +from .artifacts.dasa_client import ( + InitialKernelState as _ClientInitialKernelState, +) +from .artifacts.dasa_client import ( + NormalizedActusTerms as _ClientNormalizedActusTerms, +) +from .artifacts.dasa_client import ( + ObservedCashEventRequest as _ClientObservedCashEventRequest, +) +from .artifacts.dasa_client import ( + ObservedEventRequest as _ClientObservedEventRequest, +) +from .artifacts.dasa_client import ( + Prospectus as _ClientProspectus, +) +from .artifacts.dasa_client import ( + RoleValidity as _ClientRoleValidity, +) +from .models import ( + AccountPosition, + ExecutionScheduleEntry, + NormalizationResult, + ObservedCashEventRequest, + ObservedEventRequest, +) +from .registry import EVENT_TYPE_IDS + +EVENT_TYPE_NAMES = {value: name for name, value in EVENT_TYPE_IDS.items()} + + +def to_client_terms(result: NormalizationResult) -> _ClientNormalizedActusTerms: + return _ClientNormalizedActusTerms( + contract_type=result.terms.contract_type, + denomination_asset_id=result.terms.denomination_asset_id, + settlement_asset_id=result.terms.denomination_asset_id, + total_units=result.terms.total_units, + notional_principal=result.terms.notional_principal, + initial_exchange_amount=result.terms.initial_exchange_amount, + initial_exchange_date=result.terms.initial_exchange_date, + maturity_date=result.terms.maturity_date or 0, + day_count_convention=int(result.terms.day_count_convention), + rate_reset_spread=result.terms.rate_reset_spread, + rate_reset_multiplier=result.terms.rate_reset_multiplier, + rate_reset_floor=result.terms.rate_reset_floor, + rate_reset_cap=result.terms.rate_reset_cap, + rate_reset_next=result.terms.rate_reset_next, + has_rate_reset_floor=result.terms.has_rate_reset_floor, + has_rate_reset_cap=result.terms.has_rate_reset_cap, + dynamic_principal_redemption=result.terms.dynamic_principal_redemption, + fixed_point_scale=result.terms.fixed_point_scale, + ) + + +def to_client_initial_state(result: NormalizationResult) -> _ClientInitialKernelState: + return _ClientInitialKernelState( + status_date=result.initial_state.status_date, + event_cursor=result.initial_state.event_cursor, + outstanding_principal=result.initial_state.outstanding_principal, + interest_calculation_base=result.initial_state.interest_calculation_base, + nominal_interest_rate=result.initial_state.nominal_interest_rate, + accrued_interest=result.initial_state.accrued_interest, + next_principal_redemption=result.initial_state.next_principal_redemption, + cumulative_interest_index=result.initial_state.cumulative_interest_index, + cumulative_principal_index=result.initial_state.cumulative_principal_index, + ) + + +def to_client_schedule_page( + page: tuple[ExecutionScheduleEntry, ...], +) -> list[tuple[int, int, int, int, int, int, int, int, int]]: + return [ + ( + entry.event_id, + EVENT_TYPE_IDS[entry.event_type], + entry.scheduled_time, + entry.accrual_factor, + entry.redemption_accrual_factor, + entry.next_nominal_interest_rate, + entry.next_principal_redemption, + entry.next_outstanding_principal, + entry.flags, + ) + for entry in page + ] + + +def to_client_prospectus( + *, + url: str = "", + hash_bytes: bytes | None = None, +) -> _ClientProspectus: + raw_hash = hash_bytes or bytes(32) + if len(raw_hash) != 32: + raise ValueError("prospectus hash must be exactly 32 bytes") + return _ClientProspectus(hash=raw_hash, url=url) + + +def to_sdk_account_position( + position: AccountPosition | _ClientAccountPosition, +) -> AccountPosition: + if isinstance(position, AccountPosition): + return position + return AccountPosition( + units=position.units, + reserved_units=position.reserved_units, + payment_address=position.payment_address, + suspended=position.suspended, + settled_cursor=position.settled_cursor, + interest_checkpoint=position.interest_checkpoint, + principal_checkpoint=position.principal_checkpoint, + claimable_interest=position.claimable_interest, + claimable_principal=position.claimable_principal, + ) + + +def to_sdk_schedule_entry( + entry: ExecutionScheduleEntry | tuple[int, int, int, int, int, int, int, int, int], +) -> ExecutionScheduleEntry: + if isinstance(entry, ExecutionScheduleEntry): + return entry + ( + event_id, + event_type, + scheduled_time, + accrual_factor, + redemption_accrual_factor, + next_nominal_interest_rate, + next_principal_redemption, + next_outstanding_principal, + flags, + ) = entry + if event_type not in EVENT_TYPE_NAMES: + raise ValueError(f"unsupported event type id: {event_type}") + return ExecutionScheduleEntry( + event_id=event_id, + event_type=EVENT_TYPE_NAMES[event_type], + scheduled_time=scheduled_time, + accrual_factor=accrual_factor, + redemption_accrual_factor=redemption_accrual_factor, + next_nominal_interest_rate=next_nominal_interest_rate, + next_principal_redemption=next_principal_redemption, + next_outstanding_principal=next_outstanding_principal, + flags=flags, + ) + + +def to_client_observed_event( + payload: ObservedEventRequest, + *, + event_id: int, +) -> _ClientObservedEventRequest: + return _ClientObservedEventRequest( + event_id=event_id, + event_type=EVENT_TYPE_IDS[payload.event_type], + scheduled_time=payload.scheduled_time, + accrual_factor=payload.accrual_factor, + redemption_accrual_factor=payload.redemption_accrual_factor, + observed_rate=payload.observed_rate, + next_nominal_interest_rate=payload.next_nominal_interest_rate, + next_principal_redemption=payload.next_principal_redemption, + next_outstanding_principal=payload.next_outstanding_principal, + flags=payload.flags, + ) + + +def to_client_observed_cash_event( + payload: ObservedCashEventRequest, + *, + event_id: int, +) -> _ClientObservedCashEventRequest: + return _ClientObservedCashEventRequest( + event_id=event_id, + event_type=EVENT_TYPE_IDS[payload.event_type], + scheduled_time=payload.scheduled_time, + accrual_factor=payload.accrual_factor, + redemption_accrual_factor=payload.redemption_accrual_factor, + next_nominal_interest_rate=payload.next_nominal_interest_rate, + next_principal_redemption=payload.next_principal_redemption, + next_outstanding_principal=payload.next_outstanding_principal, + flags=payload.flags, + ) + + +def to_client_role_validity( + *, + start: int, + end: int, +) -> _ClientRoleValidity: + return _ClientRoleValidity( + role_validity_start=start, + role_validity_end=end, + ) diff --git a/src/d_asa/artifacts/DASA.arc56.json b/src/d_asa/artifacts/DASA.arc56.json new file mode 100644 index 00000000..6e75ef13 --- /dev/null +++ b/src/d_asa/artifacts/DASA.arc56.json @@ -0,0 +1,2409 @@ +{ + "name": "DASA", + "structs": { + "AccountPosition": [ + { + "name": "payment_address", + "type": "address" + }, + { + "name": "units", + "type": "uint64" + }, + { + "name": "reserved_units", + "type": "uint64" + }, + { + "name": "suspended", + "type": "bool" + }, + { + "name": "settled_cursor", + "type": "uint64" + }, + { + "name": "interest_checkpoint", + "type": "uint64" + }, + { + "name": "principal_checkpoint", + "type": "uint64" + }, + { + "name": "claimable_interest", + "type": "uint64" + }, + { + "name": "claimable_principal", + "type": "uint64" + } + ], + "CashClaimResult": [ + { + "name": "interest_amount", + "type": "uint64" + }, + { + "name": "principal_amount", + "type": "uint64" + }, + { + "name": "total_amount", + "type": "uint64" + }, + { + "name": "timestamp", + "type": "uint64" + }, + { + "name": "context", + "type": "byte[]" + } + ], + "CashFundingResult": [ + { + "name": "funded_interest", + "type": "uint64" + }, + { + "name": "funded_principal", + "type": "uint64" + }, + { + "name": "total_funded", + "type": "uint64" + }, + { + "name": "processed_events", + "type": "uint64" + }, + { + "name": "timestamp", + "type": "uint64" + } + ], + "ExecutionScheduleEntry": [ + { + "name": "event_id", + "type": "uint64" + }, + { + "name": "event_type", + "type": "uint8" + }, + { + "name": "scheduled_time", + "type": "uint64" + }, + { + "name": "accrual_factor", + "type": "uint64" + }, + { + "name": "redemption_accrual_factor", + "type": "uint64" + }, + { + "name": "next_nominal_interest_rate", + "type": "uint64" + }, + { + "name": "next_principal_redemption", + "type": "uint64" + }, + { + "name": "next_outstanding_principal", + "type": "uint64" + }, + { + "name": "flags", + "type": "uint64" + } + ], + "InitialKernelState": [ + { + "name": "status_date", + "type": "uint64" + }, + { + "name": "event_cursor", + "type": "uint64" + }, + { + "name": "outstanding_principal", + "type": "uint64" + }, + { + "name": "interest_calculation_base", + "type": "uint64" + }, + { + "name": "nominal_interest_rate", + "type": "uint64" + }, + { + "name": "accrued_interest", + "type": "uint64" + }, + { + "name": "next_principal_redemption", + "type": "uint64" + }, + { + "name": "cumulative_interest_index", + "type": "uint64" + }, + { + "name": "cumulative_principal_index", + "type": "uint64" + } + ], + "KernelState": [ + { + "name": "contract_type", + "type": "uint8" + }, + { + "name": "status", + "type": "uint64" + }, + { + "name": "total_units", + "type": "uint64" + }, + { + "name": "reserved_units_total", + "type": "uint64" + }, + { + "name": "initial_exchange_amount", + "type": "uint64" + }, + { + "name": "event_cursor", + "type": "uint64" + }, + { + "name": "schedule_entry_count", + "type": "uint64" + }, + { + "name": "outstanding_principal", + "type": "uint64" + }, + { + "name": "interest_calculation_base", + "type": "uint64" + }, + { + "name": "nominal_interest_rate", + "type": "uint64" + }, + { + "name": "accrued_interest", + "type": "uint64" + }, + { + "name": "cumulative_interest_index", + "type": "uint64" + }, + { + "name": "cumulative_principal_index", + "type": "uint64" + }, + { + "name": "reserved_interest", + "type": "uint64" + }, + { + "name": "reserved_principal", + "type": "uint64" + } + ], + "NormalizedActusTerms": [ + { + "name": "contract_type", + "type": "uint8" + }, + { + "name": "denomination_asset_id", + "type": "uint64" + }, + { + "name": "settlement_asset_id", + "type": "uint64" + }, + { + "name": "total_units", + "type": "uint64" + }, + { + "name": "notional_principal", + "type": "uint64" + }, + { + "name": "initial_exchange_amount", + "type": "uint64" + }, + { + "name": "initial_exchange_date", + "type": "uint64" + }, + { + "name": "maturity_date", + "type": "uint64" + }, + { + "name": "day_count_convention", + "type": "uint8" + }, + { + "name": "rate_reset_spread", + "type": "uint64" + }, + { + "name": "rate_reset_multiplier", + "type": "uint64" + }, + { + "name": "rate_reset_floor", + "type": "uint64" + }, + { + "name": "rate_reset_cap", + "type": "uint64" + }, + { + "name": "rate_reset_next", + "type": "uint64" + }, + { + "name": "has_rate_reset_floor", + "type": "bool" + }, + { + "name": "has_rate_reset_cap", + "type": "bool" + }, + { + "name": "dynamic_principal_redemption", + "type": "bool" + }, + { + "name": "fixed_point_scale", + "type": "uint64" + } + ], + "ObservedCashEventRequest": [ + { + "name": "event_id", + "type": "uint64" + }, + { + "name": "event_type", + "type": "uint8" + }, + { + "name": "scheduled_time", + "type": "uint64" + }, + { + "name": "accrual_factor", + "type": "uint64" + }, + { + "name": "redemption_accrual_factor", + "type": "uint64" + }, + { + "name": "next_nominal_interest_rate", + "type": "uint64" + }, + { + "name": "next_principal_redemption", + "type": "uint64" + }, + { + "name": "next_outstanding_principal", + "type": "uint64" + }, + { + "name": "flags", + "type": "uint64" + } + ], + "ObservedEventRequest": [ + { + "name": "event_id", + "type": "uint64" + }, + { + "name": "event_type", + "type": "uint8" + }, + { + "name": "scheduled_time", + "type": "uint64" + }, + { + "name": "accrual_factor", + "type": "uint64" + }, + { + "name": "redemption_accrual_factor", + "type": "uint64" + }, + { + "name": "observed_rate", + "type": "uint64" + }, + { + "name": "next_nominal_interest_rate", + "type": "uint64" + }, + { + "name": "next_principal_redemption", + "type": "uint64" + }, + { + "name": "next_outstanding_principal", + "type": "uint64" + }, + { + "name": "flags", + "type": "uint64" + } + ], + "Prospectus": [ + { + "name": "hash", + "type": "byte[32]" + }, + { + "name": "url", + "type": "string" + } + ], + "RoleValidity": [ + { + "name": "role_validity_start", + "type": "uint64" + }, + { + "name": "role_validity_end", + "type": "uint64" + } + ] + }, + "methods": [ + { + "name": "fund_due_cashflows", + "args": [ + { + "type": "uint64", + "name": "max_event_count", + "desc": "Maximum number of due cash events to process in this call." + } + ], + "returns": { + "type": "(uint64,uint64,uint64,uint64,uint64)", + "struct": "CashFundingResult", + "desc": "Funding result with reserved interest, reserved principal, and event count." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", + "events": [ + { + "name": "ExecutionEvent", + "args": [ + { + "type": "uint64", + "name": "contract_id" + }, + { + "type": "uint64", + "name": "event_id" + }, + { + "type": "uint8", + "name": "event_type" + }, + { + "type": "uint64", + "name": "scheduled_time" + }, + { + "type": "uint64", + "name": "applied_at" + }, + { + "type": "uint64", + "name": "payoff" + }, + { + "type": "uint8", + "name": "payoff_sign" + }, + { + "type": "uint64", + "name": "settled_amount" + }, + { + "type": "uint64", + "name": "currency_id" + }, + { + "type": "uint64", + "name": "sequence" + } + ], + "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event." + } + ], + "recommendations": {} + }, + { + "name": "claim_due_cashflows", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Holder whose position should be settled and claimed." + }, + { + "type": "byte[]", + "name": "payment_info", + "desc": "Opaque settlement context returned in the result." + } + ], + "returns": { + "type": "(uint64,uint64,uint64,uint64,byte[])", + "struct": "CashClaimResult", + "desc": "Claim result with realized interest, principal, and passthrough context." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", + "events": [], + "recommendations": {} + }, + { + "name": "transfer_set_schedule", + "args": [ + { + "type": "uint64", + "name": "open_date", + "desc": "Inclusive UNIX timestamp at which transfers may start." + }, + { + "type": "uint64", + "name": "closure_date", + "desc": "Exclusive UNIX timestamp at which transfers stop." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the schedule update." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Configure the secondary-market transfer window.", + "events": [], + "recommendations": {} + }, + { + "name": "primary_distribution", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account receiving the reserved units." + }, + { + "type": "uint64", + "name": "units", + "desc": "Number of units to reserve." + } + ], + "returns": { + "type": "uint64", + "desc": "Remaining undistributed unit balance." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Reserve units for a holder before the initial exchange activates issuance.", + "events": [], + "recommendations": {} + }, + { + "name": "transfer", + "args": [ + { + "type": "address", + "name": "sender_holding_address", + "desc": "Account debited for the transfer." + }, + { + "type": "address", + "name": "receiver_holding_address", + "desc": "Account credited for the transfer." + }, + { + "type": "uint64", + "name": "units", + "desc": "Number of active units to move." + } + ], + "returns": { + "type": "uint64", + "desc": "Number of units transferred." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", + "events": [], + "recommendations": {} + }, + { + "name": "account_suspension", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account holding address." + }, + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status to apply." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the suspension update." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set the suspension status of one account.", + "events": [], + "recommendations": {} + }, + { + "name": "account_open", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account holding address." + }, + { + "type": "address", + "name": "payment_address", + "desc": "Account payment address." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the account opening." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Open a contract account with a new position and register its payment address.", + "events": [], + "recommendations": {} + }, + { + "name": "account_update_payment_address", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account holding address." + }, + { + "type": "address", + "name": "payment_address", + "desc": "New account payment address." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the account update." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Update the payment address of an account.", + "events": [], + "recommendations": {} + }, + { + "name": "account_get_position", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account holding address." + } + ], + "returns": { + "type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", + "struct": "AccountPosition", + "desc": "Account position record." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get the full accounting position for one holder.", + "events": [], + "recommendations": {} + }, + { + "name": "contract_create", + "args": [ + { + "type": "address", + "name": "arranger", + "desc": "D-ASA arranger address." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of contract creation." + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "desc": "Create a new D-ASA contract and set the arranger role.", + "events": [], + "recommendations": {} + }, + { + "name": "contract_config", + "args": [ + { + "type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", + "struct": "NormalizedActusTerms", + "name": "terms", + "desc": "Normalized ACTUS terms." + }, + { + "type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "struct": "InitialKernelState", + "name": "initial_state", + "desc": "Initial kernel state captured before `IED`." + }, + { + "type": "(byte[32],string)", + "struct": "Prospectus", + "name": "prospectus", + "desc": "Prospectus metadata stored for reference only." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of contract configuration." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", + "events": [], + "recommendations": {} + }, + { + "name": "contract_schedule", + "args": [ + { + "type": "uint64", + "name": "schedule_page_index", + "desc": "Zero-based page index within the boxed schedule." + }, + { + "type": "bool", + "name": "is_last_page", + "desc": "Whether this page finalizes the schedule upload." + }, + { + "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", + "name": "schedule_page", + "desc": "Normalized schedule entries for the requested page." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the schedule upload." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", + "events": [], + "recommendations": {} + }, + { + "name": "contract_execute_ied", + "args": [], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the `IED` execution." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", + "events": [ + { + "name": "ExecutionEvent", + "args": [ + { + "type": "uint64", + "name": "contract_id" + }, + { + "type": "uint64", + "name": "event_id" + }, + { + "type": "uint8", + "name": "event_type" + }, + { + "type": "uint64", + "name": "scheduled_time" + }, + { + "type": "uint64", + "name": "applied_at" + }, + { + "type": "uint64", + "name": "payoff" + }, + { + "type": "uint8", + "name": "payoff_sign" + }, + { + "type": "uint64", + "name": "settled_amount" + }, + { + "type": "uint64", + "name": "currency_id" + }, + { + "type": "uint64", + "name": "sequence" + } + ], + "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event." + } + ], + "recommendations": {} + }, + { + "name": "apply_non_cash_event", + "args": [ + { + "type": "uint64", + "name": "event_id", + "desc": "Expected global schedule event identifier at the current cursor." + }, + { + "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "struct": "ObservedEventRequest", + "name": "payload", + "desc": "Observed payload used for append-on-execute and/or rate resets." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the non-cash event application." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", + "events": [ + { + "name": "ExecutionEvent", + "args": [ + { + "type": "uint64", + "name": "contract_id" + }, + { + "type": "uint64", + "name": "event_id" + }, + { + "type": "uint8", + "name": "event_type" + }, + { + "type": "uint64", + "name": "scheduled_time" + }, + { + "type": "uint64", + "name": "applied_at" + }, + { + "type": "uint64", + "name": "payoff" + }, + { + "type": "uint8", + "name": "payoff_sign" + }, + { + "type": "uint64", + "name": "settled_amount" + }, + { + "type": "uint64", + "name": "currency_id" + }, + { + "type": "uint64", + "name": "sequence" + } + ], + "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event." + } + ], + "recommendations": {} + }, + { + "name": "append_observed_cash_event", + "args": [ + { + "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "struct": "ObservedCashEventRequest", + "name": "payload", + "desc": "Observed cash-event payload to append after the current tail." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the append operation." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Append an arranger-authorized observed cash event to the schedule tail.", + "events": [], + "recommendations": {} + }, + { + "name": "contract_get_state", + "args": [], + "returns": { + "type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "struct": "KernelState", + "desc": "Current kernel state snapshot." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", + "events": [], + "recommendations": {} + }, + { + "name": "contract_get_next_due_event", + "args": [], + "returns": { + "type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "struct": "ExecutionScheduleEntry", + "desc": "Next due schedule entry, or an all-zero sentinel if the contract ended." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", + "events": [], + "recommendations": {} + }, + { + "name": "contract_update", + "args": [], + "returns": { + "type": "void", + "desc": "None." + }, + "actions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "readonly": false, + "desc": "Update D-ASA application.", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_rotate_arranger", + "args": [ + { + "type": "address", + "name": "new_arranger", + "desc": "New arranger address." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the role assignment." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Rotate the arranger address.", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_set_op_daemon", + "args": [ + { + "type": "address", + "name": "address", + "desc": "Operation daemon address." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the role assignment." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Non-normative helper to set the operation daemon address.", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_assign_role", + "args": [ + { + "type": "uint8", + "name": "role_id", + "desc": "Role identifier." + }, + { + "type": "address", + "name": "role_address", + "desc": "Account role address." + }, + { + "type": "(uint64,uint64)", + "struct": "RoleValidity", + "name": "validity", + "desc": "Inclusive validity interval for the assignment." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the role assignment." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Assign a role to an address.", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_revoke_role", + "args": [ + { + "type": "uint8", + "name": "role_id", + "desc": "Role identifier." + }, + { + "type": "address", + "name": "role_address", + "desc": "Account role address." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the role revocation." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Revoke a role from an address.", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_contract_suspension", + "args": [ + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status to apply." + } + ], + "returns": { + "type": "uint64", + "desc": "UNIX timestamp of the suspension update." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set the asset-wide suspension status.", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_contract_default", + "args": [ + { + "type": "bool", + "name": "defaulted", + "desc": "Default status" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set D-ASA default status", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_get_arranger", + "args": [], + "returns": { + "type": "address", + "desc": "Current arranger address." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get the arranger address.", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_get_address_roles", + "args": [ + { + "type": "address", + "name": "address", + "desc": "Address to query." + } + ], + "returns": { + "type": "(bool,bool,bool,bool,bool)", + "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Non-normative helper to get the active roles assigned to an address.", + "events": [], + "recommendations": {} + }, + { + "name": "rbac_get_role_validity", + "args": [ + { + "type": "uint8", + "name": "role_id", + "desc": "Role identifier." + }, + { + "type": "address", + "name": "role_address", + "desc": "Account role address." + } + ], + "returns": { + "type": "(uint64,uint64)", + "struct": "RoleValidity", + "desc": "Stored role validity interval." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get the stored validity interval for a role assignment.", + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "desc": "Debt Algorand Standard Application.", + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 54, + "bytes": 10 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "arranger": { + "keyType": "AVMBytes", + "valueType": "address", + "key": "UjpBUlIj" + }, + "op_daemon": { + "keyType": "AVMBytes", + "valueType": "address", + "key": "UjpPUEQj" + }, + "contract_suspended": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y29udHJhY3Rfc3VzcGVuZGVk" + }, + "defaulted": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGVmYXVsdGVk" + }, + "status": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c3RhdHVz" + }, + "contract_type": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y29udHJhY3RfdHlwZQ==" + }, + "prospectus_hash": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "cHJvc3BlY3R1c19oYXNo" + }, + "prospectus_url": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "cHJvc3BlY3R1c191cmw=" + }, + "denomination_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk" + }, + "settlement_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2V0dGxlbWVudF9hc3NldF9pZA==" + }, + "initial_exchange_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl" + }, + "maturity_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bWF0dXJpdHlfZGF0ZQ==" + }, + "transfer_opening_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl" + }, + "transfer_closure_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl" + }, + "day_count_convention": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=" + }, + "total_units": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dG90YWxfdW5pdHM=" + }, + "reserved_units_total": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=" + }, + "initial_exchange_amount": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=" + }, + "outstanding_principal": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs" + }, + "next_principal_redemption": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==" + }, + "dynamic_principal_redemption": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==" + }, + "interest_calculation_base": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==" + }, + "accrued_interest": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YWNjcnVlZF9pbnRlcmVzdA==" + }, + "nominal_interest_rate": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl" + }, + "rate_reset_spread": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmF0ZV9yZXNldF9zcHJlYWQ=" + }, + "rate_reset_multiplier": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy" + }, + "rate_reset_floor": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmF0ZV9yZXNldF9mbG9vcg==" + }, + "rate_reset_cap": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmF0ZV9yZXNldF9jYXA=" + }, + "rate_reset_next": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmF0ZV9yZXNldF9uZXh0" + }, + "has_rate_reset_floor": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=" + }, + "has_rate_reset_cap": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aGFzX3JhdGVfcmVzZXRfY2Fw" + }, + "reserved_principal": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmVzZXJ2ZWRfcHJpbmNpcGFs" + }, + "reserved_interest": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=" + }, + "cumulative_interest_index": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==" + }, + "cumulative_principal_index": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=" + }, + "event_cursor": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZXZlbnRfY3Vyc29y" + }, + "schedule_entry_count": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2NoZWR1bGVfZW50cnlfY291bnQ=" + }, + "fixed_point_scale": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Zml4ZWRfcG9pbnRfc2NhbGU=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "account_manager": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UjpNTkcj" + }, + "primary_dealer": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UjpQWUQj" + }, + "trustee": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UjpUUlMj" + }, + "authority": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UjpBVVQj" + }, + "observer": { + "keyType": "address", + "valueType": "RoleValidity", + "prefix": "UjpNT0Mj" + }, + "schedule_page": { + "keyType": "uint64", + "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", + "prefix": "UyM=" + }, + "account": { + "keyType": "address", + "valueType": "AccountPosition", + "prefix": "QSM=" + } + } + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 2652 + ], + "errorMessage": "ACTUS event not yet executed" + }, + { + "pc": [ + 2410 + ], + "errorMessage": "Can not distribute zero units" + }, + { + "pc": [ + 3153, + 3160, + 3533 + ], + "errorMessage": "D-ASA already configured" + }, + { + "pc": [ + 1259, + 1991, + 2370, + 2516, + 3750, + 3896, + 4247, + 4478, + 4624 + ], + "errorMessage": "D-ASA not configured" + }, + { + "pc": [ + 3544 + ], + "errorMessage": "D-ASA terms not configured" + }, + { + "pc": [ + 6844 + ], + "errorMessage": "Defaulted" + }, + { + "pc": [ + 3171 + ], + "errorMessage": "Denomination asset is not properly set" + }, + { + "pc": [ + 3186 + ], + "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" + }, + { + "pc": [ + 3422, + 3429, + 3431 + ], + "errorMessage": "IED must be set in the future" + }, + { + "pc": [ + 1277, + 2060, + 2531, + 4265, + 6196 + ], + "errorMessage": "IED not yet executed" + }, + { + "pc": [ + 2423, + 5579 + ], + "errorMessage": "Insufficient remaining D-ASA units" + }, + { + "pc": [ + 2626, + 2692 + ], + "errorMessage": "Insufficient sender units to transfer" + }, + { + "pc": [ + 1887, + 3073, + 3091, + 3147, + 3624, + 3660, + 4312, + 5763, + 6041, + 6101, + 6504 + ], + "errorMessage": "Invalid ACTUS configuration" + }, + { + "pc": [ + 2000, + 2404, + 2587, + 2602, + 2759, + 2832, + 2895, + 2937, + 5391, + 5516 + ], + "errorMessage": "Invalid account holding address" + }, + { + "pc": [ + 4815, + 4839, + 4863, + 4887, + 4911, + 4968, + 4996, + 5018, + 5040, + 5062, + 5272, + 5290, + 5305, + 5320, + 5335 + ], + "errorMessage": "Invalid account role address" + }, + { + "pc": [ + 3133 + ], + "errorMessage": "Invalid day-count convention ID" + }, + { + "pc": [ + 1390, + 3771, + 4099, + 6073 + ], + "errorMessage": "Invalid event cursor" + }, + { + "pc": [ + 3609, + 3672, + 3948, + 4289, + 5679 + ], + "errorMessage": "Invalid event id" + }, + { + "pc": [ + 3784, + 4163, + 4170, + 4302 + ], + "errorMessage": "Invalid event type" + }, + { + "pc": [ + 4952, + 5262, + 6914 + ], + "errorMessage": "Invalid role identifier" + }, + { + "pc": [ + 3538, + 3684, + 3692, + 4001, + 4376, + 5694, + 5710 + ], + "errorMessage": "Invalid schedule page" + }, + { + "pc": [ + 5627 + ], + "errorMessage": "No D-ASA units" + }, + { + "pc": [ + 1396, + 1916, + 2097, + 6082 + ], + "errorMessage": "No due cashflow to pay" + }, + { + "pc": [ + 6165 + ], + "errorMessage": "Not IED event" + }, + { + "pc": [ + 2045, + 2378, + 2574, + 2749, + 2805, + 2815, + 2901, + 4198, + 5085, + 5116, + 6836 + ], + "errorMessage": "Not authorized" + }, + { + "pc": [ + 1517, + 1525, + 2146, + 2220, + 2229 + ], + "errorMessage": "Not enough funds for the payment" + }, + { + "pc": [ + 3921, + 3934, + 4274 + ], + "errorMessage": "Observed event required to execute this action" + }, + { + "pc": [ + 2392, + 2440 + ], + "errorMessage": "Primary distribution is closed" + }, + { + "pc": [ + 6113 + ], + "errorMessage": "Primary distribution is not complete" + }, + { + "pc": [ + 2615 + ], + "errorMessage": "Sender and receiver must be different" + }, + { + "pc": [ + 5377, + 6852 + ], + "errorMessage": "Suspended operations" + }, + { + "pc": [ + 2327, + 3650, + 4334 + ], + "errorMessage": "Time events must be sorted in strictly ascending order" + }, + { + "pc": [ + 2548, + 2565 + ], + "errorMessage": "Transfer is closed" + }, + { + "pc": [ + 2619 + ], + "errorMessage": "Transfer units must be greater than zero" + }, + { + "pc": [ + 936 + ], + "errorMessage": "Wrong Global Bytes allocation" + }, + { + "pc": [ + 942 + ], + "errorMessage": "Wrong Global UInts allocation" + }, + { + "pc": [ + 946 + ], + "errorMessage": "Wrong Local Bytes allocation" + }, + { + "pc": [ + 950 + ], + "errorMessage": "Wrong Local UInts allocation" + }, + { + "pc": [ + 1498, + 2139 + ], + "errorMessage": "account opted into asset" + }, + { + "pc": [ + 6796, + 6811 + ], + "errorMessage": "check BoxMap entry exists" + }, + { + "pc": [ + 2036, + 2074, + 2115, + 2153, + 2444, + 2622, + 2681, + 2707, + 5371, + 5537 + ], + "errorMessage": "check self.account entry exists" + }, + { + "pc": [ + 1579, + 1811, + 1899, + 4535, + 6201, + 6524 + ], + "errorMessage": "check self.accrued_interest exists" + }, + { + "pc": [ + 5134, + 6834 + ], + "errorMessage": "check self.arranger exists" + }, + { + "pc": [ + 6850 + ], + "errorMessage": "check self.contract_suspended exists" + }, + { + "pc": [ + 3081, + 3527, + 3917, + 3929, + 4270, + 4483, + 5925 + ], + "errorMessage": "check self.contract_type exists" + }, + { + "pc": [ + 1547, + 4540, + 5399, + 5477 + ], + "errorMessage": "check self.cumulative_interest_index exists" + }, + { + "pc": [ + 1559, + 4545, + 5410, + 5485 + ], + "errorMessage": "check self.cumulative_principal_index exists" + }, + { + "pc": [ + 6842 + ], + "errorMessage": "check self.defaulted exists" + }, + { + "pc": [ + 5935 + ], + "errorMessage": "check self.dynamic_principal_redemption exists" + }, + { + "pc": [ + 1315, + 1327, + 1388, + 1630, + 2630, + 2642, + 3763, + 4092, + 4511, + 4628, + 4640, + 4677, + 5492, + 6071, + 6153, + 6350, + 6405, + 6543 + ], + "errorMessage": "check self.event_cursor exists" + }, + { + "pc": [ + 5425, + 5439, + 5632, + 5661, + 5991, + 5999, + 6026, + 6046, + 6236, + 6369, + 6530 + ], + "errorMessage": "check self.fixed_point_scale exists" + }, + { + "pc": [ + 6279 + ], + "errorMessage": "check self.has_rate_reset_cap exists" + }, + { + "pc": [ + 6252 + ], + "errorMessage": "check self.has_rate_reset_floor exists" + }, + { + "pc": [ + 3158, + 3543, + 4507, + 6170 + ], + "errorMessage": "check self.initial_exchange_amount exists" + }, + { + "pc": [ + 2428, + 2438 + ], + "errorMessage": "check self.initial_exchange_date exists" + }, + { + "pc": [ + 1755, + 4525, + 5967, + 5981 + ], + "errorMessage": "check self.interest_calculation_base exists" + }, + { + "pc": [ + 1827, + 1842 + ], + "errorMessage": "check self.next_principal_redemption exists" + }, + { + "pc": [ + 4530, + 5959, + 5986, + 6031 + ], + "errorMessage": "check self.nominal_interest_rate exists" + }, + { + "pc": [ + 2005, + 2018 + ], + "errorMessage": "check self.op_daemon exists" + }, + { + "pc": [ + 1652, + 1721, + 1747, + 1801, + 1853, + 1862, + 1884, + 4520, + 6509, + 6590 + ], + "errorMessage": "check self.outstanding_principal exists" + }, + { + "pc": [ + 6287, + 6301 + ], + "errorMessage": "check self.rate_reset_cap exists" + }, + { + "pc": [ + 6260, + 6274 + ], + "errorMessage": "check self.rate_reset_floor exists" + }, + { + "pc": [ + 6231 + ], + "errorMessage": "check self.rate_reset_multiplier exists" + }, + { + "pc": [ + 6624 + ], + "errorMessage": "check self.rate_reset_next exists" + }, + { + "pc": [ + 6244 + ], + "errorMessage": "check self.rate_reset_spread exists" + }, + { + "pc": [ + 1503, + 2215, + 4550 + ], + "errorMessage": "check self.reserved_interest exists" + }, + { + "pc": [ + 1508, + 1537, + 2225, + 2240, + 4555 + ], + "errorMessage": "check self.reserved_principal exists" + }, + { + "pc": [ + 2415, + 2463, + 4502, + 5574, + 6106 + ], + "errorMessage": "check self.reserved_units_total exists" + }, + { + "pc": [ + 1319, + 2634, + 3767, + 3946, + 3963, + 4083, + 4284, + 4319, + 4338, + 4458, + 4515, + 4632, + 5675, + 6346, + 6413 + ], + "errorMessage": "check self.schedule_entry_count exists" + }, + { + "pc": [ + 3991, + 4366 + ], + "errorMessage": "check self.schedule_page entry exists" + }, + { + "pc": [ + 1495, + 2105, + 2133, + 6696 + ], + "errorMessage": "check self.settlement_asset_id exists" + }, + { + "pc": [ + 1258, + 1272, + 1990, + 2055, + 2369, + 2388, + 2515, + 2526, + 2809, + 3151, + 3531, + 3749, + 3895, + 4246, + 4260, + 4476, + 4623, + 5520, + 6097, + 6191 + ], + "errorMessage": "check self.status exists" + }, + { + "pc": [ + 2421, + 2474, + 4497, + 5625, + 5656, + 6111 + ], + "errorMessage": "check self.total_units exists" + }, + { + "pc": [ + 2553, + 2563 + ], + "errorMessage": "check self.transfer_closure_date exists" + }, + { + "pc": [ + 2536, + 2544 + ], + "errorMessage": "check self.transfer_opening_date exists" + }, + { + "pc": [ + 3586, + 3643 + ], + "errorMessage": "index access is out of bounds" + }, + { + "pc": [ + 1974, + 3018, + 3501, + 3996, + 4371 + ], + "errorMessage": "invalid array length header" + }, + { + "pc": [ + 2739, + 3489, + 5075, + 5106 + ], + "errorMessage": "invalid number of bytes for arc4.bool" + }, + { + "pc": [ + 1982 + ], + "errorMessage": "invalid number of bytes for arc4.dynamic_array" + }, + { + "pc": [ + 3516 + ], + "errorMessage": "invalid number of bytes for arc4.dynamic_array" + }, + { + "pc": [ + 1968, + 2353, + 2493, + 2501, + 2731, + 2789, + 2797, + 2877, + 2885, + 2928, + 2953, + 4696, + 4720, + 4754, + 4935, + 5148, + 5232 + ], + "errorMessage": "invalid number of bytes for arc4.static_array" + }, + { + "pc": [ + 1253, + 2311, + 2320, + 2361, + 2510, + 3479, + 3880 + ], + "errorMessage": "invalid number of bytes for arc4.uint64" + }, + { + "pc": [ + 4744, + 4925, + 5222 + ], + "errorMessage": "invalid number of bytes for arc4.uint8" + }, + { + "pc": [ + 2990 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState" + }, + { + "pc": [ + 2979 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms" + }, + { + "pc": [ + 4242 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest" + }, + { + "pc": [ + 3891 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest" + }, + { + "pc": [ + 3023 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus" + }, + { + "pc": [ + 4765 + ], + "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity" + }, + { + "pc": [ + 3007 + ], + "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))" + }, + { + "pc": [ + 3002 + ], + "errorMessage": "invalid tuple encoding" + }, + { + "pc": [ + 4063, + 4438 + ], + "errorMessage": "max array length exceeded" + }, + { + "pc": [ + 4489, + 6688 + ], + "errorMessage": "overflow" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJjb250cmFjdF9zdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgQ29udHJhY3QgR292ZXJuYW5jZQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM4IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDU0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTE0ZjA0ZWIgLy8gbWV0aG9kICJjb250cmFjdF91cGRhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzMKICAgIHB1c2hieXRlc3MgMHhiNDQ2MThjOCAweGU3ODMyNTI5IDB4OTQzODg3MjMgMHg2Yzg1ZTNlZSAweGJkZDFhOTQ0IDB4N2MwZjE4MTIgMHgxNGZjMTBlZiAweDc0YTcyOTdmIDB4MDlkNGZlMTQgMHg5YTliZmE4NSAweDg1ZWVkMzNkIDB4YWIyYzBmYzQgMHhkOWYyMjVhYyAweDk4ODM1MDVhIDB4OGVhNmU3NGMgMHgwMmFmNTU3YSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X2RlZmF1bHQoYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19jb250cmFjdF9kZWZhdWx0IHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDkKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDEzCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI3CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUzCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTYKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OS01ODEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODUKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg4LTU4OQogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyCiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTItNTk0CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTYKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQwCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5LTQ0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDIKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTUKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUxCiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjczCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY1CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYtNzY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQxIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY4LTEwNjkKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM1IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgNDAgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3My0xMDc0CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDkKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTcKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYyCiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwLTExNjQKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTMKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNQogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTQtMTIxNgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTcKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODIKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjIKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgyCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODgKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODctOTg5CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OCAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk2CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA0CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNAogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAtMTAxMAogICAgLy8gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5LTEwMTEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTMKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc1CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NwogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNzkKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MAogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgxCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MgogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgzCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg0CiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODYKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg3CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODgKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4OQogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NC0xMjkwCiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA0CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNgogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUtMTMxNQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDEgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNS0xMzE1CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDgKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA1LTEzMTUKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzE2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjEtMTY0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODEKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTIKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDAKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUyCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NwogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDM0IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gcmV0dXJuIHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NgogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ5CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ4LTM3OQogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc5CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc1CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzY5LTM3MQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzIKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjUKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NC0zNjYKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NwogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjAKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0LTM1NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTAtMzUyCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYxCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2My02NQogICAgLy8gIyBDb21wdXRlIHRoZSBpbmNyZW1lbnRhbCBwZXItdW5pdCBmaXhlZC1wb2ludCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFjY3J1ZWQKICAgIC8vICMgc2luY2UgdGhpcyBhY2NvdW50J3MgbGFzdCBjaGVja3BvaW50LgogICAgLy8gaW50ZXJlc3RfZGVsdGEgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggLSBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IC0gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBkaWcgMgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MwogICAgLy8gaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjcwLTc0CiAgICAvLyAjIENvbnZlcnQgdGhlIHBlci11bml0IGZpeGVkLXBvaW50IGRlbHRhcyBpbnRvIGFic29sdXRlIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIHVzaW5nIHRoZSBhY2NvdW50J3MgYWN0aXZlIHVuaXRzLgogICAgLy8gY2xhaW1hYmxlX2ludGVyZXN0ID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NS03NwogICAgLy8gY2xhaW1hYmxlX3ByaW5jaXBhbCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzktODEKICAgIC8vICMgQWNjcnVlIHRoZSBjbGFpbWFibGUgYW1vdW50cyB0byB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQogICAgLy8gIyBmb3Igd2l0aGRyYXdhbC4KICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCArPSBjbGFpbWFibGVfaW50ZXJlc3QKICAgIGRpZyAyCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4MgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCArPSBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NC04NgogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgcGVyLXVuaXQgZml4ZWQtcG9pbnQgY2hlY2twb2ludHMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsCiAgICAvLyAjIHBlci11bml0IGZpeGVkLXBvaW50IGdsb2JhbCBpbmRpY2VzLgogICAgLy8gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg3CiAgICAvLyBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA2NQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg5LTkwCiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBldmVudCBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIGV2ZW50IGN1cnNvci4KICAgIC8vIHBvc2l0aW9uLnNldHRsZWRfY3Vyc29yID0gc2VsZi5ldmVudF9jdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5Mi05NAogICAgLy8gIyBVcGRhdGUgdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIHJldHVybiB0aGUgbmV3bHkgYWNjcnVlZCBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyBhZGRlZCB0byB0aGUgdG90YWwgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cy4KICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NQogICAgLy8gcmV0dXJuIGNsYWltYWJsZV9pbnRlcmVzdCwgY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTcKICAgIC8vIGRlZiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDEKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0MwogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MwogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODQKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Mi02ODQKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODYKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3LTY4OQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDMtNzA5CiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDkKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTAKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTktNzIxCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI0CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzI1CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzExLTcyNgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MQogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjItNjMKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MS02MwogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NwogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTQKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jb250cmFjdF9zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMyAvLyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwEmNvbnRyYWN0X3N1c3BlbmRlZAlkZWZhdWx0ZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxsyA2cnISJnJyIiZykiZycKImcnKoAAZycrgABnJywiZycTImcnHCJnJy0iZycdImcnHiJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyMiZycHImcnBiJnJwkiZyckImcnJSJnJx8iZycgImcnJiJnJyciZycoImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQoSRDE0gTYSRDE3FEQxNhREgASRTwTrNhoAjgEAzjEZFEQxGEEAt4IZBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBDkkH6MEAQyCmQR0BqzSBBpyou42GgCOGQBWAyEEfQSnBTEGIQZbBrMG5gcUCQgKHwqYDAQM9g2JDc4N5g3+DrMPSQ9oD4cPkg/cAIAElW1xVjYaAI4BBvEAMRmBBBIxGBBEQg2uigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScvsh4nL7Ifi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74kigABHDTYaAUkVJBJEFyIpZUREiBW9iBXEiBXJIillRIEyEhREiBIgQQALSYFkCyEECCKI/48iRQUiRQ4iRQ1LBEsBDEECWSIqZUQiK2VEDEECTSIqZUSIEPJJRRGBCVtJRQMyBw1AAjdLDyRVSUUQJBJJRQRAABBLDoEDEkAACEsOgRMSQQI/I0ECFEsPIlsiKmVEEkRLATIHDkRLAkAB7UsOgRMSQAHlIkULSw8kVUlFEIEDEkABZUsOgRMSQAFdIkUGSw+BMVtFCIgRekAA/ksHRQlLCogQOEsGiBAzSwGIEE1JTgJFD0mIEERJRQtLAksBCElFCTIKIicTZURwAEQiJw9lRCInDGVESwEISwJLAQ9ETwJMCU8CD0RPAwgnD0xnIicMZUQIJwxMZyInEGVETwIIJxBMZyInEWVECCcRTGdLDyRVgQMSQQB6IicGZURLEIgRBkUSCCcGTGeIEOZBAApLDyRVgRMSQQAJSw+BKVsnDkxnJwRLCGcnB0sJZyIqZUQjCCpMZ0sPVwgBgAETqEEAESInBGVEQAAJKYHIAWcnByJnSw9LBEmIE3NISw1LDAhFDksMSwcIRQ1LBCMIRQVC/ncnBiJnQv+QSw8kVUlFEIEDEkEAECInBGVESwYJSUUJRQlC/ulLDiQSQQATIicEZUxFCUQiJwdlTEUKREL+z0sOgRMSQAAHSwdFCUL+wCJFCCJFCUL+t4gQJ0EAVksOgRMSQQAKIicEZURFBkL+jiInBmVESxCIEB5FEghJRQsiJw5lRA9BAAYiRQZC/m8iJw5lREsKCUlFCCInBGVEDUEACiInBGVERQZC/lFLBkUGQv5KSw+BMVsiJwRlREoOREwJRQZC/jYiJwZlREsQiA/GRRIIRQtC/gxLBElESw5JSw9JTgMIMgdPAhZPAxZQTwIWUE8CFlBMFlAoTFCwI0MiQv2+gABHAjYaAUcCFSUSRDYaAkkiWYECCEsBFRJEVwIATCIpZUREJwhMUEm9RQFEIicbZUQyAxNBACIxACInG2VEEkAAFTEASwMSQAANMQBLAb5EVwAgEkEBACNEiBK1iBK6IillRIEyEhRESwJJiA1qiAztRgJJvkRJgUlbSU4CRQhJgVFbSUUITwIISUUGRFcAICInE2VEcABFAUEAt0m+RIGAA1NAAK0jQQB4MgoiJxNlRExLAXAAREsFSU4CD0RLAklOA75ESVcAILEyAE8DshJMshRPArIRgQSyELIBs0mBSVtJTgJFCUmBUVtJTgNFCSIWTEsBXElMXFFPA0y/IicPZURJSwIPRCInDGVESwMPREwJJw9MZyInDGVETAknDExnSwVJSwZJTgMIMgdPAhZPAxZQTwIWUEwWUEsCSRUWVwYCTFBMgAIAIlBMUChMULAjQyJC/1AiQv79NhoBSRUkEkQXNhoCSRUkEkQXiBGXSgxEJx1PAmcnHkxnMgcWKExQsCNDNhoBSRUlEkQ2GgJJFSQSRBdJTgIiKWVERCcWMQCIES5EiBFoiBFtIillRIEyEkQnCEsCUElOA71FAURMiAuJSUQiJwtlRAgiJw1lRA5EIiccZURBAAkyByInHGVEDkRHAr5EgShbSwNJTgMIFoEoTLsiJwtlRAgnC0sBZyInDWVETAkWKExQsCNDIkk2GgFJFSUSRDYaAkkVJRJENhoDRwIVJBJEFyIpZUREiBDeiBDjIillRIEyEhREIicdZURBAAkiJx1lRDIHDkQiJx5lREEACTIHIiceZUQMRDEASwRJTgISRCcISwFQSUUISb1FAUQnCEsFSU4CUElFCb1FAURLAogKwkmICr5PAhNESwFJREy+RCVbDkQiKmVEIitlRA9AAA4iKmVEiAvPgQlbMgcNREsDSYgLGksDSU4CiAsSiAqVRgKICpBGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgPu0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA+DRCIpZUSByAESFESID7OID7gnCE8CUEm9RQEURCIWTwJLAVBLAVAnKVBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgPXYgPYiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA7ZIlVJJwpLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGHI0QiJwplTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFHI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycLImcnLksIZ0mBKVsnHEsBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUycjTGdLAYEQWycETGdLAYEoWycGTGdLASVbJwlMZ0sBgRhbJwdMZ0sDgTpbJyRMZ0sDgUJbJyVMZ0sDgUpbJx9MZ0sDgVJbJyBMZ0sDgVpbJyZMZ0sDgZAGUycnTGdLA4GRBlMnKExnTwOBY1snBUxnSwEkWypMZ0sBgThbJxBMZ0sBgUBbJxFMZycPImcnDCJnSwIyBw1ETCJbSwIMRAxESwJXACAnKkxnSwFXAgAnK0xnMgcWKExQsCNDIkL+tiJC/nYigABHAjYaAUkVJBJEF0k2GgJJFSMSRCJTTDYaA0lOAkkiWUlOA0mBQQuBAghPAhUSRIgM7CInCmVMTgNEIillRBRESYEQDkQiJxRlRERMgRALTIFkCyEECCKI9rYiSUsEDEEAi0sEVwIASUUMSwFJTgKBQQuBQVhJJFVJTgJFDUkiW0lFDUsFTwQISwESREsFTwOICDhMgQlbSUUKREEAF0lBACVJIwmBQQtLC0yBQViBCVtLCA5ESwhAAAVLCSMSREkjCEUBQv+USwZJRCMJFicYTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8FLBhYnGExQSbxISwW/SwVBAAxLAUsECCtMZymBMmcyBxYoTFCwI0MiKWVERIgMAogMCYgMDiIqZUQiK2VESwENRIgHZklXCAFJgAEBqERLAVcACEsCVwkISwNXEQhLBFcZCEsFVyEISwZXKQhLB1cxCEsIVzkITwdPCFBPB1BPBlBPBVAiFlBPBFBPA1BPAlBMUIgImEYCMgcWKExQsCNDIkcEgABJNhoBSRUkEkQXNhoCRwIVgUkSRCIpZUREiAt6iAt/gUFbSYEEGkEAsCInCmVEgQUSRIgLVyInCmVESYEFEkRLAkkiW0lFByIrZUQSRElXCAFFDCRViAbhIitlRIEQCicwRQcWJxhMUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IitlRCMIK0xnIiplREsDSU8CEkSIBh5JRQhJVwgBRQokVUlFBiMSQAAoSwSBBBJAACBLBIEMEkAAGEsEgQsSQAAQSwSBEhJAAAhLBIEFEkEAQSNESwiAAQGpREsEgQwSQAAISwSBCxJBACQjQQAaJxkxAIgKEkRLBksCiAc6RgIyBxYoTFCwI0OICjBC/+giQv/ZIkL/vCJJNhoBRwIVgUESRCIpZUREiAoRiAoYiAodIillRIEyEhREIicKZUSBBRJESSJbSU4CIitlRExLARJESwFXCAFJTgOAAQOoREyBOVtJTgIjGkRBABMiK2VEIwmIBUCBCVtLBIEJWw5EIitlRIEQCicwRQYWJxhMUElFB71FAUEAB0sFvkxFBkRLBEkiWUmBEAxESwVJVwkISwFXEQhLAlcZCEsDVyEISwRXKQhPBVcxCEsKFksKUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLBkm8SEy/IitlRCMIK0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicpUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgD3EL/8IgIXSNDNhoBSRUlEkSICFAnEkxnMgcWKExQsCNDNhoBSRUlEkSICDgnG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSICAuICBIXRwKICByBFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHYYgHaBdHAogHckmBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAabRCchTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgGfEQnIkxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBlQnFksCiAZNJxpLA4gGRicVSwSIBj8nGU8FiAY4JykiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAZQgwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcZSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycaSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwtlRElLAg9ETAknC0xniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiK2VEi/8NRIv/gRAKFicYTFBJvUUBRIv/gRAYSwEigQK6F0sBDUSBQQuBAgiBQbqJigIAi/8jEkAAH4v/JBJAABiL/4ETEkAAEIv/gQwSQAAIi/+BCxJBAAMjRImL/kAABCJC//WL/oEDEkAACIv+gQISQQAYi/+BAxJAAAiL/4ESEkEABCNC/9EiQv/Ni/4jEkEAIIv/gQMSQAAQi/+BEhJAAAiL/4EFEkEABCNC/6oiQv+mi/6BBBJBACiL/4EDEkAAGIv/gQQSQAAQi/+BEhJAAAiL/4EFEkEABCNC/3oiQv92i/6BBRJBAAiL/4EDEkL/ZiJC/2IiJwplRCMSQQAKIicjZURBAAIjiSKJigECi/+BEVtJQQAQIicJZURBAAgiJwdlREAABiKL/08CiSInB2VEIicJZUQiJwVlRIj+aCInBWVEiwBMiP5di/9PAomKAgGL/0AAA4v+iSInBWVEIicJZUSL/0sCiP48CElEIicFZUSL/kxPAoj+LImKAgIigABHCIv+IlsiKmVEEkSL/oEJWzIHDkSL/iRVSSMSSUEAXiIpZUSBMhJEIicLZUQiJw1lRBJEi/6BMVsnBEsBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogB2kmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP74jP4IJwZMZ4sKgQwSQQF4i/+BIVsiJyVlRCInBWVEiP1zIickZUQIjAYiJydlREEAEyInH2VEiwYNQQAIIicfZUyMBkQiJyhlREEAEyInIGVEiwYMQQAIIicgZUyMBkQnCYsGZ4sKgQQSQQEHi/6BMVsnBEsBZycHTGeI/mVBAOeLCoEFEkEAxSIrZUQiKmVECYFkCyEECCKI68QiJwVlTIwCRCKMASKMB4v+gRlbSYwIQQAPiwKLCIj+gUmMAiOMB4wBIiplRCMIjAMiK2VEiwMNQQBSiwOI/QxJjAAkVUmMBIEDEkAAEIsEgRMSQQAziwCBGVtBACsjQQAIiwdBAAwijAeLAyMIjANC/76LAIEZW4sCTIj+JEmMAosBCIwBQv/hIkL/0osBRCInBGVEi/6BOVskGkAABiInBmVECCInBWVEiwGI/EsnDkxnIiplRCMIKkxni/4iSYgAYEmM/ov/jAGMAImL/oEpWycOTGdC/9qLCoESEkH+/yInBGVEJwdMZ0L+84sKgQsSQQAbi/6BIVtJjAVAAAgiJyZlTIwFRCcJiwVnQv66i/6BIVtJjAlB/q8nCYsJZ0L+p4oDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInImVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", + "clear": "DIEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 5, + "minor": 7, + "patch": 1 + } + }, + "events": [ + { + "name": "ExecutionEvent", + "args": [ + { + "type": "uint64", + "name": "contract_id" + }, + { + "type": "uint64", + "name": "event_id" + }, + { + "type": "uint8", + "name": "event_type" + }, + { + "type": "uint64", + "name": "scheduled_time" + }, + { + "type": "uint64", + "name": "applied_at" + }, + { + "type": "uint64", + "name": "payoff" + }, + { + "type": "uint8", + "name": "payoff_sign" + }, + { + "type": "uint64", + "name": "settled_amount" + }, + { + "type": "uint64", + "name": "currency_id" + }, + { + "type": "uint64", + "name": "sequence" + } + ], + "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event." + } + ], + "templateVariables": {} +} \ No newline at end of file diff --git a/src/d_asa/artifacts/__init__.py b/src/d_asa/artifacts/__init__.py new file mode 100644 index 00000000..33f0e674 --- /dev/null +++ b/src/d_asa/artifacts/__init__.py @@ -0,0 +1 @@ +"""Generated client artifacts.""" diff --git a/src/d_asa/artifacts/dasa_avm_client.py b/src/d_asa/artifacts/dasa_avm_client.py new file mode 100644 index 00000000..981c4a86 --- /dev/null +++ b/src/d_asa/artifacts/dasa_avm_client.py @@ -0,0 +1,385 @@ +# This file is auto-generated, do not modify +# flake8: noqa +# fmt: off +import typing + +import algopy + +class CashFundingResult(algopy.arc4.Struct): + funded_interest: algopy.arc4.UIntN[typing.Literal[64]] + funded_principal: algopy.arc4.UIntN[typing.Literal[64]] + total_funded: algopy.arc4.UIntN[typing.Literal[64]] + processed_events: algopy.arc4.UIntN[typing.Literal[64]] + timestamp: algopy.arc4.UIntN[typing.Literal[64]] + +class CashClaimResult(algopy.arc4.Struct): + interest_amount: algopy.arc4.UIntN[typing.Literal[64]] + principal_amount: algopy.arc4.UIntN[typing.Literal[64]] + total_amount: algopy.arc4.UIntN[typing.Literal[64]] + timestamp: algopy.arc4.UIntN[typing.Literal[64]] + context: algopy.arc4.DynamicBytes + +class AccountPosition(algopy.arc4.Struct): + payment_address: algopy.arc4.Address + units: algopy.arc4.UIntN[typing.Literal[64]] + reserved_units: algopy.arc4.UIntN[typing.Literal[64]] + suspended: algopy.arc4.Bool + settled_cursor: algopy.arc4.UIntN[typing.Literal[64]] + interest_checkpoint: algopy.arc4.UIntN[typing.Literal[64]] + principal_checkpoint: algopy.arc4.UIntN[typing.Literal[64]] + claimable_interest: algopy.arc4.UIntN[typing.Literal[64]] + claimable_principal: algopy.arc4.UIntN[typing.Literal[64]] + +class NormalizedActusTerms(algopy.arc4.Struct): + contract_type: algopy.arc4.UIntN[typing.Literal[8]] + denomination_asset_id: algopy.arc4.UIntN[typing.Literal[64]] + settlement_asset_id: algopy.arc4.UIntN[typing.Literal[64]] + total_units: algopy.arc4.UIntN[typing.Literal[64]] + notional_principal: algopy.arc4.UIntN[typing.Literal[64]] + initial_exchange_amount: algopy.arc4.UIntN[typing.Literal[64]] + initial_exchange_date: algopy.arc4.UIntN[typing.Literal[64]] + maturity_date: algopy.arc4.UIntN[typing.Literal[64]] + day_count_convention: algopy.arc4.UIntN[typing.Literal[8]] + rate_reset_spread: algopy.arc4.UIntN[typing.Literal[64]] + rate_reset_multiplier: algopy.arc4.UIntN[typing.Literal[64]] + rate_reset_floor: algopy.arc4.UIntN[typing.Literal[64]] + rate_reset_cap: algopy.arc4.UIntN[typing.Literal[64]] + rate_reset_next: algopy.arc4.UIntN[typing.Literal[64]] + has_rate_reset_floor: algopy.arc4.Bool + has_rate_reset_cap: algopy.arc4.Bool + dynamic_principal_redemption: algopy.arc4.Bool + fixed_point_scale: algopy.arc4.UIntN[typing.Literal[64]] + +class InitialKernelState(algopy.arc4.Struct): + status_date: algopy.arc4.UIntN[typing.Literal[64]] + event_cursor: algopy.arc4.UIntN[typing.Literal[64]] + outstanding_principal: algopy.arc4.UIntN[typing.Literal[64]] + interest_calculation_base: algopy.arc4.UIntN[typing.Literal[64]] + nominal_interest_rate: algopy.arc4.UIntN[typing.Literal[64]] + accrued_interest: algopy.arc4.UIntN[typing.Literal[64]] + next_principal_redemption: algopy.arc4.UIntN[typing.Literal[64]] + cumulative_interest_index: algopy.arc4.UIntN[typing.Literal[64]] + cumulative_principal_index: algopy.arc4.UIntN[typing.Literal[64]] + +class Prospectus(algopy.arc4.Struct): + hash: algopy.arc4.StaticArray[algopy.arc4.Byte, typing.Literal[32]] + url: algopy.arc4.String + +class ObservedEventRequest(algopy.arc4.Struct): + event_id: algopy.arc4.UIntN[typing.Literal[64]] + event_type: algopy.arc4.UIntN[typing.Literal[8]] + scheduled_time: algopy.arc4.UIntN[typing.Literal[64]] + accrual_factor: algopy.arc4.UIntN[typing.Literal[64]] + redemption_accrual_factor: algopy.arc4.UIntN[typing.Literal[64]] + observed_rate: algopy.arc4.UIntN[typing.Literal[64]] + next_nominal_interest_rate: algopy.arc4.UIntN[typing.Literal[64]] + next_principal_redemption: algopy.arc4.UIntN[typing.Literal[64]] + next_outstanding_principal: algopy.arc4.UIntN[typing.Literal[64]] + flags: algopy.arc4.UIntN[typing.Literal[64]] + +class ObservedCashEventRequest(algopy.arc4.Struct): + event_id: algopy.arc4.UIntN[typing.Literal[64]] + event_type: algopy.arc4.UIntN[typing.Literal[8]] + scheduled_time: algopy.arc4.UIntN[typing.Literal[64]] + accrual_factor: algopy.arc4.UIntN[typing.Literal[64]] + redemption_accrual_factor: algopy.arc4.UIntN[typing.Literal[64]] + next_nominal_interest_rate: algopy.arc4.UIntN[typing.Literal[64]] + next_principal_redemption: algopy.arc4.UIntN[typing.Literal[64]] + next_outstanding_principal: algopy.arc4.UIntN[typing.Literal[64]] + flags: algopy.arc4.UIntN[typing.Literal[64]] + +class KernelState(algopy.arc4.Struct): + contract_type: algopy.arc4.UIntN[typing.Literal[8]] + status: algopy.arc4.UIntN[typing.Literal[64]] + total_units: algopy.arc4.UIntN[typing.Literal[64]] + reserved_units_total: algopy.arc4.UIntN[typing.Literal[64]] + initial_exchange_amount: algopy.arc4.UIntN[typing.Literal[64]] + event_cursor: algopy.arc4.UIntN[typing.Literal[64]] + schedule_entry_count: algopy.arc4.UIntN[typing.Literal[64]] + outstanding_principal: algopy.arc4.UIntN[typing.Literal[64]] + interest_calculation_base: algopy.arc4.UIntN[typing.Literal[64]] + nominal_interest_rate: algopy.arc4.UIntN[typing.Literal[64]] + accrued_interest: algopy.arc4.UIntN[typing.Literal[64]] + cumulative_interest_index: algopy.arc4.UIntN[typing.Literal[64]] + cumulative_principal_index: algopy.arc4.UIntN[typing.Literal[64]] + reserved_interest: algopy.arc4.UIntN[typing.Literal[64]] + reserved_principal: algopy.arc4.UIntN[typing.Literal[64]] + +class ExecutionScheduleEntry(algopy.arc4.Struct): + event_id: algopy.arc4.UIntN[typing.Literal[64]] + event_type: algopy.arc4.UIntN[typing.Literal[8]] + scheduled_time: algopy.arc4.UIntN[typing.Literal[64]] + accrual_factor: algopy.arc4.UIntN[typing.Literal[64]] + redemption_accrual_factor: algopy.arc4.UIntN[typing.Literal[64]] + next_nominal_interest_rate: algopy.arc4.UIntN[typing.Literal[64]] + next_principal_redemption: algopy.arc4.UIntN[typing.Literal[64]] + next_outstanding_principal: algopy.arc4.UIntN[typing.Literal[64]] + flags: algopy.arc4.UIntN[typing.Literal[64]] + +class RoleValidity(algopy.arc4.Struct): + role_validity_start: algopy.arc4.UIntN[typing.Literal[64]] + role_validity_end: algopy.arc4.UIntN[typing.Literal[64]] + +class DASA(algopy.arc4.ARC4Client, typing.Protocol): + """ + Debt Algorand Standard Application. + """ + @algopy.arc4.abimethod + def fund_due_cashflows( + self, + max_event_count: algopy.arc4.UIntN[typing.Literal[64]], + ) -> CashFundingResult: + """ + Reserve due ACTUS cash events into the escrow-style claim ledger. + """ + + @algopy.arc4.abimethod + def claim_due_cashflows( + self, + holding_address: algopy.arc4.Address, + payment_info: algopy.arc4.DynamicBytes, + ) -> CashClaimResult: + """ + Withdraw the holder's already funded ACTUS cash entitlements. + """ + + @algopy.arc4.abimethod + def transfer_set_schedule( + self, + open_date: algopy.arc4.UIntN[typing.Literal[64]], + closure_date: algopy.arc4.UIntN[typing.Literal[64]], + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Configure the secondary-market transfer window. + """ + + @algopy.arc4.abimethod + def primary_distribution( + self, + holding_address: algopy.arc4.Address, + units: algopy.arc4.UIntN[typing.Literal[64]], + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Reserve units for a holder before the initial exchange activates issuance. + """ + + @algopy.arc4.abimethod + def transfer( + self, + sender_holding_address: algopy.arc4.Address, + receiver_holding_address: algopy.arc4.Address, + units: algopy.arc4.UIntN[typing.Literal[64]], + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Transfer active units after settling both counterparties to the current cursor. + Returns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based. + """ + + @algopy.arc4.abimethod + def account_suspension( + self, + holding_address: algopy.arc4.Address, + suspended: algopy.arc4.Bool, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Set the suspension status of one account. + """ + + @algopy.arc4.abimethod + def account_open( + self, + holding_address: algopy.arc4.Address, + payment_address: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Open a contract account with a new position and register its payment address. + """ + + @algopy.arc4.abimethod + def account_update_payment_address( + self, + holding_address: algopy.arc4.Address, + payment_address: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Update the payment address of an account. + """ + + @algopy.arc4.abimethod(readonly=True) + def account_get_position( + self, + holding_address: algopy.arc4.Address, + ) -> AccountPosition: + """ + Get the full accounting position for one holder. + """ + + @algopy.arc4.abimethod(create='require') + def contract_create( + self, + arranger: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Create a new D-ASA contract and set the arranger role. + """ + + @algopy.arc4.abimethod + def contract_config( + self, + terms: NormalizedActusTerms, + initial_state: InitialKernelState, + prospectus: Prospectus, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Partial contract configuration with: normalized ACTUS terms, initial kernel + state (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next. + """ + + @algopy.arc4.abimethod + def contract_schedule( + self, + schedule_page_index: algopy.arc4.UIntN[typing.Literal[64]], + is_last_page: algopy.arc4.Bool, + schedule_page: algopy.arc4.DynamicArray[algopy.arc4.Tuple[algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[8]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]]]], + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Upload one normalized schedule page. + The configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`. + """ + + @algopy.arc4.abimethod + def contract_execute_ied( + self, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Execute the first due `IED` entry and activate the contract. + `IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`. + """ + + @algopy.arc4.abimethod + def apply_non_cash_event( + self, + event_id: algopy.arc4.UIntN[typing.Literal[64]], + payload: ObservedEventRequest, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Apply the next due non-cash event, optionally appending one first. + Observed payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled. + """ + + @algopy.arc4.abimethod + def append_observed_cash_event( + self, + payload: ObservedCashEventRequest, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Append an arranger-authorized observed cash event to the schedule tail. + """ + + @algopy.arc4.abimethod(readonly=True) + def contract_get_state( + self, + ) -> KernelState: + """ + Return a readonly snapshot of the generic ACTUS kernel state. + """ + + @algopy.arc4.abimethod(readonly=True) + def contract_get_next_due_event( + self, + ) -> ExecutionScheduleEntry: + """ + Return the next boxed schedule entry, or a zeroed sentinel if ended. + """ + + @algopy.arc4.abimethod(allow_actions=['UpdateApplication']) + def contract_update( + self, + ) -> None: + """ + Update D-ASA application. + """ + + @algopy.arc4.abimethod + def rbac_rotate_arranger( + self, + new_arranger: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Rotate the arranger address. + """ + + @algopy.arc4.abimethod + def rbac_set_op_daemon( + self, + address: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Non-normative helper to set the operation daemon address. + """ + + @algopy.arc4.abimethod + def rbac_assign_role( + self, + role_id: algopy.arc4.UIntN[typing.Literal[8]], + role_address: algopy.arc4.Address, + validity: RoleValidity, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Assign a role to an address. + """ + + @algopy.arc4.abimethod + def rbac_revoke_role( + self, + role_id: algopy.arc4.UIntN[typing.Literal[8]], + role_address: algopy.arc4.Address, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Revoke a role from an address. + """ + + @algopy.arc4.abimethod + def rbac_contract_suspension( + self, + suspended: algopy.arc4.Bool, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Set the asset-wide suspension status. + """ + + @algopy.arc4.abimethod + def rbac_contract_default( + self, + defaulted: algopy.arc4.Bool, + ) -> algopy.arc4.UIntN[typing.Literal[64]]: + """ + Set D-ASA default status + """ + + @algopy.arc4.abimethod(readonly=True) + def rbac_get_arranger( + self, + ) -> algopy.arc4.Address: + """ + Get the arranger address. + """ + + @algopy.arc4.abimethod(readonly=True) + def rbac_get_address_roles( + self, + address: algopy.arc4.Address, + ) -> algopy.arc4.Tuple[algopy.arc4.Bool, algopy.arc4.Bool, algopy.arc4.Bool, algopy.arc4.Bool, algopy.arc4.Bool]: + """ + Non-normative helper to get the active roles assigned to an address. + """ + + @algopy.arc4.abimethod(readonly=True) + def rbac_get_role_validity( + self, + role_id: algopy.arc4.UIntN[typing.Literal[8]], + role_address: algopy.arc4.Address, + ) -> RoleValidity: + """ + Get the stored validity interval for a role assignment. + """ diff --git a/src/d_asa/artifacts/dasa_client.py b/src/d_asa/artifacts/dasa_client.py new file mode 100644 index 00000000..ee84df32 --- /dev/null +++ b/src/d_asa/artifacts/dasa_client.py @@ -0,0 +1,3879 @@ +# flake8: noqa +# fmt: off +# mypy: ignore-errors +# This file was automatically generated by algokit-client-generator. +# DO NOT MODIFY IT BY HAND. +# requires: algokit-utils@^3.0.0 + +# common +import dataclasses +import typing +# core algosdk +import algosdk +from algosdk.transaction import OnComplete +from algosdk.atomic_transaction_composer import TransactionSigner +from algosdk.source_map import SourceMap +from algosdk.transaction import Transaction +from algosdk.v2client.models import SimulateTraceConfig +# utils +import algokit_utils +from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient + +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Maximum number of due cash events to process in this call.", "name": "max_event_count"}], "name": "fund_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,uint64)", "desc": "Funding result with reserved interest, reserved principal, and event count.", "struct": "CashFundingResult"}, "desc": "Reserve due ACTUS cash events into the escrow-style claim ledger.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Holder whose position should be settled and claimed.", "name": "holding_address"}, {"type": "byte[]", "desc": "Opaque settlement context returned in the result.", "name": "payment_info"}], "name": "claim_due_cashflows", "returns": {"type": "(uint64,uint64,uint64,uint64,byte[])", "desc": "Claim result with realized interest, principal, and passthrough context.", "struct": "CashClaimResult"}, "desc": "Withdraw the holder's already funded ACTUS cash entitlements.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Inclusive UNIX timestamp at which transfers may start.", "name": "open_date"}, {"type": "uint64", "desc": "Exclusive UNIX timestamp at which transfers stop.", "name": "closure_date"}], "name": "transfer_set_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule update."}, "desc": "Configure the secondary-market transfer window.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account receiving the reserved units.", "name": "holding_address"}, {"type": "uint64", "desc": "Number of units to reserve.", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining undistributed unit balance."}, "desc": "Reserve units for a holder before the initial exchange activates issuance.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account debited for the transfer.", "name": "sender_holding_address"}, {"type": "address", "desc": "Account credited for the transfer.", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Number of active units to move.", "name": "units"}], "name": "transfer", "returns": {"type": "uint64", "desc": "Number of units transferred."}, "desc": "Transfer active units after settling both counterparties to the current cursor.\nReturns the number of units moved. The ACTUS kernel no longer persists a nominal per-unit value on-chain, so transfer results are unit-based.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "account_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the suspension status of one account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "Account payment address.", "name": "payment_address"}], "name": "account_open", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account opening."}, "desc": "Open a contract account with a new position and register its payment address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}, {"type": "address", "desc": "New account payment address.", "name": "payment_address"}], "name": "account_update_payment_address", "returns": {"type": "uint64", "desc": "UNIX timestamp of the account update."}, "desc": "Update the payment address of an account.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account holding address.", "name": "holding_address"}], "name": "account_get_position", "returns": {"type": "(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", "desc": "Account position record.", "struct": "AccountPosition"}, "desc": "Get the full accounting position for one holder.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA arranger address.", "name": "arranger"}], "name": "contract_create", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract creation."}, "desc": "Create a new D-ASA contract and set the arranger role.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64)", "desc": "Normalized ACTUS terms.", "name": "terms", "struct": "NormalizedActusTerms"}, {"type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Initial kernel state captured before `IED`.", "name": "initial_state", "struct": "InitialKernelState"}, {"type": "(byte[32],string)", "desc": "Prospectus metadata stored for reference only.", "name": "prospectus", "struct": "Prospectus"}], "name": "contract_config", "returns": {"type": "uint64", "desc": "UNIX timestamp of contract configuration."}, "desc": "Partial contract configuration with: normalized ACTUS terms, initial kernel\nstate (pre-IED), prospectus (informational only). The contract stays inactive until all schedule pages are configured next.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Zero-based page index within the boxed schedule.", "name": "schedule_page_index"}, {"type": "bool", "desc": "Whether this page finalizes the schedule upload.", "name": "is_last_page"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "desc": "Normalized schedule entries for the requested page.", "name": "schedule_page"}], "name": "contract_schedule", "returns": {"type": "uint64", "desc": "UNIX timestamp of the schedule upload."}, "desc": "Upload one normalized schedule page.\nThe configuration operation is considered complete only when the last page is stored. At that point `schedule_entry_count` is finalized and the contract moves to `STATUS_PENDING_IED`.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_execute_ied", "returns": {"type": "uint64", "desc": "UNIX timestamp of the `IED` execution."}, "desc": "Execute the first due `IED` entry and activate the contract.\n`IED` is the one non-cash event that moves the app from `STATUS_PENDING_IED` to `STATUS_ACTIVE`.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Expected global schedule event identifier at the current cursor.", "name": "event_id"}, {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed payload used for append-on-execute and/or rate resets.", "name": "payload", "struct": "ObservedEventRequest"}], "name": "apply_non_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the non-cash event application."}, "desc": "Apply the next due non-cash event, optionally appending one first.\nObserved payloads are appended before execution when flagged. Rate reset events require the interest oracle because they can change the running nominal rate; other non-cash events stay arranger-controlled.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Observed cash-event payload to append after the current tail.", "name": "payload", "struct": "ObservedCashEventRequest"}], "name": "append_observed_cash_event", "returns": {"type": "uint64", "desc": "UNIX timestamp of the append operation."}, "desc": "Append an arranger-authorized observed cash event to the schedule tail.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_state", "returns": {"type": "(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Current kernel state snapshot.", "struct": "KernelState"}, "desc": "Return a readonly snapshot of the generic ACTUS kernel state.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "contract_get_next_due_event", "returns": {"type": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "Next due schedule entry, or an all-zero sentinel if the contract ended.", "struct": "ExecutionScheduleEntry"}, "desc": "Return the next boxed schedule entry, or a zeroed sentinel if ended.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [], "name": "contract_update", "returns": {"type": "void", "desc": "None."}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "New arranger address.", "name": "new_arranger"}], "name": "rbac_rotate_arranger", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Rotate the arranger address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Operation daemon address.", "name": "address"}], "name": "rbac_set_op_daemon", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}, {"type": "(uint64,uint64)", "desc": "Inclusive validity interval for the assignment.", "name": "validity", "struct": "RoleValidity"}], "name": "rbac_assign_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role assignment."}, "desc": "Assign a role to an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_revoke_role", "returns": {"type": "uint64", "desc": "UNIX timestamp of the role revocation."}, "desc": "Revoke a role from an address.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status to apply.", "name": "suspended"}], "name": "rbac_contract_suspension", "returns": {"type": "uint64", "desc": "UNIX timestamp of the suspension update."}, "desc": "Set the asset-wide suspension status.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "rbac_contract_default", "returns": {"type": "uint64"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "rbac_get_arranger", "returns": {"type": "address", "desc": "Current arranger address."}, "desc": "Get the arranger address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Address to query.", "name": "address"}], "name": "rbac_get_address_roles", "returns": {"type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer."}, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint8", "desc": "Role identifier.", "name": "role_id"}, {"type": "address", "desc": "Account role address.", "name": "role_address"}], "name": "rbac_get_role_validity", "returns": {"type": "(uint64,uint64)", "desc": "Stored role validity interval.", "struct": "RoleValidity"}, "desc": "Get the stored validity interval for a role assignment.", "events": [], "readonly": true, "recommendations": {}}], "name": "DASA", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjpBUlIj", "keyType": "AVMBytes", "valueType": "address"}, "op_daemon": {"key": "UjpPUEQj", "keyType": "AVMBytes", "valueType": "address"}, "contract_suspended": {"key": "Y29udHJhY3Rfc3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "contract_type": {"key": "Y29udHJhY3RfdHlwZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "prospectus_hash": {"key": "cHJvc3BlY3R1c19oYXNo", "keyType": "AVMString", "valueType": "AVMBytes"}, "prospectus_url": {"key": "cHJvc3BlY3R1c191cmw=", "keyType": "AVMString", "valueType": "AVMString"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_date": {"key": "aW5pdGlhbF9leGNoYW5nZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_opening_date": {"key": "dHJhbnNmZXJfb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "transfer_closure_date": {"key": "dHJhbnNmZXJfY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_units_total": {"key": "cmVzZXJ2ZWRfdW5pdHNfdG90YWw=", "keyType": "AVMString", "valueType": "AVMUint64"}, "initial_exchange_amount": {"key": "aW5pdGlhbF9leGNoYW5nZV9hbW91bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "outstanding_principal": {"key": "b3V0c3RhbmRpbmdfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "next_principal_redemption": {"key": "bmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "dynamic_principal_redemption": {"key": "ZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_calculation_base": {"key": "aW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "accrued_interest": {"key": "YWNjcnVlZF9pbnRlcmVzdA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "nominal_interest_rate": {"key": "bm9taW5hbF9pbnRlcmVzdF9yYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_spread": {"key": "cmF0ZV9yZXNldF9zcHJlYWQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_multiplier": {"key": "cmF0ZV9yZXNldF9tdWx0aXBsaWVy", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_floor": {"key": "cmF0ZV9yZXNldF9mbG9vcg==", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_cap": {"key": "cmF0ZV9yZXNldF9jYXA=", "keyType": "AVMString", "valueType": "AVMUint64"}, "rate_reset_next": {"key": "cmF0ZV9yZXNldF9uZXh0", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_floor": {"key": "aGFzX3JhdGVfcmVzZXRfZmxvb3I=", "keyType": "AVMString", "valueType": "AVMUint64"}, "has_rate_reset_cap": {"key": "aGFzX3JhdGVfcmVzZXRfY2Fw", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_principal": {"key": "cmVzZXJ2ZWRfcHJpbmNpcGFs", "keyType": "AVMString", "valueType": "AVMUint64"}, "reserved_interest": {"key": "cmVzZXJ2ZWRfaW50ZXJlc3Q=", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_interest_index": {"key": "Y3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "cumulative_principal_index": {"key": "Y3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXg=", "keyType": "AVMString", "valueType": "AVMUint64"}, "event_cursor": {"key": "ZXZlbnRfY3Vyc29y", "keyType": "AVMString", "valueType": "AVMUint64"}, "schedule_entry_count": {"key": "c2NoZWR1bGVfZW50cnlfY291bnQ=", "keyType": "AVMString", "valueType": "AVMUint64"}, "fixed_point_scale": {"key": "Zml4ZWRfcG9pbnRfc2NhbGU=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj"}, "primary_dealer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj"}, "trustee": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj"}, "authority": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj"}, "observer": {"keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj"}, "schedule_page": {"keyType": "uint64", "valueType": "(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[]", "prefix": "UyM="}, "account": {"keyType": "address", "valueType": "AccountPosition", "prefix": "QSM="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 10, "ints": 54}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountPosition": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "reserved_units", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "settled_cursor", "type": "uint64"}, {"name": "interest_checkpoint", "type": "uint64"}, {"name": "principal_checkpoint", "type": "uint64"}, {"name": "claimable_interest", "type": "uint64"}, {"name": "claimable_principal", "type": "uint64"}], "CashClaimResult": [{"name": "interest_amount", "type": "uint64"}, {"name": "principal_amount", "type": "uint64"}, {"name": "total_amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CashFundingResult": [{"name": "funded_interest", "type": "uint64"}, {"name": "funded_principal", "type": "uint64"}, {"name": "total_funded", "type": "uint64"}, {"name": "processed_events", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}], "ExecutionScheduleEntry": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "InitialKernelState": [{"name": "status_date", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}], "KernelState": [{"name": "contract_type", "type": "uint8"}, {"name": "status", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "reserved_units_total", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "event_cursor", "type": "uint64"}, {"name": "schedule_entry_count", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "interest_calculation_base", "type": "uint64"}, {"name": "nominal_interest_rate", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "cumulative_interest_index", "type": "uint64"}, {"name": "cumulative_principal_index", "type": "uint64"}, {"name": "reserved_interest", "type": "uint64"}, {"name": "reserved_principal", "type": "uint64"}], "NormalizedActusTerms": [{"name": "contract_type", "type": "uint8"}, {"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "total_units", "type": "uint64"}, {"name": "notional_principal", "type": "uint64"}, {"name": "initial_exchange_amount", "type": "uint64"}, {"name": "initial_exchange_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "rate_reset_spread", "type": "uint64"}, {"name": "rate_reset_multiplier", "type": "uint64"}, {"name": "rate_reset_floor", "type": "uint64"}, {"name": "rate_reset_cap", "type": "uint64"}, {"name": "rate_reset_next", "type": "uint64"}, {"name": "has_rate_reset_floor", "type": "bool"}, {"name": "has_rate_reset_cap", "type": "bool"}, {"name": "dynamic_principal_redemption", "type": "bool"}, {"name": "fixed_point_scale", "type": "uint64"}], "ObservedCashEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "ObservedEventRequest": [{"name": "event_id", "type": "uint64"}, {"name": "event_type", "type": "uint8"}, {"name": "scheduled_time", "type": "uint64"}, {"name": "accrual_factor", "type": "uint64"}, {"name": "redemption_accrual_factor", "type": "uint64"}, {"name": "observed_rate", "type": "uint64"}, {"name": "next_nominal_interest_rate", "type": "uint64"}, {"name": "next_principal_redemption", "type": "uint64"}, {"name": "next_outstanding_principal", "type": "uint64"}, {"name": "flags", "type": "uint64"}], "Prospectus": [{"name": "hash", "type": "byte[32]"}, {"name": "url", "type": "string"}], "RoleValidity": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}]}, "byteCode": {"approval": "DCAFAAEIINwLJjEEFR98dQZzdGF0dXMMZXZlbnRfY3Vyc29yFHNjaGVkdWxlX2VudHJ5X2NvdW50FW91dHN0YW5kaW5nX3ByaW5jaXBhbBFmaXhlZF9wb2ludF9zY2FsZRBhY2NydWVkX2ludGVyZXN0GWludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UCQSMVbm9taW5hbF9pbnRlcmVzdF9yYXRlDWNvbnRyYWN0X3R5cGUUcmVzZXJ2ZWRfdW5pdHNfdG90YWwScmVzZXJ2ZWRfcHJpbmNpcGFsC3RvdGFsX3VuaXRzGW5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24RcmVzZXJ2ZWRfaW50ZXJlc3QZY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleBpjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAZSOkFSUiMTc2V0dGxlbWVudF9hc3NldF9pZBdpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAZSOkFVVCMGUjpQWUQjBlI6TU5HIwJTIwZSOk1PQyMGUjpUUlMjBlI6T1BEIxVpbml0aWFsX2V4Y2hhbmdlX2RhdGUVdHJhbnNmZXJfb3BlbmluZ19kYXRlFXRyYW5zZmVyX2Nsb3N1cmVfZGF0ZRByYXRlX3Jlc2V0X2Zsb29yDnJhdGVfcmVzZXRfY2FwEmNvbnRyYWN0X3N1c3BlbmRlZAlkZWZhdWx0ZWQcZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbhFyYXRlX3Jlc2V0X3NwcmVhZBVyYXRlX3Jlc2V0X211bHRpcGxpZXIPcmF0ZV9yZXNldF9uZXh0FGhhc19yYXRlX3Jlc2V0X2Zsb29yEmhhc19yYXRlX3Jlc2V0X2NhcAEAD3Byb3NwZWN0dXNfaGFzaA5wcm9zcGVjdHVzX3VybBVkZW5vbWluYXRpb25fYXNzZXRfaWQNbWF0dXJpdHlfZGF0ZRRkYXlfY291bnRfY29udmVudGlvbgMGgQECAAAxGEAArScSMgNnJxsyA2cnISJnJyIiZykiZycKImcnKoAAZycrgABnJywiZycTImcnHCJnJy0iZycdImcnHiJnJy4iZycNImcnCyJnJxQiZycEImcnDiJnJyMiZycHImcnBiJnJwkiZyckImcnJSJnJx8iZycgImcnJiJnJyciZycoImcnDCJnJw8iZycQImcnESJnKiJnKyJnJwUiZzE1gQoSRDE0gTYSRDE3FEQxNhREgASRTwTrNhoAjgEAzjEZFEQxGEEAt4IZBLRGGMgE54MlKQSUOIcjBGyF4+4EvdGpRAR8DxgSBBT8EO8EdKcpfwQJ1P4UBJqb+oUEhe7TPQSrLA/EBNnyJawEmINQWgSOpudMBAKvVXoEgvcbLQTvBPXTBN80NVAEPb6AvQQePkjnBDkkH6MEAQyCmQR0BqzSBBpyou42GgCOGQBWAyEEfQSnBTEGIQZbBrMG5gcUCQgKHwqYDAQM9g2JDc4N5g3+DrMPSQ9oD4cPkg/cAIAElW1xVjYaAI4BBvEAMRmBBBIxGBBEQg2uigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScvsh4nL7Ifi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74kigABHDTYaAUkVJBJEFyIpZUREiBW9iBXEiBXJIillRIEyEhREiBIgQQALSYFkCyEECCKI/48iRQUiRQ4iRQ1LBEsBDEECWSIqZUQiK2VEDEECTSIqZUSIEPJJRRGBCVtJRQMyBw1AAjdLDyRVSUUQJBJJRQRAABBLDoEDEkAACEsOgRMSQQI/I0ECFEsPIlsiKmVEEkRLATIHDkRLAkAB7UsOgRMSQAHlIkULSw8kVUlFEIEDEkABZUsOgRMSQAFdIkUGSw+BMVtFCIgRekAA/ksHRQlLCogQOEsGiBAzSwGIEE1JTgJFD0mIEERJRQtLAksBCElFCTIKIicTZURwAEQiJw9lRCInDGVESwEISwJLAQ9ETwJMCU8CD0RPAwgnD0xnIicMZUQIJwxMZyInEGVETwIIJxBMZyInEWVECCcRTGdLDyRVgQMSQQB6IicGZURLEIgRBkUSCCcGTGeIEOZBAApLDyRVgRMSQQAJSw+BKVsnDkxnJwRLCGcnB0sJZyIqZUQjCCpMZ0sPVwgBgAETqEEAESInBGVEQAAJKYHIAWcnByJnSw9LBEmIE3NISw1LDAhFDksMSwcIRQ1LBCMIRQVC/ncnBiJnQv+QSw8kVUlFEIEDEkEAECInBGVESwYJSUUJRQlC/ulLDiQSQQATIicEZUxFCUQiJwdlTEUKREL+z0sOgRMSQAAHSwdFCUL+wCJFCCJFCUL+t4gQJ0EAVksOgRMSQQAKIicEZURFBkL+jiInBmVESxCIEB5FEghJRQsiJw5lRA9BAAYiRQZC/m8iJw5lREsKCUlFCCInBGVEDUEACiInBGVERQZC/lFLBkUGQv5KSw+BMVsiJwRlREoOREwJRQZC/jYiJwZlREsQiA/GRRIIRQtC/gxLBElESw5JSw9JTgMIMgdPAhZPAxZQTwIWUE8CFlBMFlAoTFCwI0MiQv2+gABHAjYaAUcCFSUSRDYaAkkiWYECCEsBFRJEVwIATCIpZUREJwhMUEm9RQFEIicbZUQyAxNBACIxACInG2VEEkAAFTEASwMSQAANMQBLAb5EVwAgEkEBACNEiBK1iBK6IillRIEyEhRESwJJiA1qiAztRgJJvkRJgUlbSU4CRQhJgVFbSUUITwIISUUGRFcAICInE2VEcABFAUEAt0m+RIGAA1NAAK0jQQB4MgoiJxNlRExLAXAAREsFSU4CD0RLAklOA75ESVcAILEyAE8DshJMshRPArIRgQSyELIBs0mBSVtJTgJFCUmBUVtJTgNFCSIWTEsBXElMXFFPA0y/IicPZURJSwIPRCInDGVESwMPREwJJw9MZyInDGVETAknDExnSwVJSwZJTgMIMgdPAhZPAxZQTwIWUEwWUEsCSRUWVwYCTFBMgAIAIlBMUChMULAjQyJC/1AiQv79NhoBSRUkEkQXNhoCSRUkEkQXiBGXSgxEJx1PAmcnHkxnMgcWKExQsCNDNhoBSRUlEkQ2GgJJFSQSRBdJTgIiKWVERCcWMQCIES5EiBFoiBFtIillRIEyEkQnCEsCUElOA71FAURMiAuJSUQiJwtlRAgiJw1lRA5EIiccZURBAAkyByInHGVEDkRHAr5EgShbSwNJTgMIFoEoTLsiJwtlRAgnC0sBZyInDWVETAkWKExQsCNDIkk2GgFJFSUSRDYaAkkVJRJENhoDRwIVJBJEFyIpZUREiBDeiBDjIillRIEyEhREIicdZURBAAkiJx1lRDIHDkQiJx5lREEACTIHIiceZUQMRDEASwRJTgISRCcISwFQSUUISb1FAUQnCEsFSU4CUElFCb1FAURLAogKwkmICr5PAhNESwFJREy+RCVbDkQiKmVEIitlRA9AAA4iKmVEiAvPgQlbMgcNREsDSYgLGksDSU4CiAsSiAqVRgKICpBGAksFSb5EJVtLAklOAksBDkRLAQkWTwIlTwK7SwVJvkQlW08CCBYlTLsoSwJQsCNDNhoBSRUlEkQ2GgJJFSMSRCJTJxUxAIgPu0QnCE8CUEm9RQFESYEwI7oiTwNUgTBMuzIHFihMULAjQzYaAUkVJRJENhoCSRUlEkQnFzEAiA+DRCIpZUSByAESFESID7OID7gnCE8CUEm9RQEURCIWTwJLAVBLAVAnKVBLAVBLAVBLAVBLAVBMUL8yBxYoTFCwI0M2GgFJFSUSRDYaAkkVJRJEJwhLAlBJvUUBRDEATwMSRIgPXYgPYiJPArsyBxYoTFCwI0M2GgFJFSUSRCcITFBJvUUBRL5IKExQsCNDNhoBSRUlEkQnEkxnMgcWKExQsCNDgABJNhoBRwIVgWsSRDYaAklOAhWBSBJENhoDSU4CSRVLASVZSYEiEkRPAkxLAlJJTgMiWYEkCBJEiA7ZIlVJJwpLAWdBACJJIxJAABxJgQISQAAVSYEDEkAADkmBBBJAAAdJgQUSQQGHI0QiJwplTEUCREsESYEhW0lFCESBOVVJRQhBAB9LBiMSQAAYSwaBAhJAABBLBoEDEkAACEsGgQQSQQFHI0RJIxNBAAhLBIGSBlMURCIpZUQURCInFGVEFERLBEkjW0lxC0UBRCcsSwFnSwGBCVtJTwISRCcTSwFnsTIAMgoishKyFEyyEYEEshCyAbNJgRFbJw1MZycLImcnLksIZ0mBKVsnHEsBZ0sBgTFbJy1LAWdLBklOAoEwWycOTGcnFEsKZ0sDgZIGUycjTGdLAYEQWycETGdLAYEoWycGTGdLASVbJwlMZ0sBgRhbJwdMZ0sDgTpbJyRMZ0sDgUJbJyVMZ0sDgUpbJx9MZ0sDgVJbJyBMZ0sDgVpbJyZMZ0sDgZAGUycnTGdLA4GRBlMnKExnTwOBY1snBUxnSwEkWypMZ0sBgThbJxBMZ0sBgUBbJxFMZycPImcnDCJnSwIyBw1ETCJbSwIMRAxESwJXACAnKkxnSwFXAgAnK0xnMgcWKExQsCNDIkL+tiJC/nYigABHAjYaAUkVJBJEF0k2GgJJFSMSRCJTTDYaA0lOAkkiWUlOA0mBQQuBAghPAhUSRIgM7CInCmVMTgNEIillRBRESYEQDkQiJxRlRERMgRALTIFkCyEECCKI9rYiSUsEDEEAi0sEVwIASUUMSwFJTgKBQQuBQVhJJFVJTgJFDUkiW0lFDUsFTwQISwESREsFTwOICDhMgQlbSUUKREEAF0lBACVJIwmBQQtLC0yBQViBCVtLCA5ESwhAAAVLCSMSREkjCEUBQv+USwZJRCMJFicYTFBJvUUBREkigQK6F0lEIwmBQQuBAgiBQbpC/8FLBhYnGExQSbxISwW/SwVBAAxLAUsECCtMZymBMmcyBxYoTFCwI0MiKWVERIgMAogMCYgMDiIqZUQiK2VESwENRIgHZklXCAFJgAEBqERLAVcACEsCVwkISwNXEQhLBFcZCEsFVyEISwZXKQhLB1cxCEsIVzkITwdPCFBPB1BPBlBPBVAiFlBPBFBPA1BPAlBMUIgImEYCMgcWKExQsCNDIkcEgABJNhoBSRUkEkQXNhoCRwIVgUkSRCIpZUREiAt6iAt/gUFbSYEEGkEAsCInCmVEgQUSRIgLVyInCmVESYEFEkRLAkkiW0lFByIrZUQSRElXCAFFDCRViAbhIitlRIEQCicwRQcWJxhMUElFCb1FAUEAB0sHvkxFB0RLBUkiWUmBEAxESwNJVwkISwFXEQhLAlcZCEsDVykISwRXMQhPBVc5CEsLFksSUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLCEm8SEy/IitlRCMIK0xnIiplREsDSU8CEkSIBh5JRQhJVwgBRQokVUlFBiMSQAAoSwSBBBJAACBLBIEMEkAAGEsEgQsSQAAQSwSBEhJAAAhLBIEFEkEAQSNESwiAAQGpREsEgQwSQAAISwSBCxJBACQjQQAaJxkxAIgKEkRLBksCiAc6RgIyBxYoTFCwI0OICjBC/+giQv/ZIkL/vCJJNhoBRwIVgUESRCIpZUREiAoRiAoYiAodIillRIEyEhREIicKZUSBBRJESSJbSU4CIitlRExLARJESwFXCAFJTgOAAQOoREyBOVtJTgIjGkRBABMiK2VEIwmIBUCBCVtLBIEJWw5EIitlRIEQCicwRQYWJxhMUElFB71FAUEAB0sFvkxFBkRLBEkiWUmBEAxESwVJVwkISwFXEQhLAlcZCEsDVyEISwRXKQhPBVcxCEsKFksKUE8GUE8FUE8EUE8DUE8CUExQSwMWUE8CTFBMIwgWVwYCXABLBkm8SEy/IitlRCMIK0xnMgcWKExQsCNDIillRElEIicKZUQWSZMkDkRXBwEiJw1lRCInC2VEIicUZUQiKmVEIitlRCInBGVEIicHZUQiJwllRCInBmVEIicQZUQiJxFlRCInD2VEIicMZURPDhZPDkxQTw0WUE8MFlBPCxZQTwoWUE8JFlBPCBZQTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQKExQsCNDIillREQiKmVEIitlRA9BACUiKmVEFicpUCIWTEsBUEsBUEsBUEsBUEsBUEsBUExQKExQsCNDIiplRIgD3EL/8IgIXSNDNhoBSRUlEkSICFAnEkxnMgcWKExQsCNDNhoBSRUlEkSICDgnG0xnMgcWKExQsCNDNhoBSRUjEkQ2GgJJTgIVJRJENhoDSU4CFYEQEkSICAuICBIXRwKICByBFBJBAA4nEksDZzIHFihMULAjQ0mBKBJBABEnF0sDUEm9RQEUREsCv0L/30mBMhJBABEnFksDUEm9RQEUREsCv0L/x0mBPBJBABEnGksDUEm9RQEUREsCv0L/r0mBRhJBABEnFUsDUEm9RQEUREsCv0L/l0mBUBJB/5AnGUsDUEm9RQEUREsCv0L/fzYaAUkVIxJENhoCSU4CFSUSRIgHYYgHaBdHAogHckmBFBNEgSgSQQAVJxdLAlBJvUUBRLxIMgcWKExQsCNDSYEyEkEADycWSwJQSb1FAUS8SEL/4UmBPBJBAA8nGksCUEm9RQFEvEhC/8tJgUYSQQAPJxVLAlBJvUUBRLxIQv+1SYFQEkH/ricZSwJQSb1FAUS8SEL/nzYaAUkVIxJEIlMnFTEAiAabRCchTGcyBxYoTFCwI0M2GgFJFSMSRCJTJxoxAIgGfEQnIkxnMgcWKExQsCNDIicSZUQoTFCwI0M2GgFJFSUSRCcXSwGIBlQnFksCiAZNJxpLA4gGRicVSwSIBj8nGU8FiAY4JykiTwZUI08FVIECTwRUgQNPA1SBBE8CVChMULAjQzYaAUkVIxJENhoCSU4CFSUSRBdJiAZQgwYUKDI8RlBPBo4GAE8AQAAxACIAEwABACcZSwFQSb1FAUS+SChMULAjQycVSwFQSb1FAUS+SEL/6ycaSwFQSb1FAUS+SEL/3CcWSwFQSb1FAUS+SEL/zScXSwFQSb1FAUS+SEL/voAQAAAAAAAAAAAAAAAAAAAAAEL/qYoBACcIi/9QvkSBgANTFESJigECJwiL/1BJvUUBREm+SCInEGVESwGBOVsJIicRZURLAoFBWwlLAiVbIicFZURPA0sCTwKIAJgiJwVlRE8DTwNPAogAiksCgUlbSwIIFk8DTFxJSYFRW0sCCBZcUSInEGVEFlw5IicRZUQWXEEiKmVEFlwxTwNMv4mKAQAigAAnCIv/UEm9RQFEIillRIEyEkEAAYmLAr5MSU4CjABEgShbSYwBQAABiYsASSVbiwFJTgMIFlwgIhZcKIsCTL8iJwtlRElLAg9ETAknC0xniYoDAYv9QQAFi/5AAAIiiYv9i/4di/+XiYoBAYv/QAACIokiJw1lRElEIicFZUSL/0xPAoj/yomKAQGL/0AAAiKJIicNZUQiJwVlRIv/TIj/r4mKAQEiK2VEi/8NRIv/gRAKFicYTFBJvUUBRIv/gRAYSwEigQK6F0sBDUSBQQuBAgiBQbqJigIAi/8jEkAAH4v/JBJAABiL/4ETEkAAEIv/gQwSQAAIi/+BCxJBAAMjRImL/kAABCJC//WL/oEDEkAACIv+gQISQQAYi/+BAxJAAAiL/4ESEkEABCNC/9EiQv/Ni/4jEkEAIIv/gQMSQAAQi/+BEhJAAAiL/4EFEkEABCNC/6oiQv+mi/6BBBJBACiL/4EDEkAAGIv/gQQSQAAQi/+BEhJAAAiL/4EFEkEABCNC/3oiQv92i/6BBRJBAAiL/4EDEkL/ZiJC/2IiJwplRCMSQQAKIicjZURBAAIjiSKJigECi/+BEVtJQQAQIicJZURBAAgiJwdlREAABiKL/08CiSInB2VEIicJZUQiJwVlRIj+aCInBWVEiwBMiP5di/9PAomKAgGL/0AAA4v+iSInBWVEIicJZUSL/0sCiP48CElEIicFZUSL/kxPAoj+LImKAgIigABHCIv+IlsiKmVEEkSL/oEJWzIHDkSL/iRVSSMSSUEAXiIpZUSBMhJEIicLZUQiJw1lRBJEi/6BMVsnBEsBZycHTGeL/oEhWycJTGcnBiJni/6BKVsnDkxnIiplRCMIKkxnKYFkZ4sLRCInFGVEi/5MIogB2kmM/ov/jAGMAIkiKWVEgTISFEQiJwZlRIv+iP74jP4IJwZMZ4sKgQwSQQF4i/+BIVsiJyVlRCInBWVEiP1zIickZUQIjAYiJydlREEAEyInH2VEiwYNQQAIIicfZUyMBkQiJyhlREEAEyInIGVEiwYMQQAIIicgZUyMBkQnCYsGZ4sKgQQSQQEHi/6BMVsnBEsBZycHTGeI/mVBAOeLCoEFEkEAxSIrZUQiKmVECYFkCyEECCKI68QiJwVlTIwCRCKMASKMB4v+gRlbSYwIQQAPiwKLCIj+gUmMAiOMB4wBIiplRCMIjAMiK2VEiwMNQQBSiwOI/QxJjAAkVUmMBIEDEkAAEIsEgRMSQQAziwCBGVtBACsjQQAIiwdBAAwijAeLAyMIjANC/76LAIEZW4sCTIj+JEmMAosBCIwBQv/hIkL/0osBRCInBGVEi/6BOVskGkAABiInBmVECCInBWVEiwGI/EsnDkxnIiplRCMIKkxni/4iSYgAYEmM/ov/jAGMAImL/oEpWycOTGdC/9qLCoESEkH+/yInBGVEJwdMZ0L+84sKgQsSQQAbi/6BIVtJjAVAAAgiJyZlTIwFRCcJiwVnQv66i/6BIVtJjAlB/q8nCYsJZ0L+p4oDATIIi/0iW4v9VwgBi/1XCQgyB4v9JFWL/kAARSMWSZMkDkRXBwEiJxNlRIsBSSMIiwAWTwIWUIsCUIsDUIsEFlCL/hZQTwNQi/8WUE8CFlBMFlCABJozK5VMULCL/YwAiYsFIxJAAAiLBYEEEkEABCNC/6mB/wFC/6OKAgGAAIv+i/9QSb1FAUEAH4sBvkQiWzIHSYwADkEAEIsBvkQkW4sAD0EABCOMAIkiQv/5MQAiJxJlRBJEiSInImVEFESJIichZUQURImKAQCL/4EUEkAAMIv/gRkSQAAoi/+BKBJAACCL/4EyEkAAGIv/gTwSQAAQi/+BRhJAAAiL/4FQEkEAAyNEiSJC//o=", "clear": "DIEBQw=="}, "desc": "Debt Algorand Standard Application.", "events": [{"args": [{"type": "uint64", "name": "contract_id"}, {"type": "uint64", "name": "event_id"}, {"type": "uint8", "name": "event_type"}, {"type": "uint64", "name": "scheduled_time"}, {"type": "uint64", "name": "applied_at"}, {"type": "uint64", "name": "payoff"}, {"type": "uint8", "name": "payoff_sign"}, {"type": "uint64", "name": "settled_amount"}, {"type": "uint64", "name": "currency_id"}, {"type": "uint64", "name": "sequence"}], "name": "ExecutionEvent", "desc": "Non-normative receipt for on-chain execution of a scheduled ACTUS event."}], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMiAxNTAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgInN0YXR1cyIgImV2ZW50X2N1cnNvciIgInNjaGVkdWxlX2VudHJ5X2NvdW50IiAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIiAiZml4ZWRfcG9pbnRfc2NhbGUiICJhY2NydWVkX2ludGVyZXN0IiAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIgMHg0MTIzICJub21pbmFsX2ludGVyZXN0X3JhdGUiICJjb250cmFjdF90eXBlIiAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiICJyZXNlcnZlZF9wcmluY2lwYWwiICJ0b3RhbF91bml0cyIgIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iICJyZXNlcnZlZF9pbnRlcmVzdCIgImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIgMHg1MjNhNDE1MjUyMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIgMHg1MjNhNDE1NTU0MjMgMHg1MjNhNTA1OTQ0MjMgMHg1MjNhNGQ0ZTQ3MjMgMHg1MzIzIDB4NTIzYTRkNGY0MzIzIDB4NTIzYTU0NTI1MzIzIDB4NTIzYTRmNTA0NDIzICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiICJ0cmFuc2Zlcl9jbG9zdXJlX2RhdGUiICJyYXRlX3Jlc2V0X2Zsb29yIiAicmF0ZV9yZXNldF9jYXAiICJjb250cmFjdF9zdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIiAicmF0ZV9yZXNldF9zcHJlYWQiICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiICJyYXRlX3Jlc2V0X25leHQiICJoYXNfcmF0ZV9yZXNldF9mbG9vciIgImhhc19yYXRlX3Jlc2V0X2NhcCIgMHgwMCAicHJvc3BlY3R1c19oYXNoIiAicHJvc3BlY3R1c191cmwiICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtYXR1cml0eV9kYXRlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iIDB4MDY4MTAxIDB4MDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTggLy8gMHg1MjNhNDE1MjUyMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMAogICAgLy8gc2VsZi5vcF9kYWVtb24gPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX09QX0RBRU1PTikKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NDctNDgKICAgIC8vICMgQ29udHJhY3QgR292ZXJuYW5jZQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBGYWxzZQogICAgYnl0ZWMgMzMgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyAzNCAvLyAiZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1Ni01NwogICAgLy8gIyBDb250cmFjdAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKQogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OAogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MC02MQogICAgLy8gIyBQcm9zcGVjdHVzIChJbmZvcm1hdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyA0MiAvLyAicHJvc3BlY3R1c19oYXNoIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIKICAgIC8vIHNlbGYucHJvc3BlY3R1c191cmwgPSBTdHJpbmcoKQogICAgYnl0ZWMgNDMgLy8gInByb3NwZWN0dXNfdXJsIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjQtNjUKICAgIC8vICMgRGVub21pbmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IEFzc2V0KCkKICAgIGJ5dGVjIDQ0IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBBc3NldCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgtNjkKICAgIC8vICMgVGltZQogICAgLy8gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MQogICAgLy8gc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgPSB0eXAuVGltZVN0YW1wKCkKICAgIGJ5dGVjIDI5IC8vICJ0cmFuc2Zlcl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyCiAgICAvLyBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSA9IHR5cC5UaW1lU3RhbXAoKQogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzQtNzUKICAgIC8vICMgRGF5IENvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgNDYgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3Ny03OAogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5CiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODEtODIKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODMKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUKICAgIC8vIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiA9IEZhbHNlCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODctODgKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxLTkyCiAgICAvLyAjIEludGVyZXN0IFJhdGVzCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gVUludDY0KCkKICAgIGJ5dGVjIDM2IC8vICJyYXRlX3Jlc2V0X3NwcmVhZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9tdWx0aXBsaWVyID0gVUludDY0KCkKICAgIGJ5dGVjIDM3IC8vICJyYXRlX3Jlc2V0X211bHRpcGxpZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgPSBVSW50NjQoKQogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gVUludDY0KCkKICAgIGJ5dGVjIDMyIC8vICJyYXRlX3Jlc2V0X2NhcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTcKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9uZXh0ID0gVUludDY0KCkKICAgIGJ5dGVjIDM4IC8vICJyYXRlX3Jlc2V0X25leHQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4CiAgICAvLyBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yID0gRmFsc2UKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTkKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gRmFsc2UKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMS0xMDIKICAgIC8vICMgUHJpbWFyeSBEaXN0cmlidXRpb24KICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNS0xMDYKICAgIC8vICMgQ3VtdWxhdGl2ZSBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBVSW50NjQoKQogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwNwogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNQogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgPSBVSW50NjQoKQogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExOC0xMTkKICAgIC8vICMgU2NhbGluZwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDEwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDU0CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZF9hc2EvY29udHJhY3QucHk6MjUKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weToyNgogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTE0ZjA0ZWIgLy8gbWV0aG9kICJjb250cmFjdF91cGRhdGUoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NvbnRyYWN0X3VwZGF0ZV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9kX2FzYS9jb250cmFjdC5weTo4LTE4CiAgICAvLyBjbGFzcyBEQVNBKAogICAgLy8gICAgIFBheW1lbnRBZ2VudCwKICAgIC8vICAgICBUcmFuc2ZlckFnZW50LAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gICAgIGF2bV92ZXJzaW9uPTEyLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzMKICAgIHB1c2hieXRlc3MgMHhiNDQ2MThjOCAweGU3ODMyNTI5IDB4OTQzODg3MjMgMHg2Yzg1ZTNlZSAweGJkZDFhOTQ0IDB4N2MwZjE4MTIgMHgxNGZjMTBlZiAweDc0YTcyOTdmIDB4MDlkNGZlMTQgMHg5YTliZmE4NSAweDg1ZWVkMzNkIDB4YWIyYzBmYzQgMHhkOWYyMjVhYyAweDk4ODM1MDVhIDB4OGVhNmU3NGMgMHgwMmFmNTU3YSAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgImZ1bmRfZHVlX2Nhc2hmbG93cyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJjbGFpbV9kdWVfY2FzaGZsb3dzKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAidHJhbnNmZXJfc2V0X3NjaGVkdWxlKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAiYWNjb3VudF9vcGVuKGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFjY291bnRfdXBkYXRlX3BheW1lbnRfYWRkcmVzcyhhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJhY2NvdW50X2dldF9wb3NpdGlvbihhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiY29udHJhY3RfY29uZmlnKCh1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wsYm9vbCx1aW50NjQpLCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksKGJ5dGVbMzJdLHN0cmluZykpdWludDY0IiwgbWV0aG9kICJjb250cmFjdF9zY2hlZHVsZSh1aW50NjQsYm9vbCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNvbnRyYWN0X2V4ZWN1dGVfaWVkKCl1aW50NjQiLCBtZXRob2QgImFwcGx5X25vbl9jYXNoX2V2ZW50KHVpbnQ2NCwodWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnQoKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAiY29udHJhY3RfZ2V0X3N0YXRlKCkodWludDgsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudCgpKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJyYmFjX3JvdGF0ZV9hcnJhbmdlcihhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19zZXRfb3BfZGFlbW9uKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2Fzc2lnbl9yb2xlKHVpbnQ4LGFkZHJlc3MsKHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19yZXZva2Vfcm9sZSh1aW50OCxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19jb250cmFjdF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X2RlZmF1bHQoYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfZ2V0X2FycmFuZ2VyKClhZGRyZXNzIiwgbWV0aG9kICJyYmFjX2dldF9hZGRyZXNzX3JvbGVzKGFkZHJlc3MpKGJvb2wsYm9vbCxib29sLGJvb2wsYm9vbCkiLCBtZXRob2QgInJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkodWludDgsYWRkcmVzcykodWludDY0LHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBmdW5kX2R1ZV9jYXNoZmxvd3MgY2xhaW1fZHVlX2Nhc2hmbG93cyB0cmFuc2Zlcl9zZXRfc2NoZWR1bGUgcHJpbWFyeV9kaXN0cmlidXRpb24gdHJhbnNmZXIgYWNjb3VudF9zdXNwZW5zaW9uIGFjY291bnRfb3BlbiBhY2NvdW50X3VwZGF0ZV9wYXltZW50X2FkZHJlc3MgYWNjb3VudF9nZXRfcG9zaXRpb24gY29udHJhY3RfY29uZmlnIGNvbnRyYWN0X3NjaGVkdWxlIGNvbnRyYWN0X2V4ZWN1dGVfaWVkIGFwcGx5X25vbl9jYXNoX2V2ZW50IGFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50IGNvbnRyYWN0X2dldF9zdGF0ZSBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnQgcmJhY19yb3RhdGVfYXJyYW5nZXIgcmJhY19zZXRfb3BfZGFlbW9uIHJiYWNfYXNzaWduX3JvbGUgcmJhY19yZXZva2Vfcm9sZSByYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24gcmJhY19jb250cmFjdF9kZWZhdWx0IHJiYWNfZ2V0X2FycmFuZ2VyIHJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMgcmJhY19nZXRfcm9sZV92YWxpZGl0eQogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2RfYXNhL2NvbnRyYWN0LnB5OjgtMTgKICAgIC8vIGNsYXNzIERBU0EoCiAgICAvLyAgICAgUGF5bWVudEFnZW50LAogICAgLy8gICAgIFRyYW5zZmVyQWdlbnQsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYXZtX3ZlcnNpb249MTIsCiAgICAvLyApOgogICAgcHVzaGJ5dGVzIDB4OTU2ZDcxNTYgLy8gbWV0aG9kICJjb250cmFjdF9jcmVhdGUoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjb250cmFjdF9jcmVhdGUKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDQ3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgNDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnBheW1lbnRfYWdlbnQuUGF5bWVudEFnZW50LmZ1bmRfZHVlX2Nhc2hmbG93c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmZ1bmRfZHVlX2Nhc2hmbG93czoKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMTMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjY4CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo2OQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzIKICAgIC8vIGlmIHNlbGYuX2lzX2R5bmFtaWNfYW5udWl0eSgpOgogICAgY2FsbHN1YiBfaXNfZHluYW1pY19hbm51aXR5CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzYtNzcKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NwogICAgLy8gKiBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19QRVJfRVZFTlRfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3Ni03NwogICAgLy8gKyBtYXhfZXZlbnRfY291bnQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgICoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo3NQogICAgLy8gVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICBpbnRjIDQgLy8gMTUwMAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojc1LTc3CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0ZVTkRfRFVFX0NBU0hGTE9XU19CQVNFX0JVREdFVCkKICAgIC8vICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfRlVORF9EVUVfQ0FTSEZMT1dTX1BFUl9FVkVOVF9CVURHRVQpCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6NzMtNzkKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfQkFTRV9CVURHRVQpCiAgICAvLyAgICAgICAgICsgbWF4X2V2ZW50X2NvdW50CiAgICAvLyAgICAgICAgICogVUludDY0KGNzdC5PUF9VUF9GVU5EX0RVRV9DQVNIRkxPV1NfUEVSX0VWRU5UX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4MQogICAgLy8gcHJvY2Vzc2VkX2V2ZW50cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjgyCiAgICAvLyBmdW5kZWRfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODMKICAgIC8vIGZ1bmRlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgpmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIGRpZyA0CiAgICBkaWcgMQogICAgPAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg2LTg3CiAgICAvLyBwcm9jZXNzZWRfZXZlbnRzIDwgbWF4X2V2ZW50X2NvdW50CiAgICAvLyBhbmQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo4NwogICAgLy8gYW5kIHNlbGYuZXZlbnRfY3Vyc29yIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA8CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6ODYtODcKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgPCBtYXhfZXZlbnRfY291bnQKICAgIC8vIGFuZCBzZWxmLmV2ZW50X2N1cnNvciA8IHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl93aGlsZUAxMQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5Ojg5CiAgICAvLyBlbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeShzZWxmLmV2ZW50X2N1cnNvcikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5MAogICAgLy8gaWYgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcDoKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTEKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MC0zNTQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX01EKSwKICAgIC8vICkKICAgID09CiAgICBkdXAKICAgIGJ1cnkgNAogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTIKICAgIGRpZyAxNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUyCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzUwLTM1NAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfTUQpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDUyCiAgICBkaWcgMTQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM1MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNTAtMzU0CiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9NRCksCiAgICAvLyApCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VANTMKCmZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX3RydWVANTI6CiAgICBpbnRjXzEgLy8gMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2Jvb2xfbWVyZ2VANTQ6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTIKICAgIC8vIGlmIG5vdCBzZWxmLl9ldmVudF9pc19jYXNoKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkpOgogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX3doaWxlQDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDgKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF9pZCA9PSBzZWxmLmV2ZW50X2N1cnNvciwgZXJyLklOVkFMSURfRVZFTlRfQ1VSU09SCiAgICBkaWcgMTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgY3Vyc29yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NDkKICAgIC8vIGFzc2VydCBlbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDEKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDEzCiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9JUCksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIGRpZyAyCiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTUKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDE0CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X2ludGVyZXN0X2Ftb3VudEAxNjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQyNgogICAgLy8gZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGRpZyAxNQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI3CiAgICAvLyBpZiBldmVudF90eXBlIG5vdCBpbiAoVUludDY0KGVudW1zLkVWVF9QUiksIFVJbnQ2NChlbnVtcy5FVlRfTUQpKToKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgZGlnIDE0CiAgICBwdXNoaW50IDE5CiAgICA9PQogICAgYm56IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MjgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50QDI4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUzCiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBkaWcgMTUKICAgIHB1c2hpbnQgNDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1NgogICAgLy8gaWYgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCk6CiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUAyOQogICAgZGlnIDcKICAgIGJ1cnkgOQoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzItNTc0CiAgICAvLyAjIEZ1bmRpbmcgdXNlcyBwZXItdW5pdCBjdW11bGF0aXZlIGluZGljZXMgc28gZWFjaCBob2xkZXIgY2FuIHNldHRsZQogICAgLy8gIyBpbmRlcGVuZGVudGx5IGZyb20gaXRzIGN1cnJlbnQgdW5pdCBiYWxhbmNlLgogICAgLy8gaW50ZXJlc3RfaW5kZXhfZGVsdGEgPSBzZWxmLl9hbW91bnRfdG9faW5kZXhfZGVsdGEoaW50ZXJlc3RfYW1vdW50X2R1ZSkKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfYW1vdW50X3RvX2luZGV4X2RlbHRhCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzUKICAgIC8vIHByaW5jaXBhbF9pbmRleF9kZWx0YSA9IHNlbGYuX2Ftb3VudF90b19pbmRleF9kZWx0YShwcmluY2lwYWxfYW1vdW50X2R1ZSkKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9hbW91bnRfdG9faW5kZXhfZGVsdGEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3NgogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5faW5kZXhfZGVsdGFfdG9fYW1vdW50KGludGVyZXN0X2luZGV4X2RlbHRhKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2luZGV4X2RlbHRhX3RvX2Ftb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NzcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLl9pbmRleF9kZWx0YV90b19hbW91bnQocHJpbmNpcGFsX2luZGV4X2RlbHRhKQogICAgZHVwCiAgICBjYWxsc3ViIF9pbmRleF9kZWx0YV90b19hbW91bnQKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTc4CiAgICAvLyByZXF1aXJlZF9hbW91bnQgPSBpbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMgogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MzQKICAgIC8vIGJhbGFuY2UgPSBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NTYKICAgIC8vIHJldHVybiBzZWxmLnJlc2VydmVkX2ludGVyZXN0ICsgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM2CiAgICAvLyBhc3NlcnQgYmFsYW5jZSA+PSByZXNlcnZlZF90b3RhbCwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzM3CiAgICAvLyByZXR1cm4gYmFsYW5jZSAtIHJlc2VydmVkX3RvdGFsCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MAogICAgLy8gc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU3OS01ODEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5fYXZhaWxhYmxlX3NldHRsZW1lbnRfZnVuZHMoKSA+PSByZXF1aXJlZF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4MwogICAgLy8gc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCArPSBpbnRlcmVzdF9hbW91bnQKICAgIHVuY292ZXIgMwogICAgKwogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NAogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgKz0gcHJpbmNpcGFsX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgKwogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1ODUKICAgIC8vIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCArPSBpbnRlcmVzdF9pbmRleF9kZWx0YQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU4NgogICAgLy8gc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCArPSBwcmluY2lwYWxfaW5kZXhfZGVsdGEKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICArCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg3CiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgZGlnIDE1CiAgICBpbnRjXzIgLy8gOAogICAgZ2V0Ynl0ZQogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTg4LTU4OQogICAgLy8gIyBGb3IgUFIsIHRoZSBwZXJpb2QgaW50ZXJlc3Qgc3RheXMgYWNjcnVlZCB1bnRpbCBhIGxhdGVyIElQIG9yIE1ELgogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTkyCiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICBjYWxsc3ViIF9pc19keW5hbWljX2FubnVpdHkKICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDQzCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTItNTk0CiAgICAvLyBpZiBub3Qgc2VsZi5faXNfZHluYW1pY19hbm51aXR5KCkgb3IgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApOgogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDQ0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfaWZfYm9keUA0MzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5NQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gZW50cnkubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDE1CiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTQgLy8gIm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VANDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTYKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTk3CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBuZXh0X2ludGVyZXN0X2Jhc2UKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBkaWcgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU5OAogICAgLy8gc2VsZi5ldmVudF9jdXJzb3IgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAwCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOCAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MDAtNjAyCiAgICAvLyBpZiBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoCiAgICAvLyAgICAgZW51bXMuRVZUX01ECiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBwdXNoYnl0ZXMgMHgxMwogICAgYj09CiAgICBieiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAyCiAgICAvLyApIGFuZCBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCA9PSBVSW50NjQoMCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwMC02MDIKICAgIC8vIGlmIGVudHJ5LmV2ZW50X3R5cGUgPT0gYXJjNC5VSW50OCgKICAgIC8vICAgICBlbnVtcy5FVlRfTUQKICAgIC8vICkgYW5kIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID09IFVJbnQ2NCgwKToKICAgIGJueiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjAzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChlbnVtcy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDIwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYwNi02MTAKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1pbnRlcmVzdF9hbW91bnQgKyBwcmluY2lwYWxfYW1vdW50LAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PWludGVyZXN0X2Ftb3VudCArIHByaW5jaXBhbF9hbW91bnQsCiAgICAvLyApCiAgICBkaWcgMTUKICAgIGRpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgX2VtaXRfZXhlY3V0aW9uX2V2ZW50CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NgogICAgLy8gZnVuZGVkX2ludGVyZXN0ICs9IGludGVyZXN0X2Ftb3VudAogICAgZGlnIDEzCiAgICBkaWcgMTIKICAgICsKICAgIGJ1cnkgMTQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo5NwogICAgLy8gZnVuZGVkX3ByaW5jaXBhbCArPSBwcmluY2lwYWxfYW1vdW50CiAgICBkaWcgMTIKICAgIGRpZyA3CiAgICArCiAgICBidXJ5IDEzCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6OTgKICAgIC8vIHByb2Nlc3NlZF9ldmVudHMgKz0gVUludDY0KDEpCiAgICBkaWcgNAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3Nfd2hpbGVfdG9wQDQKCmZ1bmRfZHVlX2Nhc2hmbG93c19lbHNlX2JvZHlANDA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1OTEKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUA0MQoKZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMjk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTcKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBkaWcgMTUKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1OC01NjAKICAgIC8vICMgRHluYW1pYyBhbm51aXRpZXMgZGVyaXZlIG5leHQgc3RhdGUgZnJvbSB0aGUgcGF5bWVudCBkZWNvbXBvc2l0aW9uLAogICAgLy8gIyBub3Qgb25seSBmcm9tIHRoZSBwcmVjb21wdXRlZCBgbmV4dF8qYCBmaWVsZHMuCiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpOgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTYyCiAgICAvLyBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIHByaW5jaXBhbF9hbW91bnRfZHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgYnVyeSA5CiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMxOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY1CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUCk6CiAgICBkaWcgMTQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2Vsc2VfYm9keUAzMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY2CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY3CiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgMTAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM4CgpmdW5kX2R1ZV9jYXNoZmxvd3NfZWxzZV9ib2R5QDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY4CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCk6CiAgICBkaWcgMTQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICBibnogZnVuZF9kdWVfY2FzaGZsb3dzX2lmX2JvZHlAMzQKICAgIGRpZyA3CiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19pZl9ib2R5QDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTY5CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTcwCiAgICAvLyBuZXh0X2ludGVyZXN0X2Jhc2UgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMzgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDI5CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMAogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKToKICAgIGRpZyAxNAogICAgcHVzaGludCAxOQogICAgPT0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzEKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzIKICAgIC8vIGludGVyZXN0X2R1ZSA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdCArIHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZGlnIDE2CiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBidXJ5IDE4CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQzMwogICAgLy8gaWYgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIDw9IGludGVyZXN0X2R1ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgPj0KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzQKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gLSBpbnRlcmVzdF9kdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgZGlnIDEwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM2CiAgICAvLyBpZiBwcmluY2lwYWxfYW1vdW50ID4gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWw6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCBleGlzdHMKICAgID4KICAgIGJ6IGZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MzcKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICBkaWcgNgogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1NTIKICAgIC8vIHByaW5jaXBhbF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudChlbnRyeSkKICAgIGIgZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VudHJ5X3ByaW5jaXBhbF9hbW91bnRAMjgKCmZ1bmRfZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDQwCiAgICAvLyBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDE1CiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBkdXAyCiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDM5LTQ0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCA8PSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NDIKICAgIC8vIHJldHVybiBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCAtIGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjU1MgogICAgLy8gcHJpbmNpcGFsX2Ftb3VudF9kdWUgPSBzZWxmLl9lbnRyeV9wcmluY2lwYWxfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfcHJpbmNpcGFsX2Ftb3VudEAyOAoKZnVuZF9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MTUKICAgIC8vIHJldHVybiBzZWxmLmFjY3J1ZWRfaW50ZXJlc3QgKyBzZWxmLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIGRpZyAxNgogICAgY2FsbHN1YiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudAogICAgYnVyeSAxOAogICAgKwogICAgYnVyeSAxMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTUxCiAgICAvLyBpbnRlcmVzdF9hbW91bnRfZHVlID0gc2VsZi5fZW50cnlfaW50ZXJlc3RfYW1vdW50KGVudHJ5KQogICAgYiBmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZW50cnlfaW50ZXJlc3RfYW1vdW50QDE2CgpmdW5kX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAwCiAgICAvLyBhc3NlcnQgcHJvY2Vzc2VkX2V2ZW50cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX0RVRV9DQVNIRkxPVwogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjYXNoZmxvdyB0byBwYXkKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxMDQKICAgIC8vIHRvdGFsX2Z1bmRlZD1mdW5kZWRfaW50ZXJlc3QgKyBmdW5kZWRfcHJpbmNpcGFsLAogICAgZGlnIDE0CiAgICBkdXAKICAgIGRpZyAxNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTAxLTEwNwogICAgLy8gcmV0dXJuIHR5cC5DYXNoRnVuZGluZ1Jlc3VsdCgKICAgIC8vICAgICBmdW5kZWRfaW50ZXJlc3Q9ZnVuZGVkX2ludGVyZXN0LAogICAgLy8gICAgIGZ1bmRlZF9wcmluY2lwYWw9ZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICB0b3RhbF9mdW5kZWQ9ZnVuZGVkX2ludGVyZXN0ICsgZnVuZGVkX3ByaW5jaXBhbCwKICAgIC8vICAgICBwcm9jZXNzZWRfZXZlbnRzPXByb2Nlc3NlZF9ldmVudHMsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmdW5kX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUA1MzoKICAgIGludGNfMCAvLyAwCiAgICBiIGZ1bmRfZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDU0CgoKLy8gbW9kdWxlcy5wYXltZW50X2FnZW50LlBheW1lbnRBZ2VudC5jbGFpbV9kdWVfY2FzaGZsb3dzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZHVlX2Nhc2hmbG93czoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNQogICAgLy8gaWYgc2VsZi5vcF9kYWVtb24udmFsdWUgIT0gR2xvYmFsLnplcm9fYWRkcmVzczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAweDUyM2E0ZjUwNDQyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wX2RhZW1vbiBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjcgLy8gMHg1MjNhNGY1MDQ0MjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcF9kYWVtb24gZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE3LTE5CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MKICAgIGJueiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfdHJ1ZUAxNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE4CiAgICAvLyBvciBUeG4uc2VuZGVyID09IGhvbGRpbmdfYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgID09CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTctMTkKICAgIC8vIFR4bi5zZW5kZXIgPT0gc2VsZi5vcF9kYWVtb24udmFsdWUKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gaG9sZGluZ19hZGRyZXNzCiAgICAvLyBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTkKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgPT0KICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNy0xOQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLm9wX2RhZW1vbi52YWx1ZQogICAgLy8gb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzCiAgICBieiBjbGFpbV9kdWVfY2FzaGZsb3dzX2Jvb2xfZmFsc2VAMTUKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF90cnVlQDE0OgogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAxNjoKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNi0yMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYub3BfZGFlbW9uLnZhbHVlCiAgICAvLyAgICAgb3IgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MKICAgIC8vICAgICBvciBUeG4uc2VuZGVyID09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcwogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCgpjbGFpbV9kdWVfY2FzaGZsb3dzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjE0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QRU5ESU5HX0lFRAogICAgIQogICAgYXNzZXJ0IC8vIElFRCBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQzCiAgICAvLyBzZWxmLl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkKGhvbGRpbmdfYWRkcmVzcykKICAgIGRpZyAyCiAgICBkdXAKICAgIGNhbGxzdWIgX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNDQKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihob2xkaW5nX2FkZHJlc3MpCiAgICBjYWxsc3ViIF9zZXR0bGVfcG9zaXRpb24KICAgIHBvcG4gMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY2xhaW1hYmxlX2ludGVyZXN0CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExOAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjExNy0xMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNsYWltYWJsZV9pbnRlcmVzdAogICAgLy8gKyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5jbGFpbWFibGVfcHJpbmNpcGFsCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTQ2CiAgICAvLyBhc3NlcnQgdG90YWxfYW1vdW50ID4gVUludDY0KDApLCBlcnIuTk9fRFVFX0NBU0hGTE9XCiAgICBhc3NlcnQgLy8gTm8gZHVlIGNhc2hmbG93IHRvIHBheQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MuaXNfb3B0ZWRfaW4oCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNgogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToyNS0yOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLmlzX29wdGVkX2luKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZAogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQKICAgIGJ6IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjI4CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgYm56IGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNAogICAgaW50Y18xIC8vIDEKCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNToKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTEKICAgIC8vIGlmIHNlbGYuX2lzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNAogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTozNC0zNQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjMzLTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTMKICAgIC8vIHNlbGYuX3BheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHRvdGFsX2Ftb3VudCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQ0CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weTo0MAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gbW9kdWxlcy9wYXltZW50X2FnZW50LnB5OjQwLTQ1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjUtMTI2CiAgICAvLyAjIEdldCB0aGUgY2xhaW1hYmxlIGFtb3VudHMgYmVmb3JlIHJlc2V0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QKICAgIGR1cAogICAgcHVzaGludCA3MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA5CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTI3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgZHVwCiAgICBwdXNoaW50IDgxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMjktMTMwCiAgICAvLyAjIFJlc2V0IHRoZSBwb3NpdGlvbidzIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyBwb3NpdGlvbi5jbGFpbWFibGVfaW50ZXJlc3QgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzEKICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDgxCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTMyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTM0CiAgICAvLyBhc3NlcnQgc2VsZi5yZXNlcnZlZF9pbnRlcmVzdCA+PSBpbnRlcmVzdF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNQogICAgLy8gYXNzZXJ0IHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsID49IHByaW5jaXBhbF9hbW91bnQsIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlc2VydmVkX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgZXhpc3RzCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEzNy0xMzgKICAgIC8vICMgVXBkYXRlIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgaW50ZXJlc3QgYW5kIHByaW5jaXBhbCBhbW91bnRzCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0IC09IGludGVyZXN0X2Ftb3VudAogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMzkKICAgIC8vIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIC09IHByaW5jaXBhbF9hbW91bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVzZXJ2ZWRfcHJpbmNpcGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3ByaW5jaXBhbCBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xhaW1fZHVlX2Nhc2hmbG93c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTU5CiAgICAvLyB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNjAKICAgIC8vIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvcGF5bWVudF9hZ2VudC5weToxNTYtMTYyCiAgICAvLyByZXR1cm4gdHlwLkNhc2hDbGFpbVJlc3VsdCgKICAgIC8vICAgICBpbnRlcmVzdF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50LAogICAgLy8gICAgIHByaW5jaXBhbF9hbW91bnQ9cHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0b3RhbF9hbW91bnQ9aW50ZXJlc3RfYW1vdW50ICsgcHJpbmNpcGFsX2Ftb3VudCwKICAgIC8vICAgICB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8sCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL3BheW1lbnRfYWdlbnQucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9mYWxzZUAyNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGNsYWltX2R1ZV9jYXNoZmxvd3NfYm9vbF9tZXJnZUAyNQoKY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2xhaW1fZHVlX2Nhc2hmbG93c19ib29sX21lcmdlQDE2CgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnRyYW5zZmVyX3NldF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyX3NldF9zY2hlZHVsZToKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo0MAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQxCiAgICAvLyBhc3NlcnQgb3Blbl9kYXRlIDwgY2xvc3VyZV9kYXRlLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQzCiAgICAvLyBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA9IG9wZW5fZGF0ZQogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDQKICAgIC8vIHNlbGYudHJhbnNmZXJfY2xvc3VyZV9kYXRlID0gY2xvc3VyZV9kYXRlCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy50cmFuc2Zlcl9hZ2VudC5UcmFuc2ZlckFnZW50LnByaW1hcnlfZGlzdHJpYnV0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjczCiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIyIC8vIDB4NTIzYTUwNTk0NDIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo3NwogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojc4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3RhdHVzX2lzX3BlbmRpbmdfaWVkKCksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3MpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjgxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiBVSW50NjQoMCksIGVyci5aRVJPX1VOSVRTCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo4MwogICAgLy8gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODItODQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCArIHVuaXRzIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODUKICAgIC8vIGlmIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5Ojg3CiAgICAvLyBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI4IC8vICJpbml0aWFsX2V4Y2hhbmdlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9kYXRlIGV4aXN0cwogICAgPD0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6ODYtODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPD0gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNDgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnJlc2VydmVkX3VuaXRzICs9IHVuaXRzCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgaXRvYgogICAgcHVzaGludCA0MAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTEKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgZXhpc3RzCiAgICArCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5yZXNlcnZlZF91bml0c190b3RhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMudHJhbnNmZXJfYWdlbnQuVHJhbnNmZXJBZ2VudC50cmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyYW5zZmVyOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTMwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzEKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX1BFTkRJTkdfSUVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQ3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX3N0YXR1c19pc19wZW5kaW5nX2llZCgpLCBlcnIuUEVORElOR19JRUQKICAgICEKICAgIGFzc2VydCAvLyBJRUQgbm90IHlldCBleGVjdXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTUKICAgIC8vIHNlbGYudHJhbnNmZXJfb3BlbmluZ19kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjkgLy8gInRyYW5zZmVyX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNC0xNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnRyYW5zZmVyX29wZW5pbmdfZGF0ZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNwogICAgLy8gaWYgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzAgLy8gInRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBieiB0cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTkKICAgIC8vIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi50cmFuc2Zlcl9jbG9zdXJlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMCAvLyAidHJhbnNmZXJfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIDwKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTgtMjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLnRyYW5zZmVyX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLkNMT1NFRF9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIGlzIGNsb3NlZAoKdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxMzUKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA4CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjIDggLy8gMHg0MTIzCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjEzOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfYWNjb3VudF9zdXNwZW5kZWQKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTM5CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcykKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDAKICAgIC8vIGFzc2VydCBzZW5kZXJfaG9sZGluZ19hZGRyZXNzICE9IHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcywgZXJyLlNFTEZfVFJBTlNGRVIKICAgIHVuY292ZXIgMgogICAgIT0KICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0MQogICAgLy8gYXNzZXJ0IHVuaXRzID4gVUludDY0KDApLCBlcnIuTlVMTF9UUkFOU0ZFUgogICAgZGlnIDEKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIHVuaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzYzCiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYm56IHRyYW5zZmVyX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ub19kdWVfZXZlbnRfcGVuZGluZ0AxMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzY1CiAgICAvLyBuZXh0X2VudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc2NwogICAgLy8gbmV4dF9lbnRyeS5zY2hlZHVsZWRfdGltZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBwdXNoaW50IDkKICAgIGV4dHJhY3RfdWludDY0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NjYtNzY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG5leHRfZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLlBFTkRJTkdfQUNUVVNfRVZFTlQKICAgIGFzc2VydCAvLyBBQ1RVUyBldmVudCBub3QgeWV0IGV4ZWN1dGVkCgp0cmFuc2Zlcl9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9hc3NlcnRfbm9fZHVlX2V2ZW50X3BlbmRpbmdAMTA6CiAgICAvLyBtb2R1bGVzL3RyYW5zZmVyX2FnZW50LnB5OjE0NQogICAgLy8gc2VsZi5fZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDYKICAgIC8vIHNlbGYuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZAogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weToxNDcKICAgIC8vIHNlbGYuX3NldHRsZV9wb3NpdGlvbihzZW5kZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvdHJhbnNmZXJfYWdlbnQucHk6MTQ4CiAgICAvLyBzZWxmLl9zZXR0bGVfcG9zaXRpb24ocmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzKQogICAgY2FsbHN1YiBfc2V0dGxlX3Bvc2l0aW9uCiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNTIKICAgIC8vIGFzc2VydCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cywgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGRpZyA1CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTUzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyAtPSB1bml0cwogICAgZGlnIDEKICAgIC0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTQ0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyArPSB1bml0cwogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgaW50Y18zIC8vIDMyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy90cmFuc2Zlcl9hZ2VudC5weTo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfc3VzcGVuc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQ4CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4NgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5hY2NvdW50X29wZW5bcm91dGluZ10oKSAtPiB2b2lkOgphY2NvdW50X29wZW46CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzAKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmFjY291bnRfbWFuYWdlciwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzkKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0VOREVEKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDIwMAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5fc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTIKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjEzCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozNAogICAgLy8gdW5pdHM9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTozMi00MgogICAgLy8gcmV0dXJuIHR5cC5BY2NvdW50UG9zaXRpb24oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1VSW50NjQoMCksCiAgICAvLyAgICAgcmVzZXJ2ZWRfdW5pdHM9VUludDY0KDApLAogICAgLy8gICAgIHN1c3BlbmRlZD1GYWxzZSwKICAgIC8vICAgICBzZXR0bGVkX2N1cnNvcj1VSW50NjQoMCksCiAgICAvLyAgICAgaW50ZXJlc3RfY2hlY2twb2ludD1VSW50NjQoMCksCiAgICAvLyAgICAgcHJpbmNpcGFsX2NoZWNrcG9pbnQ9VUludDY0KDApLAogICAgLy8gICAgIGNsYWltYWJsZV9pbnRlcmVzdD1VSW50NjQoMCksCiAgICAvLyAgICAgY2xhaW1hYmxlX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGJ5dGVjIDQxIC8vIDB4MDAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHNlbGYuX25ld19hY2NvdW50X3Bvc2l0aW9uKHBheW1lbnRfYWRkcmVzcykKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF91cGRhdGVfcGF5bWVudF9hZGRyZXNzOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjM4CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBob2xkaW5nX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjIzOQogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNDAKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MgPSBwYXltZW50X2FkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQyCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWNjb3VudGluZy5BY2NvdW50aW5nTW9kdWxlLmFjY291bnRfZ2V0X3Bvc2l0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9nZXRfcG9zaXRpb246CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNTkKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9jcmVhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAzMwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfY29uZmlnOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTA3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk5vcm1hbGl6ZWRBY3R1c1Rlcm1zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA3MgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Jbml0aWFsS2VybmVsU3RhdGUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMzQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDhbMzJdLChsZW4rdXRmOFtdKSkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMzYKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy5hYmlfdHlwZXMuUHJvc3BlY3R1cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA2NgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDY4LTEwNjkKICAgIC8vICMgQ29uZmlndXJlIENvbnRyYWN0CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPSB0ZXJtcy5jb250cmFjdF90eXBlLmFzX3VpbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUA3CiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIyMAogICAgLy8gVUludDY0KGVudW1zLkNUX0FOTiksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIxCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTkFNKSwKICAgIHB1c2hpbnQgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIyCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFNKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjIzCiAgICAvLyBVSW50NjQoZW51bXMuQ1RfTEFYKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDcKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI0CiAgICAvLyBVSW50NjQoZW51bXMuQ1RfQ0xNKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjE4LTIyNQogICAgLy8gcmV0dXJuIGNvbnRyYWN0X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9QQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9BTk4pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9OQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQU0pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9MQVgpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5DVF9DTE0pLAogICAgLy8gKQogICAgPT0KICAgIGJ6IGNvbnRyYWN0X2NvbmZpZ19ib29sX2ZhbHNlQDgKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVANzoKICAgIGludGNfMSAvLyAxCgpjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUA5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjI5CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2NvbnRyYWN0X3R5cGUoY29udHJhY3RfdHlwZSksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3MQogICAgLy8gc2VsZi5fc3RvcmVfY29udHJhY3RfY29uZmlnKHNlbGYuY29udHJhY3RfdHlwZSwgdGVybXMsIGluaXRpYWxfc3RhdGUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzI1CiAgICAvLyBhc3NlcnQgdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMjcKICAgIC8vIHRlcm1zLmRheV9jb3VudF9jb252ZW50aW9uLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDU3CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICBieiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk5CiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5Ny0zMDMKICAgIC8vIHJldHVybiBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzYwKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwSVNEQSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjApLAogICAgLy8gKQogICAgPT0KICAgIGJueiBjb250cmFjdF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBkaWcgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzAwCiAgICAvLyBVSW50NjQoZW51bXMuRENDX0EzNjUpLAogICAgcHVzaGludCAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyOTctMzAzCiAgICAvLyByZXR1cm4gZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQUEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2MCksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ19BMzY1KSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MElTREEpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIC8vICkKICAgID09CiAgICBibnogY29udHJhY3RfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZGlnIDYKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMwMQogICAgLy8gVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYm56IGNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGRpZyA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDIKICAgIC8vIFVJbnQ2NChlbnVtcy5EQ0NfMzBFMzYwKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjk3LTMwMwogICAgLy8gcmV0dXJuIGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0FBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDX0EzNjApLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5EQ0NfQTM2NSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkRDQ18zMEUzNjBJU0RBKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRENDXzMwRTM2MCksCiAgICAvLyApCiAgICA9PQogICAgYnogY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmNvbnRyYWN0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKY29udHJhY3RfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMDktMzExCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfc3VwcG9ydGVkX2RheV9jb3VudF9jb252ZW50aW9uKAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMyOQogICAgLy8gaWYgY29udHJhY3RfdHlwZSAhPSBVSW50NjQoZW51bXMuQ1RfQU5OKToKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICE9CiAgICBieiBjb250cmFjdF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzMwCiAgICAvLyBhc3NlcnQgbm90IHRlcm1zLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24sIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZGlnIDQKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA3CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODA4CiAgICAvLyBhc3NlcnQgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCA9PSBVSW50NjQoMCksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbF9leGNoYW5nZV9hbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTAtODExCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuX2Fzc2VydF9kZW5vbWluYXRpb25fYXNzZXQodGVybXMuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzUtNzc2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gX2NyZWF0b3IsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NzcKICAgIC8vIGFzc2VydCBleGlzdHMsIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODAKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA0NCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MTQtODE1CiAgICAvLyAjIFNldCBTZXR0bGVtZW50IEFzc2V0CiAgICAvLyBzZWxmLl9hc3NlcnRfc2V0dGxlbWVudF9hc3NldCh0ZXJtcy5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgZGlnIDEKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc4NQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3ODMtNzg2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzg5CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Nzk1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkzCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc5NAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzkwLTc5MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3OTAtNzk2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODE4LTgxOQogICAgLy8gIyBVbml0cwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHRlcm1zLnRvdGFsX3VuaXRzCiAgICBkdXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODIwCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID0gVUludDY0KDApCiAgICBieXRlYyAxMSAvLyAicmVzZXJ2ZWRfdW5pdHNfdG90YWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgyMi04MjMKICAgIC8vICMgRGF5LUNvdW50IENvbnZlbnRpb25zCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gdGVybXMuZGF5X2NvdW50X2NvbnZlbnRpb24uYXNfdWludDY0KCkKICAgIGJ5dGVjIDQ2IC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGRpZyA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI1LTgyNgogICAgLy8gIyBUaW1lCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA9IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZQogICAgZHVwCiAgICBwdXNoaW50IDQxCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMjggLy8gImluaXRpYWxfZXhjaGFuZ2VfZGF0ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODI3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0ZXJtcy5tYXR1cml0eV9kYXRlCiAgICBkaWcgMQogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQ1IC8vICJtYXR1cml0eV9kYXRlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4MjgKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IGluaXRpYWxfc3RhdGUubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMC04MzEKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50ID0gdGVybXMuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMgogICAgLy8gc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gdGVybXMuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg2CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM1IC8vICJkeW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjgzMwogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBpbml0aWFsX3N0YXRlLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM1LTgzNgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ID0gaW5pdGlhbF9zdGF0ZS5hY2NydWVkX2ludGVyZXN0CiAgICBkaWcgMQogICAgcHVzaGludCA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODM4LTgzOQogICAgLy8gIyBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IGluaXRpYWxfc3RhdGUubm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MAogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlID0gaW5pdGlhbF9zdGF0ZS5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlCiAgICBkaWcgMQogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQxCiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkID0gdGVybXMucmF0ZV9yZXNldF9zcHJlYWQKICAgIGRpZyAzCiAgICBwdXNoaW50IDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0MgogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIgPSB0ZXJtcy5yYXRlX3Jlc2V0X211bHRpcGxpZXIKICAgIGRpZyAzCiAgICBwdXNoaW50IDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzcgLy8gInJhdGVfcmVzZXRfbXVsdGlwbGllciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDMKICAgIC8vIHNlbGYucmF0ZV9yZXNldF9mbG9vciA9IHRlcm1zLnJhdGVfcmVzZXRfZmxvb3IKICAgIGRpZyAzCiAgICBwdXNoaW50IDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzEgLy8gInJhdGVfcmVzZXRfZmxvb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODQ0CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfY2FwID0gdGVybXMucmF0ZV9yZXNldF9jYXAKICAgIGRpZyAzCiAgICBwdXNoaW50IDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzIgLy8gInJhdGVfcmVzZXRfY2FwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg0NQogICAgLy8gc2VsZi5yYXRlX3Jlc2V0X25leHQgPSB0ZXJtcy5yYXRlX3Jlc2V0X25leHQKICAgIGRpZyAzCiAgICBwdXNoaW50IDkwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDYKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgPSB0ZXJtcy5oYXNfcmF0ZV9yZXNldF9mbG9vcgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzg0CiAgICBnZXRiaXQKICAgIGJ5dGVjIDM5IC8vICJoYXNfcmF0ZV9yZXNldF9mbG9vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDcKICAgIC8vIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwID0gdGVybXMuaGFzX3JhdGVfcmVzZXRfY2FwCiAgICBkaWcgMwogICAgcHVzaGludCA3ODUKICAgIGdldGJpdAogICAgYnl0ZWMgNDAgLy8gImhhc19yYXRlX3Jlc2V0X2NhcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NDktODUwCiAgICAvLyAjIFNjYWxpbmcKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgPSB0ZXJtcy5maXhlZF9wb2ludF9zY2FsZQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDk5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODUyLTg1MwogICAgLy8gIyBTY2hlZHVsZSBQcm9jZXNzaW5nCiAgICAvLyBzZWxmLmV2ZW50X2N1cnNvciA9IGluaXRpYWxfc3RhdGUuZXZlbnRfY3Vyc29yCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU1LTg1NgogICAgLy8gIyBQZXItVW5pdCBGaXhlZC1Qb2ludCBJbmRleGVzCiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggPSBpbml0aWFsX3N0YXRlLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgKICAgIGRpZyAxCiAgICBwdXNoaW50IDU2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4ID0gaW5pdGlhbF9zdGF0ZS5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODU5LTg2MAogICAgLy8gIyBSZXNlcnZlZCBBbW91bnQgKGZvciBleGVjdXRlZCBjYXNoZmxvd3MpCiAgICAvLyBzZWxmLnJlc2VydmVkX2ludGVyZXN0ID0gVUludDY0KDApCiAgICBieXRlYyAxNSAvLyAicmVzZXJ2ZWRfaW50ZXJlc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MQogICAgLy8gc2VsZi5yZXNlcnZlZF9wcmluY2lwYWwgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2MwogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCBlcnIuSU5WQUxJRF9JRUQKICAgIGRpZyAyCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+CiAgICBhc3NlcnQgLy8gSUVEIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg2NAogICAgLy8gYXNzZXJ0IHRlcm1zLmluaXRpYWxfZXhjaGFuZ2VfZGF0ZSA+IGluaXRpYWxfc3RhdGUuc3RhdHVzX2RhdGUsIGVyci5JTlZBTElEX0lFRAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgPAogICAgYXNzZXJ0IC8vIElFRCBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4NjUKICAgIC8vIGFzc2VydCB0ZXJtcy5pbml0aWFsX2V4Y2hhbmdlX2RhdGUgPCB0ZXJtcy5tYXR1cml0eV9kYXRlLCBlcnIuSU5WQUxJRF9JRUQKICAgIDwKICAgIGFzc2VydCAvLyBJRUQgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3My0xMDc0CiAgICAvLyAjIE5vdGFyaXplIHByb3NwZWN0dXMgKG9wdGlvbmFsKQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX2hhc2ggPSBwcm9zcGVjdHVzLmhhc2guYnl0ZXMKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMzIKICAgIGJ5dGVjIDQyIC8vICJwcm9zcGVjdHVzX2hhc2giCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTA3NQogICAgLy8gc2VsZi5wcm9zcGVjdHVzX3VybCA9IHByb3NwZWN0dXMudXJsCiAgICBkaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDQzIC8vICJwcm9zcGVjdHVzX3VybCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc2CiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjb250cmFjdF9jb25maWdfYm9vbF9tZXJnZUAxOAoKY29udHJhY3RfY29uZmlnX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGNvbnRyYWN0X2NvbmZpZ19ib29sX21lcmdlQDkKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9zY2hlZHVsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3NjaGVkdWxlOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk+CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTEwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExMTMKICAgIC8vIGNvbnRyYWN0X3R5cGU9c2VsZi5jb250cmFjdF90eXBlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODEKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4ODItODg0CiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZS5sZW5ndGggPD0gVUludDY0KAogICAgLy8gICAgIGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUKICAgIC8vICksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg4NQogICAgLy8gYXNzZXJ0IHNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQgPiBVSW50NjQoMCksIGVyci5URVJNU19OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSB0ZXJtcyBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg3CiAgICAvLyBwYWdlX2N1cnNvciA9IHNjaGVkdWxlX3BhZ2VfaW5kZXggKiBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYKICAgICoKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5NAogICAgLy8gKyBwYWdlX2xlbmd0aCAqIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX1BFUl9FTlRSWV9CVURHRVQpCiAgICBwdXNoaW50IDEwMAogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODkzCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIGludGMgNCAvLyAxNTAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTMtODk0CiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19CQVNFX0JVREdFVCkKICAgIC8vICsgcGFnZV9sZW5ndGggKiBVSW50NjQoY3N0Lk9QX1VQX0NPTlRSQUNUX0NPTkZJR19QRVJfRU5UUllfQlVER0VUKQogICAgKwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODg5LTg5NgogICAgLy8gIyBWYWxpZGF0aW9uIGNvc3QgZ3Jvd3Mgd2l0aCBwYWdlIGxlbmd0aCwgc28gY29uZmlndXJhdGlvbiBleHBsaWNpdGx5CiAgICAvLyAjIGJ1eXMgZXh0cmEgb3Bjb2RlIGJ1ZGdldCBmb3IgbGFyZ2VyIHVwbG9hZHMuCiAgICAvLyBlbnN1cmVfYnVkZ2V0KAogICAgLy8gICAgIHJlcXVpcmVkX2J1ZGdldD0oCiAgICAvLyAgICAgICAgIFVJbnQ2NChjc3QuT1BfVVBfQ09OVFJBQ1RfQ09ORklHX0JBU0VfQlVER0VUKQogICAgLy8gICAgICAgICArIHBhZ2VfbGVuZ3RoICogVUludDY0KGNzdC5PUF9VUF9DT05UUkFDVF9DT05GSUdfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk3CiAgICAvLyBpbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKCmNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6ODk4CiAgICAvLyB3aGlsZSBpbmRleCA8IHBhZ2VfbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojg5OS05MDAKICAgIC8vIGVudHJ5ID0gc2NoZWR1bGVfcGFnZVtpbmRleF0uY29weSgpCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNjUKICAgICoKICAgIHB1c2hpbnQgNjUKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTAwCiAgICAvLyBlbnRyeV9ldmVudF90eXBlID0gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo4OTktOTAwCiAgICAvLyBlbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXhdLmNvcHkoKQogICAgLy8gZW50cnlfZXZlbnRfdHlwZSA9IGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIGludGNfMiAvLyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDAKICAgIC8vIGVudHJ5X2V2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkwMQogICAgLy8gYXNzZXJ0IGVudHJ5LmV2ZW50X2lkID09IHBhZ2VfY3Vyc29yICsgaW5kZXgsIGVyci5JTlZBTElEX0VWRU5UX0lECiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgdW5jb3ZlciA0CiAgICArCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDItOTA0CiAgICAvLyBzZWxmLl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBlbnRyeV9ldmVudF90eXBlCiAgICAvLyApCiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA1CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgc3dhcAogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDYKICAgIC8vIGlmIGVudHJ5LmV2ZW50X2lkID4gVUludDY0KDApOgogICAgYnogY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MDcKICAgIC8vIGlmIGluZGV4ID4gVUludDY0KDApOgogICAgZHVwCiAgICBieiBjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTA4CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNjaGVkdWxlX3BhZ2VbaW5kZXggLSBVSW50NjQoMSldLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgcHVzaGludCA2NQogICAgKgogICAgZGlnIDExCiAgICBzd2FwCiAgICBwdXNoaW50IDY1CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyMwogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gZW50cnkuc2NoZWR1bGVkX3RpbWUKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA4CiAgICA8PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTIyLTkyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmV2aW91c19lbnRyeS5zY2hlZHVsZWRfdGltZSA8PSBlbnRyeS5zY2hlZHVsZWRfdGltZQogICAgLy8gKSwgZXJyLklOVkFMSURfU09SVElORwogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgoKY29udHJhY3Rfc2NoZWR1bGVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTI1CiAgICAvLyBpZiBlbnRyeS5ldmVudF9pZCA9PSBVSW50NjQoMCk6CiAgICBkaWcgOAogICAgYm56IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkyNi05MjgKICAgIC8vIGFzc2VydCBlbnRyeV9ldmVudF90eXBlID09IFVJbnQ2NCgKICAgIC8vICAgICBlbnVtcy5FVlRfSUVECiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGRpZyA5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjkKICAgIC8vIGluZGV4ICs9IFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNvbnRyYWN0X3NjaGVkdWxlX3doaWxlX3RvcEAyCgpjb250cmFjdF9zY2hlZHVsZV9lbHNlX2JvZHlANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkxMC05MTIKICAgIC8vICMgVGhlIGZpcnN0IGVudHJ5IG9mIGEgcGFnZSBtdXN0IHN0aWxsIGJlIG9yZGVyZWQgYWZ0ZXIgdGhlCiAgICAvLyAjIGxhc3QgZW50cnkgb2YgdGhlIHByZXZpb3VzIHBhZ2UuCiAgICAvLyBhc3NlcnQgc2NoZWR1bGVfcGFnZV9pbmRleCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGlkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTMKICAgIC8vIHByZXZpb3VzX3BhZ2VfaW5kZXggPSBzY2hlZHVsZV9wYWdlX2luZGV4IC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE1CiAgICAvLyBwcmV2aW91c19wYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTQtOTE2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX3BhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTctOTE4CiAgICAvLyBwcmV2aW91c19wYWdlID0gc2VsZi5zY2hlZHVsZV9wYWdlW3ByZXZpb3VzX3BhZ2VfaW5kZXhdLmNvcHkoKQogICAgLy8gYXNzZXJ0IHByZXZpb3VzX3BhZ2UubGVuZ3RoID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9TQ0hFRFVMRV9QQUdFCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MTgKICAgIC8vIGFzc2VydCBwcmV2aW91c19wYWdlLmxlbmd0aCA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MjAKICAgIC8vIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTE5LTkyMQogICAgLy8gcHJldmlvdXNfZW50cnkgPSBwcmV2aW91c19wYWdlWwogICAgLy8gICAgIHByZXZpb3VzX3BhZ2UubGVuZ3RoIC0gVUludDY0KDEpCiAgICAvLyBdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgYiBjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDcKCmNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX3doaWxlQDExOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjAwCiAgICAvLyBzZWxmLnNjaGVkdWxlX3BhZ2VbcGFnZV9pbmRleF0gPSBzY2hlZHVsZV9wYWdlLmNvcHkoKQogICAgZGlnIDYKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDUKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMgogICAgLy8gaWYgaXNfbGFzdF9wYWdlOgogICAgZGlnIDUKICAgIGJ6IGNvbnRyYWN0X3NjaGVkdWxlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzNAogICAgLy8gc2NoZWR1bGVfcGFnZV9pbmRleCAqIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSArIHBhZ2VfbGVuZ3RoCiAgICBkaWcgMQogICAgZGlnIDQKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjkzMwogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTMzLTkzNQogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCA9ICgKICAgIC8vICAgICBzY2hlZHVsZV9wYWdlX2luZGV4ICogVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpICsgcGFnZV9sZW5ndGgKICAgIC8vICkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5MzYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgNTAKICAgIGFwcF9nbG9iYWxfcHV0Cgpjb250cmFjdF9zY2hlZHVsZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTExOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9leGVjdXRlX2llZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2V4ZWN1dGVfaWVkOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTQzCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgIT0gVUludDY0KGVudW1zLlNUQVRVU19JTkFDVElWRSksIGVyci5OT1RfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBhc3NlcnQgLy8gRC1BU0Egbm90IGNvbmZpZ3VyZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDMKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0NAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ldmVudF9jdXJzb3IgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9DVVJTT1IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE0OAogICAgLy8gZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZi5ldmVudF9jdXJzb3IpCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNDkKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGR1cAogICAgZXh0cmFjdCA4IDEKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGI9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE1MwogICAgLy8gZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTUKICAgIC8vIHNjaGVkdWxlZF90aW1lPWVudHJ5LnNjaGVkdWxlZF90aW1lLAogICAgZGlnIDIKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTU2CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIGRpZyAzCiAgICBleHRyYWN0IDE3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTcKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9ZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIGRpZyA0CiAgICBleHRyYWN0IDI1IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTkKICAgIC8vIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPWVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MAogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgZGlnIDYKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTE2MQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9ZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICBkaWcgNwogICAgZXh0cmFjdCA0OSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTYyCiAgICAvLyBmbGFncz1lbnRyeS5mbGFncywKICAgIGRpZyA4CiAgICBleHRyYWN0IDU3IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTgKICAgIC8vIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNTItMTE2MwogICAgLy8gdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0KAogICAgLy8gICAgIGV2ZW50X2lkPWVudHJ5LmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1lbnRyeS5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1lbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9ZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPWVudHJ5LmZsYWdzLAogICAgLy8gKSwKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTUwLTExNjQKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIGVudHJ5LAogICAgLy8gICAgIHR5cC5PYnNlcnZlZEV2ZW50UmVxdWVzdCgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPWVudHJ5LmFjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPWVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG9ic2VydmVkX3JhdGU9VUludDY0KDApLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1lbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1lbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1lbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9ZW50cnkuZmxhZ3MsCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5CiAgICBwb3BuIDIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjUKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuYXBwbHlfbm9uX2Nhc2hfZXZlbnRbcm91dGluZ10oKSAtPiB2b2lkOgphcHBseV9ub25fY2FzaF9ldmVudDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBwdXNoaW50IDczCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGFzc2VydCAvLyBELUFTQSBub3QgY29uZmlndXJlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIwNAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3Rfc3VzcGVuZGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA3CiAgICAvLyBpZiBwYXlsb2FkLmZsYWdzICYgVUludDY0KGVudW1zLkZMQUdfT0JTRVJWRURfRVZFTlQpOgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA0CiAgICAmCiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjA4CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMDkKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjMzCiAgICAvLyByZXR1cm4gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9DTE0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImNvbnRyYWN0X3R5cGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJhY3RfdHlwZSBleGlzdHMKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ1CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VwcG9ydHNfb2JzZXJ2ZWRfZXZlbnRzKCksIGVyci5PQlNFUlZFRF9FVkVOVF9SRVFVSVJFRAogICAgYXNzZXJ0IC8vIE9ic2VydmVkIGV2ZW50IHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhpcyBhY3Rpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0NgogICAgLy8gYXNzZXJ0IHBheWxvYWQuZXZlbnRfaWQgPT0gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGRpZyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTQ4CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUsIHBheWxvYWQuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMgogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk0Ny05NDkKICAgIC8vIHNlbGYuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSwgcGF5bG9hZC5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICAvLyApCiAgICBjYWxsc3ViIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTUxCiAgICAvLyBwYWdlX2luZGV4ID0gc2VsZi5fc2NoZWR1bGVfcGFnZV9pbmRleChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTkwCiAgICAvLyByZXR1cm4gZXZlbnRfaWQgLy8gVUludDY0KGNzdC5TQ0hFRFVMRV9QQUdFX1NJWkUpCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTIKICAgIC8vIHBhZ2UgPSB0eXAuRXhlY3V0aW9uU2NoZWR1bGVQYWdlKCkKICAgIGJ5dGVjIDQ4IC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTMKICAgIC8vIGlmIHBhZ2VfaW5kZXggaW4gc2VsZi5zY2hlZHVsZV9wYWdlOgogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMjcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk1NAogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA3CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDcKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTU1CiAgICAvLyBhc3NlcnQgcGFnZS5sZW5ndGggPCBVSW50NjQoY3N0LlNDSEVEVUxFX1BBR0VfU0laRSksIGVyci5JTlZBTElEX1NDSEVEVUxFX1BBR0UKICAgIGRpZyA1CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNjaGVkdWxlIHBhZ2UKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2MAogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjEKICAgIC8vIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMQogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjIKICAgIC8vIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMjUgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTYzCiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgNDEgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTY0CiAgICAvLyBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIGRpZyA0CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk2NQogICAgLy8gbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCA1NyA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTctOTY3CiAgICAvLyB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgIGV2ZW50X3R5cGU9cGF5bG9hZC5ldmVudF90eXBlLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPXBheWxvYWQucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXBheWxvYWQubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICkKICAgIGRpZyAxMQogICAgaXRvYgogICAgZGlnIDE4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMwogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NTYtOTY4CiAgICAvLyBwYWdlLmFwcGVuZCgKICAgIC8vICAgICB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICAgICAgZXZlbnRfdHlwZT1wYXlsb2FkLmV2ZW50X3R5cGUsCiAgICAvLyAgICAgICAgIHNjaGVkdWxlZF90aW1lPXBheWxvYWQuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgLy8gICAgICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9cGF5bG9hZC5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbCwKICAgIC8vICAgICAgICAgZmxhZ3M9cGF5bG9hZC5mbGFncywKICAgIC8vICAgICApCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5NjkKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgOAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk3MAogICAgLy8gc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCArPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphcHBseV9ub25fY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjEyCiAgICAvLyBhc3NlcnQgZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBjdXJzb3IKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTMKICAgIC8vIGVudHJ5ID0gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KGV2ZW50X2lkKQogICAgY2FsbHN1YiBfZ2V0X3NjaGVkdWxlX2VudHJ5CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxNQogICAgLy8gZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgZHVwCiAgICBleHRyYWN0IDggMQogICAgYnVyeSAxMAogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjQKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9SUiksCiAgICBwdXNoaW50IDEyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY3CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDE1CiAgICBkaWcgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgcHVzaGludCAxOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzYzLTM3MAogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNjMtMzcwCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JRUQpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUlJGKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBieiBhcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDE2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTQtMTIxNgogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2lzX25vbl9jYXNoKAogICAgLy8gICAgIGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCkKICAgIC8vICksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMTcKICAgIC8vIGFzc2VydCBlbnRyeS5ldmVudF90eXBlICE9IGFyYzQuVUludDgoZW51bXMuRVZUX0lFRCksIGVyci5JTlZBTElEX0VWRU5UX1RZUEUKICAgIGRpZyA4CiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYiE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCB0eXBlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozNzQKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluIChVSW50NjQoZW51bXMuRVZUX1JSKSwgVUludDY0KGVudW1zLkVWVF9SUkYpKQogICAgZGlnIDQKICAgIHB1c2hpbnQgMTIKICAgID09CiAgICBibnogYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF90cnVlQDIxCiAgICBkaWcgNAogICAgcHVzaGludCAxMQogICAgPT0KICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfZmFsc2VAMjIKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfdHJ1ZUAyMToKICAgIGludGNfMSAvLyAxCgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX21lcmdlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIxOAogICAgLy8gaWYgc2VsZi5fZXZlbnRfaXNfcmF0ZV9yZXNldChlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpKToKICAgIGJ6IGFwcGx5X25vbl9jYXNoX2V2ZW50X2Vsc2VfYm9keUA1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODIKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBUeG4uc2VuZGVyKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYnl0ZWMgMjUgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKCmFwcGx5X25vbl9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyMjIKICAgIC8vIHNlbGYuX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KGVudHJ5LCBwYXlsb2FkKQogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeQogICAgcG9wbiAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIzCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjExNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfZWxzZV9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjIxCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2CgphcHBseV9ub25fY2FzaF9ldmVudF9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9tZXJnZUAyMwoKYXBwbHlfbm9uX2Nhc2hfZXZlbnRfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGx5X25vbl9jYXNoX2V2ZW50X2Jvb2xfbWVyZ2VAMTcKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5hcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50OgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTIyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgcHVzaGludCA2NQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5PYnNlcnZlZENhc2hFdmVudFJlcXVlc3QKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU0CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNTUKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjU2CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X3N1c3BlbmRlZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIzMwogICAgLy8gcmV0dXJuIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJjb250cmFjdF90eXBlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3R5cGUgZXhpc3RzCiAgICBwdXNoaW50IDUKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODEKICAgIC8vIGFzc2VydCBzZWxmLl9zdXBwb3J0c19vYnNlcnZlZF9ldmVudHMoKSwgZXJyLk9CU0VSVkVEX0VWRU5UX1JFUVVJUkVECiAgICBhc3NlcnQgLy8gT2JzZXJ2ZWQgZXZlbnQgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGlzIGFjdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgyCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF9pZCA9PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LCBlcnIuSU5WQUxJRF9FVkVOVF9JRAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgc3dhcAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gSW52YWxpZCBldmVudCBpZAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTgzCiAgICAvLyBhc3NlcnQgcGF5bG9hZC5ldmVudF90eXBlID09IGFyYzQuVUludDgoZW51bXMuRVZUX1BSKSwgZXJyLklOVkFMSURfRVZFTlRfVFlQRQogICAgZGlnIDEKICAgIGV4dHJhY3QgOCAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IHR5cGUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk4NAogICAgLy8gYXNzZXJ0IHBheWxvYWQuZmxhZ3MgJiBVSW50NjQoZW51bXMuRkxBR19DQVNIX0VWRU5UKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBzd2FwCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTg2CiAgICAvLyBpZiBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50ID4gVUludDY0KDApOgogICAgYnogYXBwZW5kX29ic2VydmVkX2Nhc2hfZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODgKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5ODctOTg5CiAgICAvLyBwcmV2aW91c19lbnRyeSA9IHNlbGYuX2dldF9zY2hlZHVsZV9lbnRyeSgKICAgIC8vICAgICBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gVUludDY0KDEpCiAgICAvLyApCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5MQogICAgLy8gcHJldmlvdXNfZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gcGF5bG9hZC5zY2hlZHVsZWRfdGltZQogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgIHB1c2hpbnQgOQogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTAtOTkyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByZXZpb3VzX2VudHJ5LnNjaGVkdWxlZF90aW1lIDw9IHBheWxvYWQuc2NoZWR1bGVkX3RpbWUKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKCmFwcGVuZF9vYnNlcnZlZF9jYXNoX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NAogICAgLy8gcGFnZV9pbmRleCA9IHNlbGYuX3NjaGVkdWxlX3BhZ2VfaW5kZXgoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgcHVzaGludCAxNgogICAgLwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk1CiAgICAvLyBwYWdlID0gdHlwLkV4ZWN1dGlvblNjaGVkdWxlUGFnZSgpCiAgICBieXRlYyA0OCAvLyAweDAwMDAKICAgIGJ1cnkgNgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk2CiAgICAvLyBpZiBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZToKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vIDB4NTMyMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojk5NwogICAgLy8gcGFnZSA9IHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XS5jb3B5KCkKICAgIGRpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX3BhZ2UgZW50cnkgZXhpc3RzCgphcHBlbmRfb2JzZXJ2ZWRfY2FzaF9ldmVudF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo5OTgKICAgIC8vIGFzc2VydCBwYWdlLmxlbmd0aCA8IFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgcHVzaGludCAxNgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwMwogICAgLy8gc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA0CiAgICAvLyBhY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLmFjY3J1YWxfZmFjdG9yLAogICAgZGlnIDEKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNQogICAgLy8gcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICBkaWcgMgogICAgZXh0cmFjdCAyNSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA2CiAgICAvLyBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1wYXlsb2FkLm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzMgOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTAwNwogICAgLy8gbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1wYXlsb2FkLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24sCiAgICBkaWcgNAogICAgZXh0cmFjdCA0MSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMDA4CiAgICAvLyBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDQ5IDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMDAtMTAxMAogICAgLy8gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9cGF5bG9hZC5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1wYXlsb2FkLnNjaGVkdWxlZF90aW1lLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPXBheWxvYWQuYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9cGF5bG9hZC5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPXBheWxvYWQubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgIGZsYWdzPXBheWxvYWQuZmxhZ3MsCiAgICAvLyApCiAgICBkaWcgMTAKICAgIGl0b2IKICAgIGRpZyAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6OTk5LTEwMTEKICAgIC8vIHBhZ2UuYXBwZW5kKAogICAgLy8gICAgIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgICAgICBldmVudF9pZD1wYXlsb2FkLmV2ZW50X2lkLAogICAgLy8gICAgICAgICBldmVudF90eXBlPXBheWxvYWQuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9cGF5bG9hZC5zY2hlZHVsZWRfdGltZSwKICAgIC8vICAgICAgICAgYWNjcnVhbF9mYWN0b3I9cGF5bG9hZC5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1wYXlsb2FkLnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyAgICAgICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPXBheWxvYWQubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249cGF5bG9hZC5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uLAogICAgLy8gICAgICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1wYXlsb2FkLm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgLy8gICAgICAgICBmbGFncz1wYXlsb2FkLmZsYWdzLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTIKICAgIC8vIHNlbGYuc2NoZWR1bGVfcGFnZVtwYWdlX2luZGV4XSA9IHBhZ2UuY29weSgpCiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEwMTMKICAgIC8vIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgKz0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI2MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfc3RhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjb250cmFjdF9nZXRfc3RhdGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNDMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyAhPSBVSW50NjQoZW51bXMuU1RBVFVTX0lOQUNUSVZFKSwgZXJyLk5PVF9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGR1cAogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc1CiAgICAvLyBjb250cmFjdF90eXBlPWFyYzQuVUludDgoc2VsZi5jb250cmFjdF90eXBlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NwogICAgLy8gdG90YWxfdW5pdHM9c2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjc4CiAgICAvLyByZXNlcnZlZF91bml0c190b3RhbD1zZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNzkKICAgIC8vIGluaXRpYWxfZXhjaGFuZ2VfYW1vdW50PXNlbGYuaW5pdGlhbF9leGNoYW5nZV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmluaXRpYWxfZXhjaGFuZ2VfYW1vdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MAogICAgLy8gZXZlbnRfY3Vyc29yPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgxCiAgICAvLyBzY2hlZHVsZV9lbnRyeV9jb3VudD1zZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4MgogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPXNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjgzCiAgICAvLyBpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlPXNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg0CiAgICAvLyBub21pbmFsX2ludGVyZXN0X3JhdGU9c2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODYKICAgIC8vIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjg3CiAgICAvLyBjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleD1zZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4LAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jdW11bGF0aXZlX3ByaW5jaXBhbF9pbmRleCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyODgKICAgIC8vIHJlc2VydmVkX2ludGVyZXN0PXNlbGYucmVzZXJ2ZWRfaW50ZXJlc3QsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInJlc2VydmVkX2ludGVyZXN0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX2ludGVyZXN0IGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI4OQogICAgLy8gcmVzZXJ2ZWRfcHJpbmNpcGFsPXNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZXNlcnZlZF9wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZWRfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTI3NC0xMjkwCiAgICAvLyByZXR1cm4gdHlwLktlcm5lbFN0YXRlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGU9YXJjNC5VSW50OChzZWxmLmNvbnRyYWN0X3R5cGUpLAogICAgLy8gICAgIHN0YXR1cz1zZWxmLnN0YXR1cywKICAgIC8vICAgICB0b3RhbF91bml0cz1zZWxmLnRvdGFsX3VuaXRzLAogICAgLy8gICAgIHJlc2VydmVkX3VuaXRzX3RvdGFsPXNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwsCiAgICAvLyAgICAgaW5pdGlhbF9leGNoYW5nZV9hbW91bnQ9c2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCwKICAgIC8vICAgICBldmVudF9jdXJzb3I9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgc2NoZWR1bGVfZW50cnlfY291bnQ9c2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9c2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwsCiAgICAvLyAgICAgaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZT1zZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgbm9taW5hbF9pbnRlcmVzdF9yYXRlPXNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9c2VsZi5hY2NydWVkX2ludGVyZXN0LAogICAgLy8gICAgIGN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXg9c2VsZi5jdW11bGF0aXZlX2ludGVyZXN0X2luZGV4LAogICAgLy8gICAgIGN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4PXNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgsCiAgICAvLyAgICAgcmVzZXJ2ZWRfaW50ZXJlc3Q9c2VsZi5yZXNlcnZlZF9pbnRlcmVzdCwKICAgIC8vICAgICByZXNlcnZlZF9wcmluY2lwYWw9c2VsZi5yZXNlcnZlZF9wcmluY2lwYWwsCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICBpdG9iCiAgICB1bmNvdmVyIDE0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0MwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzICE9IFVJbnQ2NChlbnVtcy5TVEFUVVNfSU5BQ1RJVkUpLCBlcnIuTk9UX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgYXNzZXJ0IC8vIEQtQVNBIG5vdCBjb25maWd1cmVkCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA0CiAgICAvLyBpZiBzZWxmLmV2ZW50X2N1cnNvciA+PSBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic2NoZWR1bGVfZW50cnlfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNgogICAgLy8gZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmV2ZW50X2N1cnNvciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDUtMTMxNQogICAgLy8gcmV0dXJuIHR5cC5FeGVjdXRpb25TY2hlZHVsZUVudHJ5KAogICAgLy8gICAgIGV2ZW50X2lkPXNlbGYuZXZlbnRfY3Vyc29yLAogICAgLy8gICAgIGV2ZW50X3R5cGU9YXJjNC5VSW50OCgwKSwKICAgIC8vICAgICBzY2hlZHVsZWRfdGltZT1VSW50NjQoMCksCiAgICAvLyAgICAgYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIHJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3I9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbD1VSW50NjQoMCksCiAgICAvLyAgICAgZmxhZ3M9VUludDY0KDApLAogICAgLy8gKQogICAgaXRvYgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNwogICAgLy8gZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgYnl0ZWMgNDEgLy8gMHgwMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTMwNS0xMzE1CiAgICAvLyByZXR1cm4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkoCiAgICAvLyAgICAgZXZlbnRfaWQ9c2VsZi5ldmVudF9jdXJzb3IsCiAgICAvLyAgICAgZXZlbnRfdHlwZT1hcmM0LlVJbnQ4KDApLAogICAgLy8gICAgIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIC8vICAgICBhY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgcmVkZW1wdGlvbl9hY2NydWFsX2ZhY3Rvcj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGU9VUludDY0KDApLAogICAgLy8gICAgIG5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb249VUludDY0KDApLAogICAgLy8gICAgIG5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsPVVJbnQ2NCgwKSwKICAgIC8vICAgICBmbGFncz1VSW50NjQoMCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzMDgKICAgIC8vIHNjaGVkdWxlZF90aW1lPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzA1LTEzMTUKICAgIC8vIHJldHVybiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSgKICAgIC8vICAgICBldmVudF9pZD1zZWxmLmV2ZW50X2N1cnNvciwKICAgIC8vICAgICBldmVudF90eXBlPWFyYzQuVUludDgoMCksCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9VUludDY0KDApLAogICAgLy8gICAgIGFjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICByZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yPVVJbnQ2NCgwKSwKICAgIC8vICAgICBuZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZT1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbj1VSW50NjQoMCksCiAgICAvLyAgICAgbmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWw9VUludDY0KDApLAogICAgLy8gICAgIGZsYWdzPVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAoKY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuY29udHJhY3RfZ2V0X25leHRfZHVlX2V2ZW50QDQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMjkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNvbnRyYWN0X2dldF9uZXh0X2R1ZV9ldmVudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxMzE2CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NjaGVkdWxlX2VudHJ5KHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBjYWxsc3ViIF9nZXRfc2NoZWR1bGVfZW50cnkKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBjb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5jb250cmFjdF9nZXRfbmV4dF9kdWVfZXZlbnRANAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLmNvbnRyYWN0X3VwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyYWN0X3VwZGF0ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjEtMTY0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5CiAgICAvLyAjIG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yb3RhdGVfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3JvdGF0ZV9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTgwCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODEKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBuZXdfYXJyYW5nZXIKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3NldF9vcF9kYWVtb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3NldF9vcF9kYWVtb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE5OAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTk5CiAgICAvLyBzZWxmLm9wX2RhZW1vbi52YWx1ZSA9IGFkZHJlc3MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBwdXNoaW50IDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMuYWJpX3R5cGVzLlJvbGVWYWxpZGl0eQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNAogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI1CiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNgogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludCAyMAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA1CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwOAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjI3CiAgICAvLyBzZWxmLl9zZXRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MsIHZhbGlkaXR5KQogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE2CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTQKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTIyCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyNwogICAgLy8gc2VsZi5fc2V0X3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzLCB2YWxpZGl0eSkKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDE0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjYKICAgIC8vIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIGIgcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9zZXRfcm9sZUAxNAoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfcmV2b2tlX3JvbGVbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX3Jldm9rZV9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI0OQogICAgLy8gc2VsZi5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIF9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUwCiAgICAvLyBzZWxmLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIF9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjkKICAgIC8vIGFzc2VydCByb2xlX2lkICE9IFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwgZXJyLklOVkFMSURfUk9MRQogICAgZHVwCiAgICBwdXNoaW50IDIwCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMwCiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50IDQwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTMKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM2CiAgICAvLyBkZWwgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTIKICAgIC8vIHNlbGYuX2RlbGV0ZV9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcykKICAgIGIgcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTM4CiAgICAvLyBpZiByb2xlX2lkID09IFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgZHVwCiAgICBwdXNoaW50IDYwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzYTU0NTI1MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDAKICAgIC8vIGRlbCBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjUyCiAgICAvLyBzZWxmLl9kZWxldGVfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpLCByb2xlX2FkZHJlc3MpCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCnJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0MgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1MgogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDgKICAgIC8vIGRlbCBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19jb250cmFjdF9zdXNwZW5zaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19jb250cmFjdF9zdXNwZW5zaW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojc5CiAgICAvLyBhc3NlcnQgc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyMSAvLyAweDUyM2E0MTU1NTQyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MQogICAgLy8gc2VsZi5jb250cmFjdF9zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGJ5dGVjIDMzIC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI3MgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzYKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4NwogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBkZWZhdWx0ZWQKICAgIGJ5dGVjIDM0IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4OAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMQogICAgLy8gcmV0dXJuIHNlbGYuYXJyYW5nZXIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjMgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyMgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5wcmltYXJ5X2RlYWxlciwgYWRkcmVzcyksCiAgICBieXRlYyAyMiAvLyAweDUyM2E1MDU5NDQyMwogICAgZGlnIDIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzIzCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIGFkZHJlc3MpLAogICAgYnl0ZWMgMjYgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNAogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWMgMjEgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyNQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5vYnNlcnZlciwgYWRkcmVzcyksCiAgICBieXRlYyAyNSAvLyAweDUyM2E0ZDRmNDMyMwogICAgdW5jb3ZlciA1CiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyA0MSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDUKICAgIHNldGJpdAogICAgcHVzaGludCAyCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgcHVzaGludCAzCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgcHVzaGludCA0CiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM0NgogICAgLy8gcm9sZSA9IHJvbGVfaWQuYXNfdWludDY0KCkKICAgIGJ0b2kKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNDcKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGUpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9yb2xlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ5CiAgICAvLyBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzQ4LTM3OQogICAgLy8gbWF0Y2ggcm9sZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgcmV0dXJuIHR5cC5Sb2xlVmFsaWRpdHkoCiAgICAvLyAgICAgICAgICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICAgICAgICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICB1bmNvdmVyIDYKICAgIG1hdGNoIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMEAyIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMUAzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfM0A1IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2IHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc5CiAgICAvLyBvcC5lcnIoZXJyLklOVkFMSURfUk9MRSkKICAgIGVyciAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV81QDc6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc1CiAgICAvLyBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc0LTM3NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NwogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzAKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIxIC8vIDB4NTIzYTQxNTU1NDIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzY5LTM3MQogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzIKICAgIC8vIHJldHVybiBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjUKICAgIC8vIHNlbGYudHJ1c3RlZSwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyAyNiAvLyAweDUyM2E1NDUyNTMyMwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NC0zNjYKICAgIC8vIGFzc2VydCBzZWxmLl9oYXNfcm9sZSgKICAgIC8vICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2NwogICAgLy8gcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjAKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXIsIHJvbGVfYWRkcmVzcwogICAgYnl0ZWMgMjIgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTktMzYxCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzYyCiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzYTRkNGU0NzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0LTM1NgogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA5CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTAtMzUyCiAgICAvLyByZXR1cm4gdHlwLlJvbGVWYWxpZGl0eSgKICAgIC8vICAgICByb2xlX3ZhbGlkaXR5X3N0YXJ0PVVJbnQ2NCgwKSwgcm9sZV92YWxpZGl0eV9lbmQ9VUludDY0KDApCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDkKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9hY2NvdW50X3N1c3BlbmRlZDoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNgogICAgLy8gZGVmIF9hc3NlcnRfaXNfbm90X2FjY291bnRfc3VzcGVuZGVkKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogQWNjb3VudCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcHVzaGludCAzODQKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjY291bnRpbmcuQWNjb3VudGluZ01vZHVsZS5fc2V0dGxlX3Bvc2l0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogpfc2V0dGxlX3Bvc2l0aW9uOgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjQ0CiAgICAvLyBkZWYgX3NldHRsZV9wb3NpdGlvbihzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IHR1cGxlW1VJbnQ2NCwgVUludDY0XToKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjI0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA4IC8vIDB4NDEyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjYxCiAgICAvLyBwb3NpdGlvbiA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLmNvcHkoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo2My02NQogICAgLy8gIyBDb21wdXRlIHRoZSBpbmNyZW1lbnRhbCBwZXItdW5pdCBmaXhlZC1wb2ludCBpbnRlcmVzdCBhbmQgcHJpbmNpcGFsIGFjY3J1ZWQKICAgIC8vICMgc2luY2UgdGhpcyBhY2NvdW50J3MgbGFzdCBjaGVja3BvaW50LgogICAgLy8gaW50ZXJlc3RfZGVsdGEgPSBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggLSBwb3NpdGlvbi5pbnRlcmVzdF9jaGVja3BvaW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gImN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleCBleGlzdHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDU3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjY3CiAgICAvLyBzZWxmLmN1bXVsYXRpdmVfcHJpbmNpcGFsX2luZGV4IC0gcG9zaXRpb24ucHJpbmNpcGFsX2NoZWNrcG9pbnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBkaWcgMgogICAgcHVzaGludCA2NQogICAgZXh0cmFjdF91aW50NjQKICAgIC0KICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3MwogICAgLy8gaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjcwLTc0CiAgICAvLyAjIENvbnZlcnQgdGhlIHBlci11bml0IGZpeGVkLXBvaW50IGRlbHRhcyBpbnRvIGFic29sdXRlIGNsYWltYWJsZSBhbW91bnRzCiAgICAvLyAjIHVzaW5nIHRoZSBhY2NvdW50J3MgYWN0aXZlIHVuaXRzLgogICAgLy8gY2xhaW1hYmxlX2ludGVyZXN0ID0gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgaW50ZXJlc3RfZGVsdGEsIHBvc2l0aW9uLnVuaXRzLCBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICAvLyApCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzYKICAgIC8vIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo3NS03NwogICAgLy8gY2xhaW1hYmxlX3ByaW5jaXBhbCA9IHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIHByaW5jaXBhbF9kZWx0YSwgcG9zaXRpb24udW5pdHMsIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6NzktODEKICAgIC8vICMgQWNjcnVlIHRoZSBjbGFpbWFibGUgYW1vdW50cyB0byB0aGUgYWNjb3VudCBwb3NpdGlvbiBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZQogICAgLy8gIyBmb3Igd2l0aGRyYXdhbC4KICAgIC8vIHBvc2l0aW9uLmNsYWltYWJsZV9pbnRlcmVzdCArPSBjbGFpbWFibGVfaW50ZXJlc3QKICAgIGRpZyAyCiAgICBwdXNoaW50IDczCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgcmVwbGFjZTIgNzMKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4MgogICAgLy8gcG9zaXRpb24uY2xhaW1hYmxlX3ByaW5jaXBhbCArPSBjbGFpbWFibGVfcHJpbmNpcGFsCiAgICBkdXAKICAgIHB1c2hpbnQgODEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgODEKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo4NC04NgogICAgLy8gIyBBZHZhbmNlIHRoZSBhY2NvdW50J3MgcGVyLXVuaXQgZml4ZWQtcG9pbnQgY2hlY2twb2ludHMgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsCiAgICAvLyAjIHBlci11bml0IGZpeGVkLXBvaW50IGdsb2JhbCBpbmRpY2VzLgogICAgLy8gcG9zaXRpb24uaW50ZXJlc3RfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9pbnRlcmVzdF9pbmRleAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJjdW11bGF0aXZlX2ludGVyZXN0X2luZGV4IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmN1bXVsYXRpdmVfaW50ZXJlc3RfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA1NwogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg3CiAgICAvLyBwb3NpdGlvbi5wcmluY2lwYWxfY2hlY2twb2ludCA9IHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXgiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3VtdWxhdGl2ZV9wcmluY2lwYWxfaW5kZXggZXhpc3RzCiAgICBpdG9iCiAgICByZXBsYWNlMiA2NQogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5Ojg5LTkwCiAgICAvLyAjIEFkdmFuY2UgdGhlIGFjY291bnQncyBldmVudCBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIGV2ZW50IGN1cnNvci4KICAgIC8vIHBvc2l0aW9uLnNldHRsZWRfY3Vyc29yID0gc2VsZi5ldmVudF9jdXJzb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgaXRvYgogICAgcmVwbGFjZTIgNDkKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5Mi05NAogICAgLy8gIyBVcGRhdGUgdGhlIGFjY291bnQgcG9zaXRpb24gYW5kIHJldHVybiB0aGUgbmV3bHkgYWNjcnVlZCBjbGFpbWFibGUgYW1vdW50cwogICAgLy8gIyBhZGRlZCB0byB0aGUgdG90YWwgcG9zaXRpb24ncyBjbGFpbWFibGUgYW1vdW50cy4KICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gcG9zaXRpb24uY29weSgpCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weTo5NQogICAgLy8gcmV0dXJuIGNsYWltYWJsZV9pbnRlcmVzdCwgY2xhaW1hYmxlX3ByaW5jaXBhbAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY2NvdW50aW5nLkFjY291bnRpbmdNb2R1bGUuX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKX2Vuc3VyZV91bml0c19hY3RpdmF0ZWQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6OTcKICAgIC8vIGRlZiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IEFjY291bnQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToyNAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgOCAvLyAweDQxMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjEzNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IFVJbnQ2NChlbnVtcy5TVEFUVVNfUEVORElOR19JRUQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTAwCiAgICAvLyBpZiBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKToKICAgIGJ6IF9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY2NvdW50aW5nLnB5OjEwMQogICAgLy8gcmV0dXJuCiAgICByZXRzdWIKCl9lbnN1cmVfdW5pdHNfYWN0aXZhdGVkX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDMKICAgIC8vIHBvc2l0aW9uID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uY29weSgpCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA0CiAgICAvLyBpZiBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9PSBVSW50NjQoMCk6CiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMDUKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgpfZW5zdXJlX3VuaXRzX2FjdGl2YXRlZF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA4CiAgICAvLyBwb3NpdGlvbi51bml0cyArPSBhY3RpdmF0ZWRfdW5pdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTA5CiAgICAvLyBwb3NpdGlvbi5yZXNlcnZlZF91bml0cyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQwCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHBvc2l0aW9uLmNvcHkoKQogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvYWNjb3VudGluZy5weToxMTEKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID49IGFjdGl2YXRlZF91bml0cywgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIGV4aXN0cwogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBtb2R1bGVzL2FjY291bnRpbmcucHk6MTEyCiAgICAvLyBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsIC09IGFjdGl2YXRlZF91bml0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWMgMTEgLy8gInJlc2VydmVkX3VuaXRzX3RvdGFsIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9zY2FsZWRfbXVsX2RpdihtdWx0aXBsaWNhbmQ6IHVpbnQ2NCwgbXVsdGlwbGllcjogdWludDY0LCBkaXZpc29yOiB1aW50NjQpIC0+IHVpbnQ2NDoKX3NjYWxlZF9tdWxfZGl2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTUzLTE1NQogICAgLy8gZGVmIF9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLCBtdWx0aXBsaWNhbmQ6IFVJbnQ2NCwgbXVsdGlwbGllcjogVUludDY0LCBkaXZpc29yOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTcKICAgIC8vIGlmIG11bHRpcGxpY2FuZCA9PSBVSW50NjQoMCkgb3IgbXVsdGlwbGllciA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ6IF9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMgogICAgYm56IF9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDMKCl9zY2FsZWRfbXVsX2Rpdl9pZl9ib2R5QDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTgKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9zY2FsZWRfbXVsX2Rpdl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNTkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobXVsdGlwbGljYW5kLCBtdWx0aXBsaWVyKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2MAogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkaXZpc29yKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaXZ3CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYW1vdW50X3RvX2luZGV4X2RlbHRhKGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6Cl9hbW91bnRfdG9faW5kZXhfZGVsdGE6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjIKICAgIC8vIGRlZiBfYW1vdW50X3RvX2luZGV4X2RlbHRhKHNlbGYsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NAogICAgLy8gaWYgYW1vdW50ID09IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjUKICAgIC8vIHJldHVybiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9hbW91bnRfdG9faW5kZXhfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTY2CiAgICAvLyBhc3NlcnQgc2VsZi50b3RhbF91bml0cyA+IFVJbnQ2NCgwKSwgZXJyLk5PX1VOSVRTCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE2NwogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KGFtb3VudCwgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwgc2VsZi50b3RhbF91bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2luZGV4X2RlbHRhX3RvX2Ftb3VudChpbmRleF9kZWx0YTogdWludDY0KSAtPiB1aW50NjQ6Cl9pbmRleF9kZWx0YV90b19hbW91bnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNjkKICAgIC8vIGRlZiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50KHNlbGYsIGluZGV4X2RlbHRhOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc2CiAgICAvLyBpZiBpbmRleF9kZWx0YSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTc3CiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfaW5kZXhfZGVsdGFfdG9fYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE3OQogICAgLy8gc2VsZi50b3RhbF91bml0cywKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxODEKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxNzgtMTgyCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgc2VsZi50b3RhbF91bml0cywKICAgIC8vICAgICBpbmRleF9kZWx0YSwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9zY2FsZWRfbXVsX2RpdgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2dldF9zY2hlZHVsZV9lbnRyeShldmVudF9pZDogdWludDY0KSAtPiBieXRlczoKX2dldF9zY2hlZHVsZV9lbnRyeToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwMgogICAgLy8gZGVmIF9nZXRfc2NoZWR1bGVfZW50cnkoc2VsZiwgZXZlbnRfaWQ6IFVJbnQ2NCkgLT4gdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnk6CiAgICBwcm90byAxIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjIwNAogICAgLy8gYXNzZXJ0IGV2ZW50X2lkIDwgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCwgZXJyLklOVkFMSURfRVZFTlRfSUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzY2hlZHVsZV9lbnRyeV9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgZXZlbnQgaWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE5MAogICAgLy8gcmV0dXJuIGV2ZW50X2lkIC8vIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAvCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDYKICAgIC8vIGFzc2VydCBwYWdlX2luZGV4IGluIHNlbGYuc2NoZWR1bGVfcGFnZSwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgaXRvYgogICAgYnl0ZWMgMjQgLy8gMHg1MzIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzY2hlZHVsZSBwYWdlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToxOTQKICAgIC8vIHJldHVybiBldmVudF9pZCAlIFVJbnQ2NChjc3QuU0NIRURVTEVfUEFHRV9TSVpFKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE2CiAgICAlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyMDkKICAgIC8vIGFzc2VydCBvZmZzZXQgPCBwYWdlLmxlbmd0aCwgZXJyLklOVkFMSURfU0NIRURVTEVfUEFHRQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgc2NoZWR1bGUgcGFnZQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjEwCiAgICAvLyByZXR1cm4gcGFnZVtvZmZzZXRdLmNvcHkoKQogICAgcHVzaGludCA2NQogICAgKgogICAgcHVzaGludCAyCiAgICArCiAgICBwdXNoaW50IDY1CiAgICBib3hfZXh0cmFjdAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKGNvbnRyYWN0X3R5cGU6IHVpbnQ2NCwgZXZlbnRfdHlwZTogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTMtMzE1CiAgICAvLyBkZWYgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIHNlbGYsIGNvbnRyYWN0X3R5cGU6IFVJbnQ2NCwgZXZlbnRfdHlwZTogVUludDY0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSUVEKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNDgKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVApLAogICAgaW50Y18yIC8vIDgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI1NC0yNTUKICAgIC8vICMgQ2hlY2sgY29tbW9uIGV2ZW50cyBmaXJzdAogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiBjb21tb25fZXZlbnRzOgogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI0OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9NRCksCiAgICBwdXNoaW50IDE5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2lmX2JvZHlANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTAKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUlIpLAogICAgcHVzaGludCAxMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU0LTI1NQogICAgLy8gIyBDaGVjayBjb21tb24gZXZlbnRzIGZpcnN0CiAgICAvLyBpZiBldmVudF90eXBlIGluIGNvbW1vbl9ldmVudHM6CiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjUxCiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1JSRiksCiAgICBwdXNoaW50IDExCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTQtMjU1CiAgICAvLyAjIENoZWNrIGNvbW1vbiBldmVudHMgZmlyc3QKICAgIC8vIGlmIGV2ZW50X3R5cGUgaW4gY29tbW9uX2V2ZW50czoKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUA3CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjU2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18xIC8vIDEKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICByZXRzdWIKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNTgtMjU5CiAgICAvLyAjIENvbnRyYWN0LXNwZWNpZmljIGFkZGl0aW9uYWwgZXZlbnRzCiAgICAvLyBpZiBjb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9QQU0pOgogICAgZnJhbWVfZGlnIC0yCiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjYwLTI2MQogICAgLy8gIyBQQU0gb25seSBzdXBwb3J0cyBjb21tb24gZXZlbnRzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNjMKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2My0yNjUKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0xBTSkgb3IgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoCiAgICAvLyAgICAgZW51bXMuQ1RfTkFNCiAgICAvLyApOgogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9pZl9ib2R5QDExCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDE2CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfaWZfYm9keUAxMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY4CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjY2LTI3MAogICAgLy8gIyBMQU0vTkFNIGFkZDogUFIsIElQQ0IKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDEzCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2OQogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI2Ni0yNzAKICAgIC8vICMgTEFNL05BTSBhZGQ6IFBSLCBJUENCCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICkKICAgID09CiAgICBieiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF9mYWxzZUAxNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzIKICAgIC8vIGlmIGNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTik6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjc1CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIHB1c2hpbnQgMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIHB1c2hpbnQgMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI3My0yNzgKICAgIC8vICMgQU5OIGFkZHM6IFBSLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyMAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyNzcKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIHB1c2hpbnQgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjczLTI3OAogICAgLy8gIyBBTk4gYWRkczogUFIsIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDIxCgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDIwOgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MAogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfTEFYKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MwogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUiksCiAgICBwdXNoaW50IDMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4MS0yODcKICAgIC8vICMgTEFYIGFkZHM6IFBSLCBQSSwgSVBDQiwgUFJGCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QSSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9JUENCKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSRiksCiAgICAvLyApCiAgICA9PQogICAgYm56IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX3RydWVAMjgKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mjg0CiAgICAvLyBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIHB1c2hpbnQgNAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjgxLTI4NwogICAgLy8gIyBMQVggYWRkczogUFIsIFBJLCBJUENCLCBQUkYKICAgIC8vIHJldHVybiBldmVudF90eXBlIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX1BJKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuRVZUX0lQQ0IpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFJGKSwKICAgIC8vICkKICAgID09CiAgICBibnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfdHJ1ZUAyOAogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODUKICAgIC8vIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICBwdXNoaW50IDE4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJueiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4NgogICAgLy8gVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgcHVzaGludCA1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weToyODEtMjg3CiAgICAvLyAjIExBWCBhZGRzOiBQUiwgUEksIElQQ0IsIFBSRgogICAgLy8gcmV0dXJuIGV2ZW50X3R5cGUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUFIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfUEkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5FVlRfSVBDQiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLkVWVF9QUkYpLAogICAgLy8gKQogICAgPT0KICAgIGJ6IF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9ib29sX2ZhbHNlQDI5CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYm9vbF90cnVlQDI4OgogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMxNy0zMTkKICAgIC8vIGFzc2VydCBzZWxmLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlKAogICAgLy8gICAgIGNvbnRyYWN0X3R5cGUsIGV2ZW50X3R5cGUKICAgIC8vICksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgYiBfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZUAzNAoKX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2Jvb2xfZmFsc2VAMjk6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzE3LTMxOQogICAgLy8gYXNzZXJ0IHNlbGYuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGUoCiAgICAvLyAgICAgY29udHJhY3RfdHlwZSwgZXZlbnRfdHlwZQogICAgLy8gKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBiIF9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlQDM0CgpfYXNzZXJ0X2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI4OQogICAgLy8gaWYgY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQ0xNKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjI5MC0yOTEKICAgIC8vICMgQ0xNIGFkZHM6IFBSCiAgICAvLyByZXR1cm4gZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1BSKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCl9hc3NlcnRfZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZV9hZnRlcl9pZl9lbHNlQDMzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MjkzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMTctMzE5CiAgICAvLyBhc3NlcnQgc2VsZi5fZXZlbnRfYWxsb3dlZF9mb3JfY29udHJhY3RfdHlwZSgKICAgIC8vICAgICBjb250cmFjdF90eXBlLCBldmVudF90eXBlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGIgX2Fzc2VydF9ldmVudF9hbGxvd2VkX2Zvcl9jb250cmFjdF90eXBlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2V2ZW50X2FsbG93ZWRfZm9yX2NvbnRyYWN0X3R5cGVAMzQKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5faXNfZHluYW1pY19hbm51aXR5KCkgLT4gdWludDY0OgpfaXNfZHluYW1pY19hbm51aXR5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiY29udHJhY3RfdHlwZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb250cmFjdF90eXBlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzUtMzM2CiAgICAvLyBzZWxmLmNvbnRyYWN0X3R5cGUgPT0gVUludDY0KGVudW1zLkNUX0FOTikKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGJ6IF9pc19keW5hbWljX2FubnVpdHlfYm9vbF9mYWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzYKICAgIC8vIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNSAvLyAiZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzM1LTMzNgogICAgLy8gc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyBhbmQgc2VsZi5keW5hbWljX3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBieiBfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjMzNC0zMzcKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5jb250cmFjdF90eXBlID09IFVJbnQ2NChlbnVtcy5DVF9BTk4pCiAgICAvLyAgICAgYW5kIHNlbGYuZHluYW1pY19wcmluY2lwYWxfcmVkZW1wdGlvbgogICAgLy8gKQogICAgcmV0c3ViCgpfaXNfZHluYW1pY19hbm51aXR5X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozMzQtMzM3CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuY29udHJhY3RfdHlwZSA9PSBVSW50NjQoZW51bXMuQ1RfQU5OKQogICAgLy8gICAgIGFuZCBzZWxmLmR5bmFtaWNfcHJpbmNpcGFsX3JlZGVtcHRpb24KICAgIC8vICkKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50KGVudHJ5OiBieXRlcykgLT4gdWludDY0LCBieXRlczoKX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozODAKICAgIC8vIGRlZiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudChzZWxmLCBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnkpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5CiAgICAvLyBlbnRyeS5hY2NydWFsX2ZhY3RvciA9PSBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkwCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJ6IF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MzkxCiAgICAvLyBvciBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Mzg5LTM5MQogICAgLy8gZW50cnkuYWNjcnVhbF9mYWN0b3IgPT0gVUludDY0KDApCiAgICAvLyBvciBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCkKICAgIC8vIG9yIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9PSBVSW50NjQoMCkKICAgIGJueiBfZW50cnlfaW50ZXJlc3Rfc2VnbWVudF9hZnRlcl9pZl9lbHNlQDQKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2lmX2JvZHlAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5MwogICAgLy8gcmV0dXJuIFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICByZXRzdWIKCl9lbnRyeV9pbnRlcmVzdF9zZWdtZW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NQogICAgLy8gc2VsZi5pbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NgogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjM5NC0zOTgKICAgIC8vIGFjY3J1ZWQgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UsCiAgICAvLyAgICAgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0MDIKICAgIC8vIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTozOTktNDAzCiAgICAvLyByZXR1cm4gc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICAvLyAgICAgYWNjcnVlZCwKICAgIC8vICAgICBlbnRyeS5hY2NydWFsX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yKGRpc2NvdW50X2ZhY3RvcjogdWludDY0LCByZWRlbXB0aW9uX2ZhY3RvcjogdWludDY0KSAtPiB1aW50NjQ6Cl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2Mi00NjYKICAgIC8vIGRlZiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3I6IFVJbnQ2NCwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvcjogVUludDY0LAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ2OAogICAgLy8gaWYgcmVkZW1wdGlvbl9mYWN0b3IgPT0gVUludDY0KDApOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDY5CiAgICAvLyByZXR1cm4gZGlzY291bnRfZmFjdG9yCiAgICBmcmFtZV9kaWcgLTIKICAgIHJldHN1YgoKX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3MAogICAgLy8gcGVyaW9kX3JhdGUgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlICsgc2VsZi5fc2NhbGVkX211bF9kaXYoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzEKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo0NzAtNDc0CiAgICAvLyBwZXJpb2RfcmF0ZSA9IHNlbGYuZml4ZWRfcG9pbnRfc2NhbGUgKyBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSwKICAgIC8vICAgICByZWRlbXB0aW9uX2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2NhbGVkX211bF9kaXYKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ3NQogICAgLy8gYXNzZXJ0IHBlcmlvZF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9BQ1RVU19DT05GSUcKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludmFsaWQgQUNUVVMgY29uZmlndXJhdGlvbgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc4CiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDc2LTQ4MAogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIGRpc2NvdW50X2ZhY3RvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIHBlcmlvZF9yYXRlLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICByZXRzdWIKCgovLyBtb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnkoZW50cnk6IGJ5dGVzLCBwYXlsb2FkOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnk6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MTMtNjE1CiAgICAvLyBkZWYgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5KAogICAgLy8gICAgIHNlbGYsIGVudHJ5OiB0eXAuRXhlY3V0aW9uU2NoZWR1bGVFbnRyeSwgcGF5bG9hZDogdHlwLk9ic2VydmVkRXZlbnRSZXF1ZXN0CiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjIzCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfaWQgPT0gc2VsZi5ldmVudF9jdXJzb3IsIGVyci5JTlZBTElEX0VWRU5UX0NVUlNPUgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJldmVudF9jdXJzb3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXZlbnRfY3Vyc29yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIGV2ZW50IGN1cnNvcgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjI0CiAgICAvLyBhc3NlcnQgZW50cnkuc2NoZWR1bGVkX3RpbWUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsIGVyci5OT19EVUVfQ0FTSEZMT1cKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGFzc2VydCAvLyBObyBkdWUgY2FzaGZsb3cgdG8gcGF5CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MjYKICAgIC8vIGV2ZW50X3R5cGUgPSBlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyA4CiAgICBnZXRieXRlCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyNwogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCk6CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjYyOC02MzAKICAgIC8vICMgSUVEIGZpbmFsaXplcyBpc3N1YW5jZTogcmVzZXJ2ZWQgdW5pdHMgYmVjb21lIGFjdGl2YXRhYmxlIGFuZCB0aGUKICAgIC8vICMgc2NoZWR1bGUncyBpbml0aWFsIGNvbnRyYWN0dWFsIHN0YXRlIGJlY29tZXMgbGl2ZS4KICAgIC8vIGFzc2VydCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLklOVkFMSURfQUNUVVNfQ09ORklHCiAgICBhc3NlcnQgLy8gSW52YWxpZCBBQ1RVUyBjb25maWd1cmF0aW9uCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzIKICAgIC8vIHNlbGYucmVzZXJ2ZWRfdW5pdHNfdG90YWwgPT0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJyZXNlcnZlZF91bml0c190b3RhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlZF91bml0c190b3RhbCBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjMxLTYzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnJlc2VydmVkX3VuaXRzX3RvdGFsID09IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9JTkNPTVBMRVRFCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgbm90IGNvbXBsZXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzQKICAgIC8vIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsID0gZW50cnkubmV4dF9vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0OQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM1CiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgYnl0ZWMgNyAvLyAiaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzYKICAgIC8vIHNlbGYubm9taW5hbF9pbnRlcmVzdF9yYXRlID0gZW50cnkubmV4dF9ub21pbmFsX2ludGVyZXN0X3JhdGUKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAzMwogICAgZXh0cmFjdF91aW50NjQKICAgIGJ5dGVjIDkgLy8gIm5vbWluYWxfaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzcKICAgIC8vIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjM4CiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2MzkKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoZW51bXMuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzEgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUxCiAgICAvLyBhc3NlcnQgZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSA9PSBVSW50NjQoZW51bXMuRVZUX0lFRCksIGVyci5OT1RfRVZUX0lFRAogICAgZnJhbWVfZGlnIDExCiAgICBhc3NlcnQgLy8gTm90IElFRCBldmVudAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDUyCiAgICAvLyByZXR1cm4gc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbml0aWFsX2V4Y2hhbmdlX2Ftb3VudCBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0NAogICAgLy8gc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0MS02NDUKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1zZWxmLl9lbnRyeV9pZWRfYW1vdW50KGVudHJ5KSwKICAgIC8vICAgICBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIF9lbWl0X2V4ZWN1dGlvbl9ldmVudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NDYKICAgIC8vIHJldHVybgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6MTM1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gVUludDY0KGVudW1zLlNUQVRVU19QRU5ESU5HX0lFRCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCA1MAogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjE0NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9zdGF0dXNfaXNfcGVuZGluZ19pZWQoKSwgZXJyLlBFTkRJTkdfSUVECiAgICAhCiAgICBhc3NlcnQgLy8gSUVEIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY0OQogICAgLy8gc2VsZi5hY2NydWVkX2ludGVyZXN0ICs9IHNlbGYuX2VudHJ5X2ludGVyZXN0X3NlZ21lbnQoZW50cnkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiYWNjcnVlZF9pbnRlcmVzdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NydWVkX2ludGVyZXN0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9lbnRyeV9pbnRlcmVzdF9zZWdtZW50CiAgICBmcmFtZV9idXJ5IC0yCiAgICArCiAgICBieXRlYyA2IC8vICJhY2NydWVkX2ludGVyZXN0IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1MQogICAgLy8gaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxMgogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NQogICAgLy8gcGF5bG9hZC5vYnNlcnZlZF9yYXRlLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDMzCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU2CiAgICAvLyBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzNyAvLyAicmF0ZV9yZXNldF9tdWx0aXBsaWVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbXVsdGlwbGllciBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1NwogICAgLy8gc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJmaXhlZF9wb2ludF9zY2FsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY1Mi02NTgKICAgIC8vICMgUlIgZGVyaXZlcyB0aGUgbmV4dCByYXRlIGZyb20gYW4gb2JzZXJ2ZWQgb3JhY2xlIHZhbHVlIHBsdXMgdGhlCiAgICAvLyAjIGNvbnRyYWN0IHNwcmVhZCAvIG11bHRpcGxpZXIgdGVybXMsIHRoZW4gZW5mb3JjZXMgZmxvb3IgYW5kIGNhcC4KICAgIC8vIG9ic2VydmVkX3JhdGUgPSBzZWxmLl9zY2FsZWRfbXVsX2RpdigKICAgIC8vICAgICBwYXlsb2FkLm9ic2VydmVkX3JhdGUsCiAgICAvLyAgICAgc2VsZi5yYXRlX3Jlc2V0X211bHRpcGxpZXIsCiAgICAvLyAgICAgc2VsZi5maXhlZF9wb2ludF9zY2FsZSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjAKICAgIC8vIG9ic2VydmVkX3JhdGUgKyBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzYgLy8gInJhdGVfcmVzZXRfc3ByZWFkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfc3ByZWFkIGV4aXN0cwogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDEKICAgIC8vIGlmIHNlbGYuaGFzX3JhdGVfcmVzZXRfZmxvb3IgYW5kIHJhdGUgPCBzZWxmLnJhdGVfcmVzZXRfZmxvb3I6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzkgLy8gImhhc19yYXRlX3Jlc2V0X2Zsb29yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhhc19yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2Zsb29yIGV4aXN0cwogICAgZnJhbWVfZGlnIDYKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU1CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDIKICAgIC8vIHJhdGUgPSBzZWxmLnJhdGVfcmVzZXRfZmxvb3IKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMSAvLyAicmF0ZV9yZXNldF9mbG9vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDYKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfZmxvb3IgZXhpc3RzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA1NToKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0MwogICAgLy8gaWYgc2VsZi5oYXNfcmF0ZV9yZXNldF9jYXAgYW5kIHJhdGUgPiBzZWxmLnJhdGVfcmVzZXRfY2FwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQwIC8vICJoYXNfcmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaGFzX3JhdGVfcmVzZXRfY2FwIGV4aXN0cwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmF0ZV9yZXNldF9jYXAgZXhpc3RzCiAgICBmcmFtZV9kaWcgNgogICAgPAogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc0NAogICAgLy8gcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9jYXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMiAvLyAicmF0ZV9yZXNldF9jYXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSA2CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYXRlX3Jlc2V0X2NhcCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjU5CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICBieXRlYyA5IC8vICJub21pbmFsX2ludGVyZXN0X3JhdGUiCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NTktNjYxCiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IHNlbGYuX2NsYW1wX3JhdGUoCiAgICAvLyAgICAgb2JzZXJ2ZWRfcmF0ZSArIHNlbGYucmF0ZV9yZXNldF9zcHJlYWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzEKICAgIC8vIGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QSSk6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMjAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY3MgogICAgLy8gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgPSBlbnRyeS5uZXh0X291dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQ5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnl0ZWMgNCAvLyAib3V0c3RhbmRpbmdfcHJpbmNpcGFsIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzMKICAgIC8vIHNlbGYuaW50ZXJlc3RfY2FsY3VsYXRpb25fYmFzZSA9IGVudHJ5Lm5leHRfb3V0c3RhbmRpbmdfcHJpbmNpcGFsCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc4CiAgICAvLyBpZiBzZWxmLl9pc19keW5hbWljX2FubnVpdHkoKToKICAgIGNhbGxzdWIgX2lzX2R5bmFtaWNfYW5udWl0eQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUAyOQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc5CiAgICAvLyBpZiBldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFJGKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA1CiAgICA9PQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MwogICAgLy8gKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICAtCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODQKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgcHVzaGludCAxMDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4My02ODQKICAgIC8vICsgKHNlbGYuc2NoZWR1bGVfZW50cnlfY291bnQgLSBzZWxmLmV2ZW50X2N1cnNvcikKICAgIC8vICogVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9QRVJfRU5UUllfQlVER0VUKQogICAgKgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjgyCiAgICAvLyBVSW50NjQoY3N0Lk9QX1VQX05PTl9DQVNIX0JBU0VfQlVER0VUKQogICAgaW50YyA0IC8vIDE1MDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4Mi02ODQKICAgIC8vIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfQkFTRV9CVURHRVQpCiAgICAvLyArIChzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IC0gc2VsZi5ldmVudF9jdXJzb3IpCiAgICAvLyAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgICsKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY4MC02ODYKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PSgKICAgIC8vICAgICAgICAgVUludDY0KGNzdC5PUF9VUF9OT05fQ0FTSF9CQVNFX0JVREdFVCkKICAgIC8vICAgICAgICAgKyAoc2VsZi5zY2hlZHVsZV9lbnRyeV9jb3VudCAtIHNlbGYuZXZlbnRfY3Vyc29yKQogICAgLy8gICAgICAgICAqIFVJbnQ2NChjc3QuT1BfVVBfTk9OX0NBU0hfUEVSX0VOVFJZX0JVREdFVCkKICAgIC8vICAgICApLAogICAgLy8gKQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDkwCiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLmZpeGVkX3BvaW50X3NjYWxlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZml4ZWRfcG9pbnRfc2NhbGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5maXhlZF9wb2ludF9zY2FsZSBleGlzdHMKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MQogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5MgogICAgLy8gc2tpcF9maXJzdF9yZWRlbXB0aW9uID0gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjQ5NAogICAgLy8gaWYgZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKToKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAyNQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NDk1LTQ5OQogICAgLy8gIyBBbiBpbml0aWFsIFBSRiBtYXkgZGVzY3JpYmUgdGhlIGZpcnN0IHJlZGVtcHRpb24gcGVyaW9kIGRpcmVjdGx5LgogICAgLy8gZGlzY291bnRfZmFjdG9yID0gc2VsZi5fZGlzY291bnRfYW5udWl0eV9mYWN0b3IoCiAgICAvLyAgICAgZGlzY291bnRfZmFjdG9yLAogICAgLy8gICAgIGVudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDgKICAgIGNhbGxzdWIgX2Rpc2NvdW50X2FubnVpdHlfZmFjdG9yCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAxCiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9idXJ5IDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDM1OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTAzCiAgICAvLyBmdXR1cmVfZXZlbnRfaWQgPSBzZWxmLmV2ZW50X2N1cnNvciArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfd2hpbGVfdG9wQDM2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA0CiAgICAvLyB3aGlsZSBmdXR1cmVfZXZlbnRfaWQgPCBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50OgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInNjaGVkdWxlX2VudHJ5X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNjaGVkdWxlX2VudHJ5X2NvdW50IGV4aXN0cwogICAgZnJhbWVfZGlnIDMKICAgID4KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl93aGlsZUA0OAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA1CiAgICAvLyBmdXR1cmVfZW50cnkgPSBzZWxmLl9nZXRfc2NoZWR1bGVfZW50cnkoZnV0dXJlX2V2ZW50X2lkKQogICAgZnJhbWVfZGlnIDMKICAgIGNhbGxzdWIgX2dldF9zY2hlZHVsZV9lbnRyeQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNgogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPSBmdXR1cmVfZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKQogICAgaW50Y18yIC8vIDgKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDctNTA4CiAgICAvLyAjIE9ubHkgcmVkZW1wdGlvbi1iZWFyaW5nIGV2ZW50cyBjb250cmlidXRlIHRvIHRoZSBhbm51aXR5IGRlbm9taW5hdG9yLgogICAgLy8gaXNfcmVkZW1wdGlvbl9ldmVudCA9IGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfUFIpIG9yICgKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUwNy01MTEKICAgIC8vICMgT25seSByZWRlbXB0aW9uLWJlYXJpbmcgZXZlbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGFubnVpdHkgZGVub21pbmF0b3IuCiAgICAvLyBpc19yZWRlbXB0aW9uX2V2ZW50ID0gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9QUikgb3IgKAogICAgLy8gICAgIGZ1dHVyZV9ldmVudF90eXBlID09IFVJbnQ2NChlbnVtcy5FVlRfTUQpCiAgICAvLyAgICAgYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICAvLyApCiAgICBibnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfdHJ1ZUA0MAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5CiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgZnJhbWVfZGlnIDQKICAgIHB1c2hpbnQgMTkKICAgID09CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MDktNTEwCiAgICAvLyBmdXR1cmVfZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX01EKQogICAgLy8gYW5kIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yID4gVUludDY0KDApCiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9mYWxzZUA0MQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEwCiAgICAvLyBhbmQgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IgPiBVSW50NjQoMCkKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDI1CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTA5LTUxMAogICAgLy8gZnV0dXJlX2V2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9NRCkKICAgIC8vIGFuZCBmdXR1cmVfZW50cnkucmVkZW1wdGlvbl9hY2NydWFsX2ZhY3RvciA+IFVJbnQ2NCgwKQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDEKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9ib29sX3RydWVANDA6CiAgICBpbnRjXzEgLy8gMQoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfbWVyZ2VANDI6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTIKICAgIC8vIGlmIGlzX3JlZGVtcHRpb25fZXZlbnQ6CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTEzCiAgICAvLyBpZiBza2lwX2ZpcnN0X3JlZGVtcHRpb246CiAgICBmcmFtZV9kaWcgNwogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Vsc2VfYm9keUA0NQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTE0CiAgICAvLyBza2lwX2ZpcnN0X3JlZGVtcHRpb24gPSBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VANDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjEKICAgIC8vIGZ1dHVyZV9ldmVudF9pZCArPSBVSW50NjQoMSkKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV93aGlsZV90b3BAMzYKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlANDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTgKICAgIC8vIGZ1dHVyZV9lbnRyeS5yZWRlbXB0aW9uX2FjY3J1YWxfZmFjdG9yLAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMjUKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MTYtNTE5CiAgICAvLyBkaXNjb3VudF9mYWN0b3IgPSBzZWxmLl9kaXNjb3VudF9hbm51aXR5X2ZhY3RvcigKICAgIC8vICAgICBkaXNjb3VudF9mYWN0b3IsCiAgICAvLyAgICAgZnV0dXJlX2VudHJ5LnJlZGVtcHRpb25fYWNjcnVhbF9mYWN0b3IsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgY2FsbHN1YiBfZGlzY291bnRfYW5udWl0eV9mYWN0b3IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjAKICAgIC8vIGRlbm9taW5hdG9yICs9IGRpc2NvdW50X2ZhY3RvcgogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYWZ0ZXJfaWZfZWxzZUA0NwoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2Jvb2xfZmFsc2VANDE6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfYm9vbF9tZXJnZUA0MgoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX3doaWxlQDQ4OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTIzCiAgICAvLyBhc3NlcnQgZGVub21pbmF0b3IgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0FDVFVTX0NPTkZJRwogICAgZnJhbWVfZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIEFDVFVTIGNvbmZpZ3VyYXRpb24KICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjUyNAogICAgLy8gbnVtZXJhdG9yID0gc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJvdXRzdGFuZGluZ19wcmluY2lwYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3V0c3RhbmRpbmdfcHJpbmNpcGFsIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI1CiAgICAvLyBpZiBlbnRyeS5mbGFncyAmIFVJbnQ2NChlbnVtcy5GTEFHX0lOSVRJQUxfUFJGKSA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNTcKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzIgLy8gOAogICAgJgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo1MjYtNTI3CiAgICAvLyAjIFN1YnNlcXVlbnQgUFJGIGV2ZW50cyBhbW9ydGl6ZSBib3RoIHByaW5jaXBhbCBhbmQgYWxyZWFkeSBhY2NydWVkIGNhcnJ5LgogICAgLy8gbnVtZXJhdG9yICs9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImFjY3J1ZWRfaW50ZXJlc3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjcnVlZF9pbnRlcmVzdCBleGlzdHMKICAgICsKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTMwCiAgICAvLyBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImZpeGVkX3BvaW50X3NjYWxlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZpeGVkX3BvaW50X3NjYWxlIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NTI4LTUzMgogICAgLy8gcmV0dXJuIHNlbGYuX3NjYWxlZF9tdWxfZGl2KAogICAgLy8gICAgIG51bWVyYXRvciwKICAgIC8vICAgICBzZWxmLmZpeGVkX3BvaW50X3NjYWxlLAogICAgLy8gICAgIGRlbm9taW5hdG9yLAogICAgLy8gKQogICAgZnJhbWVfZGlnIDEKICAgIGNhbGxzdWIgX3NjYWxlZF9tdWxfZGl2CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2ODcKICAgIC8vIHNlbGYubmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiA9IHNlbGYuX3JlY2FsY3VsYXRlX2FubnVpdHlfcGF5bWVudCgKICAgIGJ5dGVjIDE0IC8vICJuZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uIgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njg3LTY4OQogICAgLy8gc2VsZi5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uID0gc2VsZi5fcmVjYWxjdWxhdGVfYW5udWl0eV9wYXltZW50KAogICAgLy8gICAgIGVudHJ5CiAgICAvLyApCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTIKICAgIC8vIHNlbGYuZXZlbnRfY3Vyc29yICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImV2ZW50X2N1cnNvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ldmVudF9jdXJzb3IgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMiAvLyAiZXZlbnRfY3Vyc29yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2OTUKICAgIC8vIHBheW9mZj1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njk2CiAgICAvLyBzZXR0bGVkX2Ftb3VudD1VSW50NjQoMCksCiAgICBkdXAKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY5My02OTcKICAgIC8vIHNlbGYuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIGVudHJ5PWVudHJ5LAogICAgLy8gICAgIHBheW9mZj1VSW50NjQoMCksCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBfZW1pdF9leGVjdXRpb25fZXZlbnQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDI5OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjkxCiAgICAvLyBzZWxmLm5leHRfcHJpbmNpcGFsX3JlZGVtcHRpb24gPSBlbnRyeS5uZXh0X3ByaW5jaXBhbF9yZWRlbXB0aW9uCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBieXRlYyAxNCAvLyAibmV4dF9wcmluY2lwYWxfcmVkZW1wdGlvbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDMwCgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDIwOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6Njc0CiAgICAvLyBlbGlmIGV2ZW50X3R5cGUgPT0gVUludDY0KGVudW1zLkVWVF9JUENCKToKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCAxOAogICAgPT0KICAgIGJ6IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NzUtNjc2CiAgICAvLyAjIElQQ0Iga2VlcHMgcHJpbmNpcGFsIHVuY2hhbmdlZCBhbmQgb25seSByZXNldHMgdGhlIGludGVyZXN0IGJhc2UuCiAgICAvLyBzZWxmLmludGVyZXN0X2NhbGN1bGF0aW9uX2Jhc2UgPSBzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm91dHN0YW5kaW5nX3ByaW5jaXBhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwgZXhpc3RzCiAgICBieXRlYyA3IC8vICJpbnRlcmVzdF9jYWxjdWxhdGlvbl9iYXNlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMjMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9lbHNlX2JvZHlAMTA6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjIKICAgIC8vIGVsaWYgZXZlbnRfdHlwZSA9PSBVSW50NjQoZW51bXMuRVZUX1JSRik6CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMTEKICAgID09CiAgICBieiBfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjMKICAgIC8vIG5leHRfcmF0ZSA9IGVudHJ5Lm5leHRfbm9taW5hbF9pbnRlcmVzdF9yYXRlCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY0CiAgICAvLyBpZiBuZXh0X3JhdGUgPT0gVUludDY0KDApOgogICAgYm56IF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo2NjUKICAgIC8vIG5leHRfcmF0ZSA9IHNlbGYucmF0ZV9yZXNldF9uZXh0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzggLy8gInJhdGVfcmVzZXRfbmV4dCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJhdGVfcmVzZXRfbmV4dCBleGlzdHMKCl9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY2CiAgICAvLyBzZWxmLm5vbWluYWxfaW50ZXJlc3RfcmF0ZSA9IG5leHRfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgpfYXBwbHlfbm9uX2Nhc2hfc2NoZWR1bGVfZW50cnlfZWxzZV9ib2R5QDE0OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NjY4CiAgICAvLyBpZiBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZSAhPSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgYnogX2FwcGx5X25vbl9jYXNoX3NjaGVkdWxlX2VudHJ5X2FmdGVyX2lmX2Vsc2VAMTgKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjY2OQogICAgLy8gc2VsZi5ub21pbmFsX2ludGVyZXN0X3JhdGUgPSBlbnRyeS5uZXh0X25vbWluYWxfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOSAvLyAibm9taW5hbF9pbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9hcHBseV9ub25fY2FzaF9zY2hlZHVsZV9lbnRyeV9hZnRlcl9pZl9lbHNlQDE4CgoKLy8gbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX2VtaXRfZXhlY3V0aW9uX2V2ZW50KGVudHJ5OiBieXRlcywgcGF5b2ZmOiB1aW50NjQsIHNldHRsZWRfYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzOgpfZW1pdF9leGVjdXRpb25fZXZlbnQ6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MDMtNzA5CiAgICAvLyBkZWYgX2VtaXRfZXhlY3V0aW9uX2V2ZW50KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBlbnRyeTogdHlwLkV4ZWN1dGlvblNjaGVkdWxlRW50cnksCiAgICAvLyAgICAgcGF5b2ZmOiBVSW50NjQsCiAgICAvLyAgICAgc2V0dGxlZF9hbW91bnQ6IFVJbnQ2NCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzEzCiAgICAvLyBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE0CiAgICAvLyBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTUKICAgIC8vIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCA4IDEKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcxNgogICAgLy8gc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgOSA4CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTcKICAgIC8vIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjAKICAgIC8vIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIGZyYW1lX2RpZyAtMwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzE1CiAgICAvLyBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBnZXRieXRlCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NDkKICAgIC8vIGlmIHBheW9mZiA9PSBVSW50NjQoMCk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGJueiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTAKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lubGluZWRfbW9kdWxlcy5hY3R1c19rZXJuZWwuQWN0dXNLZXJuZWxNb2R1bGUuX3BheW9mZl9zaWduQDc6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTktNzIxCiAgICAvLyBwYXlvZmZfc2lnbj1hcmM0LlVJbnQ4KAogICAgLy8gICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICksCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MjMKICAgIC8vIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzI0CiAgICAvLyBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3MTItNzI1CiAgICAvLyBFeGVjdXRpb25FdmVudCgKICAgIC8vICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBldmVudF9pZD1lbnRyeS5ldmVudF9pZCwKICAgIC8vICAgICBldmVudF90eXBlPWVudHJ5LmV2ZW50X3R5cGUsCiAgICAvLyAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgYXBwbGllZF9hdD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICAgICBwYXlvZmY9cGF5b2ZmLAogICAgLy8gICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgIHNlbGYuX3BheW9mZl9zaWduKGVudHJ5LmV2ZW50X3R5cGUuYXNfdWludDY0KCksIHBheW9mZikKICAgIC8vICAgICApLAogICAgLy8gICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgIGN1cnJlbmN5X2lkPXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBzZXF1ZW5jZT1lbnRyeS5ldmVudF9pZCArIFVJbnQ2NCgxKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzExLTcyNgogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIEV4ZWN1dGlvbkV2ZW50KAogICAgLy8gICAgICAgICBjb250cmFjdF9pZD1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICAgICAgZXZlbnRfaWQ9ZW50cnkuZXZlbnRfaWQsCiAgICAvLyAgICAgICAgIGV2ZW50X3R5cGU9ZW50cnkuZXZlbnRfdHlwZSwKICAgIC8vICAgICAgICAgc2NoZWR1bGVkX3RpbWU9ZW50cnkuc2NoZWR1bGVkX3RpbWUsCiAgICAvLyAgICAgICAgIGFwcGxpZWRfYXQ9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICAvLyAgICAgICAgIHBheW9mZj1wYXlvZmYsCiAgICAvLyAgICAgICAgIHBheW9mZl9zaWduPWFyYzQuVUludDgoCiAgICAvLyAgICAgICAgICAgICBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICAvLyAgICAgICAgICksCiAgICAvLyAgICAgICAgIHNldHRsZWRfYW1vdW50PXNldHRsZWRfYW1vdW50LAogICAgLy8gICAgICAgICBjdXJyZW5jeV9pZD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgICAgIHNlcXVlbmNlPWVudHJ5LmV2ZW50X2lkICsgVUludDY0KDEpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDlhMzMyYjk1IC8vIG1ldGhvZCAiRXhlY3V0aW9uRXZlbnQodWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5Ojc1MQogICAgLy8gaWYgZXZlbnRfdHlwZSBpbiAoVUludDY0KGVudW1zLkVWVF9JRUQpLCBVSW50NjQoZW51bXMuRVZUX1BJKSk6CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogX2VtaXRfZXhlY3V0aW9uX2V2ZW50X2lmX2JvZHlANQogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGJ6IF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pZl9lbHNlQDYKCl9lbWl0X2V4ZWN1dGlvbl9ldmVudF9pZl9ib2R5QDU6CiAgICAvLyBtb2R1bGVzL2FjdHVzX2tlcm5lbC5weTo3NTIKICAgIC8vIHJldHVybiBVSW50NjQoZW51bXMuUEFZT0ZGX1NJR05fUE9TSVRJVkUpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzIwCiAgICAvLyBzZWxmLl9wYXlvZmZfc2lnbihlbnRyeS5ldmVudF90eXBlLmFzX3VpbnQ2NCgpLCBwYXlvZmYpCiAgICBiIF9lbWl0X2V4ZWN1dGlvbl9ldmVudF9hZnRlcl9pbmxpbmVkX21vZHVsZXMuYWN0dXNfa2VybmVsLkFjdHVzS2VybmVsTW9kdWxlLl9wYXlvZmZfc2lnbkA3CgpfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gbW9kdWxlcy9hY3R1c19rZXJuZWwucHk6NzUzCiAgICAvLyByZXR1cm4gVUludDY0KGVudW1zLlBBWU9GRl9TSUdOX05FR0FUSVZFKQogICAgcHVzaGludCAyNTUKICAgIC8vIG1vZHVsZXMvYWN0dXNfa2VybmVsLnB5OjcyMAogICAgLy8gc2VsZi5fcGF5b2ZmX3NpZ24oZW50cnkuZXZlbnRfdHlwZS5hc191aW50NjQoKSwgcGF5b2ZmKQogICAgYiBfZW1pdF9leGVjdXRpb25fZXZlbnRfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLmFjdHVzX2tlcm5lbC5BY3R1c0tlcm5lbE1vZHVsZS5fcGF5b2ZmX3NpZ25ANwoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9yb2xlX2lzX2FjdGl2ZShyb2xlX21hcDogYnl0ZXMsIHJvbGVfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKX3JvbGVfaXNfYWN0aXZlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU5CiAgICAvLyBkZWYgX3JvbGVfaXNfYWN0aXZlKHNlbGYsIHJvbGVfbWFwOiB0eXAuUmJhY1JvbGUsIHJvbGVfYWRkcmVzczogQWNjb3VudCkgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjIKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYyCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjMKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94TWFwIGVudHJ5IGV4aXN0cwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjItNjMKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgPj0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MS02MwogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NjAtNjQKICAgIC8vIHJldHVybiBzZWxmLl9oYXNfcm9sZShyb2xlX21hcCwgcm9sZV9hZGRyZXNzKSBhbmQgKAogICAgLy8gICAgIHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfcm9sZV9pc19hY3RpdmVfYm9vbF9tZXJnZUA1CgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgpfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NwogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTQKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgPT0gc2VsZi5hcnJhbmdlci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzYTQxNTI1MjIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojg1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMzQgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgpfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9zdXNwZW5kZWQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5jb250cmFjdF9zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAzMyAvLyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvbnRyYWN0X3N1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydF92YWxpZF9yb2xlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkwCiAgICAvLyBkZWYgX2Fzc2VydF92YWxpZF9yb2xlKHNlbGYsIHJvbGVfaWQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjkxLTk5CiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICBwdXNoaW50IDI1CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NgogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NwogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDcKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk4CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICBwdXNoaW50IDgwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTEtOTkKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA4CgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDc6CiAgICBpbnRjXzEgLy8gMQoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5MS05OQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICByZXRzdWIKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9tZXJnZUA5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg=="}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2652], "errorMessage": "ACTUS event not yet executed"}, {"pc": [2410], "errorMessage": "Can not distribute zero units"}, {"pc": [3153, 3160, 3533], "errorMessage": "D-ASA already configured"}, {"pc": [1259, 1991, 2370, 2516, 3750, 3896, 4247, 4478, 4624], "errorMessage": "D-ASA not configured"}, {"pc": [3544], "errorMessage": "D-ASA terms not configured"}, {"pc": [6844], "errorMessage": "Defaulted"}, {"pc": [3171], "errorMessage": "Denomination asset is not properly set"}, {"pc": [3186], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [3422, 3429, 3431], "errorMessage": "IED must be set in the future"}, {"pc": [1277, 2060, 2531, 4265, 6196], "errorMessage": "IED not yet executed"}, {"pc": [2423, 5579], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [2626, 2692], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [1887, 3073, 3091, 3147, 3624, 3660, 4312, 5763, 6041, 6101, 6504], "errorMessage": "Invalid ACTUS configuration"}, {"pc": [2000, 2404, 2587, 2602, 2759, 2832, 2895, 2937, 5391, 5516], "errorMessage": "Invalid account holding address"}, {"pc": [4815, 4839, 4863, 4887, 4911, 4968, 4996, 5018, 5040, 5062, 5272, 5290, 5305, 5320, 5335], "errorMessage": "Invalid account role address"}, {"pc": [3133], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1390, 3771, 4099, 6073], "errorMessage": "Invalid event cursor"}, {"pc": [3609, 3672, 3948, 4289, 5679], "errorMessage": "Invalid event id"}, {"pc": [3784, 4163, 4170, 4302], "errorMessage": "Invalid event type"}, {"pc": [4952, 5262, 6914], "errorMessage": "Invalid role identifier"}, {"pc": [3538, 3684, 3692, 4001, 4376, 5694, 5710], "errorMessage": "Invalid schedule page"}, {"pc": [5627], "errorMessage": "No D-ASA units"}, {"pc": [1396, 1916, 2097, 6082], "errorMessage": "No due cashflow to pay"}, {"pc": [6165], "errorMessage": "Not IED event"}, {"pc": [2045, 2378, 2574, 2749, 2805, 2815, 2901, 4198, 5085, 5116, 6836], "errorMessage": "Not authorized"}, {"pc": [1517, 1525, 2146, 2220, 2229], "errorMessage": "Not enough funds for the payment"}, {"pc": [3921, 3934, 4274], "errorMessage": "Observed event required to execute this action"}, {"pc": [2392, 2440], "errorMessage": "Primary distribution is closed"}, {"pc": [6113], "errorMessage": "Primary distribution is not complete"}, {"pc": [2615], "errorMessage": "Sender and receiver must be different"}, {"pc": [5377, 6852], "errorMessage": "Suspended operations"}, {"pc": [2327, 3650, 4334], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2548, 2565], "errorMessage": "Transfer is closed"}, {"pc": [2619], "errorMessage": "Transfer units must be greater than zero"}, {"pc": [936], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [942], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [946], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [950], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1498, 2139], "errorMessage": "account opted into asset"}, {"pc": [6796, 6811], "errorMessage": "check BoxMap entry exists"}, {"pc": [2036, 2074, 2115, 2153, 2444, 2622, 2681, 2707, 5371, 5537], "errorMessage": "check self.account entry exists"}, {"pc": [1579, 1811, 1899, 4535, 6201, 6524], "errorMessage": "check self.accrued_interest exists"}, {"pc": [5134, 6834], "errorMessage": "check self.arranger exists"}, {"pc": [6850], "errorMessage": "check self.contract_suspended exists"}, {"pc": [3081, 3527, 3917, 3929, 4270, 4483, 5925], "errorMessage": "check self.contract_type exists"}, {"pc": [1547, 4540, 5399, 5477], "errorMessage": "check self.cumulative_interest_index exists"}, {"pc": [1559, 4545, 5410, 5485], "errorMessage": "check self.cumulative_principal_index exists"}, {"pc": [6842], "errorMessage": "check self.defaulted exists"}, {"pc": [5935], "errorMessage": "check self.dynamic_principal_redemption exists"}, {"pc": [1315, 1327, 1388, 1630, 2630, 2642, 3763, 4092, 4511, 4628, 4640, 4677, 5492, 6071, 6153, 6350, 6405, 6543], "errorMessage": "check self.event_cursor exists"}, {"pc": [5425, 5439, 5632, 5661, 5991, 5999, 6026, 6046, 6236, 6369, 6530], "errorMessage": "check self.fixed_point_scale exists"}, {"pc": [6279], "errorMessage": "check self.has_rate_reset_cap exists"}, {"pc": [6252], "errorMessage": "check self.has_rate_reset_floor exists"}, {"pc": [3158, 3543, 4507, 6170], "errorMessage": "check self.initial_exchange_amount exists"}, {"pc": [2428, 2438], "errorMessage": "check self.initial_exchange_date exists"}, {"pc": [1755, 4525, 5967, 5981], "errorMessage": "check self.interest_calculation_base exists"}, {"pc": [1827, 1842], "errorMessage": "check self.next_principal_redemption exists"}, {"pc": [4530, 5959, 5986, 6031], "errorMessage": "check self.nominal_interest_rate exists"}, {"pc": [2005, 2018], "errorMessage": "check self.op_daemon exists"}, {"pc": [1652, 1721, 1747, 1801, 1853, 1862, 1884, 4520, 6509, 6590], "errorMessage": "check self.outstanding_principal exists"}, {"pc": [6287, 6301], "errorMessage": "check self.rate_reset_cap exists"}, {"pc": [6260, 6274], "errorMessage": "check self.rate_reset_floor exists"}, {"pc": [6231], "errorMessage": "check self.rate_reset_multiplier exists"}, {"pc": [6624], "errorMessage": "check self.rate_reset_next exists"}, {"pc": [6244], "errorMessage": "check self.rate_reset_spread exists"}, {"pc": [1503, 2215, 4550], "errorMessage": "check self.reserved_interest exists"}, {"pc": [1508, 1537, 2225, 2240, 4555], "errorMessage": "check self.reserved_principal exists"}, {"pc": [2415, 2463, 4502, 5574, 6106], "errorMessage": "check self.reserved_units_total exists"}, {"pc": [1319, 2634, 3767, 3946, 3963, 4083, 4284, 4319, 4338, 4458, 4515, 4632, 5675, 6346, 6413], "errorMessage": "check self.schedule_entry_count exists"}, {"pc": [3991, 4366], "errorMessage": "check self.schedule_page entry exists"}, {"pc": [1495, 2105, 2133, 6696], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1258, 1272, 1990, 2055, 2369, 2388, 2515, 2526, 2809, 3151, 3531, 3749, 3895, 4246, 4260, 4476, 4623, 5520, 6097, 6191], "errorMessage": "check self.status exists"}, {"pc": [2421, 2474, 4497, 5625, 5656, 6111], "errorMessage": "check self.total_units exists"}, {"pc": [2553, 2563], "errorMessage": "check self.transfer_closure_date exists"}, {"pc": [2536, 2544], "errorMessage": "check self.transfer_opening_date exists"}, {"pc": [3586, 3643], "errorMessage": "index access is out of bounds"}, {"pc": [1974, 3018, 3501, 3996, 4371], "errorMessage": "invalid array length header"}, {"pc": [2739, 3489, 5075, 5106], "errorMessage": "invalid number of bytes for arc4.bool"}, {"pc": [1982], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [3516], "errorMessage": "invalid number of bytes for arc4.dynamic_array"}, {"pc": [1968, 2353, 2493, 2501, 2731, 2789, 2797, 2877, 2885, 2928, 2953, 4696, 4720, 4754, 4935, 5148, 5232], "errorMessage": "invalid number of bytes for arc4.static_array"}, {"pc": [1253, 2311, 2320, 2361, 2510, 3479, 3880], "errorMessage": "invalid number of bytes for arc4.uint64"}, {"pc": [4744, 4925, 5222], "errorMessage": "invalid number of bytes for arc4.uint8"}, {"pc": [2990], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.InitialKernelState"}, {"pc": [2979], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.NormalizedActusTerms"}, {"pc": [4242], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedCashEventRequest"}, {"pc": [3891], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.ObservedEventRequest"}, {"pc": [3023], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.Prospectus"}, {"pc": [4765], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity"}, {"pc": [3007], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+utf8[]))"}, {"pc": [3002], "errorMessage": "invalid tuple encoding"}, {"pc": [4063, 4438], "errorMessage": "max array length exceeded"}, {"pc": [4489, 6688], "errorMessage": "overflow"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" +APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) + +def _parse_abi_args(args: object | None = None) -> list[object] | None: + """Helper to parse ABI args into the format expected by underlying client""" + if args is None: + return None + + def convert_dataclass(value: object) -> object: + if dataclasses.is_dataclass(value): + return tuple(convert_dataclass(getattr(value, field.name)) for field in dataclasses.fields(value)) + elif isinstance(value, (list, tuple)): + return type(value)(convert_dataclass(item) for item in value) + return value + + match args: + case tuple(): + method_args = list(args) + case _ if dataclasses.is_dataclass(args): + method_args = [getattr(args, field.name) for field in dataclasses.fields(args)] + case _: + raise ValueError("Invalid 'args' type. Expected 'tuple' or 'TypedDict' for respective typed arguments.") + + return [ + convert_dataclass(arg) if not isinstance(arg, algokit_utils.AppMethodCallTransactionArgument) else arg + for arg in method_args + ] if method_args else None + +def _init_dataclass(cls: type, data: dict) -> object: + """ + Recursively instantiate a dataclass of type `cls` from `data`. + + For each field on the dataclass, if the field type is also a dataclass + and the corresponding data is a dict, instantiate that field recursively. + """ + field_values = {} + for field in dataclasses.fields(cls): + field_value = data.get(field.name) + # Check if the field expects another dataclass and the value is a dict. + if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict): + field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value) + else: + field_values[field.name] = field_value + return cls(**field_values) + +@dataclasses.dataclass(frozen=True) +class AccountPosition: + """Struct for AccountPosition""" + payment_address: str + units: int + reserved_units: int + suspended: bool + settled_cursor: int + interest_checkpoint: int + principal_checkpoint: int + claimable_interest: int + claimable_principal: int + +@dataclasses.dataclass(frozen=True) +class CashClaimResult: + """Struct for CashClaimResult""" + interest_amount: int + principal_amount: int + total_amount: int + timestamp: int + context: bytes + +@dataclasses.dataclass(frozen=True) +class CashFundingResult: + """Struct for CashFundingResult""" + funded_interest: int + funded_principal: int + total_funded: int + processed_events: int + timestamp: int + +@dataclasses.dataclass(frozen=True) +class ExecutionScheduleEntry: + """Struct for ExecutionScheduleEntry""" + event_id: int + event_type: int + scheduled_time: int + accrual_factor: int + redemption_accrual_factor: int + next_nominal_interest_rate: int + next_principal_redemption: int + next_outstanding_principal: int + flags: int + +@dataclasses.dataclass(frozen=True) +class InitialKernelState: + """Struct for InitialKernelState""" + status_date: int + event_cursor: int + outstanding_principal: int + interest_calculation_base: int + nominal_interest_rate: int + accrued_interest: int + next_principal_redemption: int + cumulative_interest_index: int + cumulative_principal_index: int + +@dataclasses.dataclass(frozen=True) +class KernelState: + """Struct for KernelState""" + contract_type: int + status: int + total_units: int + reserved_units_total: int + initial_exchange_amount: int + event_cursor: int + schedule_entry_count: int + outstanding_principal: int + interest_calculation_base: int + nominal_interest_rate: int + accrued_interest: int + cumulative_interest_index: int + cumulative_principal_index: int + reserved_interest: int + reserved_principal: int + +@dataclasses.dataclass(frozen=True) +class NormalizedActusTerms: + """Struct for NormalizedActusTerms""" + contract_type: int + denomination_asset_id: int + settlement_asset_id: int + total_units: int + notional_principal: int + initial_exchange_amount: int + initial_exchange_date: int + maturity_date: int + day_count_convention: int + rate_reset_spread: int + rate_reset_multiplier: int + rate_reset_floor: int + rate_reset_cap: int + rate_reset_next: int + has_rate_reset_floor: bool + has_rate_reset_cap: bool + dynamic_principal_redemption: bool + fixed_point_scale: int + +@dataclasses.dataclass(frozen=True) +class ObservedCashEventRequest: + """Struct for ObservedCashEventRequest""" + event_id: int + event_type: int + scheduled_time: int + accrual_factor: int + redemption_accrual_factor: int + next_nominal_interest_rate: int + next_principal_redemption: int + next_outstanding_principal: int + flags: int + +@dataclasses.dataclass(frozen=True) +class ObservedEventRequest: + """Struct for ObservedEventRequest""" + event_id: int + event_type: int + scheduled_time: int + accrual_factor: int + redemption_accrual_factor: int + observed_rate: int + next_nominal_interest_rate: int + next_principal_redemption: int + next_outstanding_principal: int + flags: int + +@dataclasses.dataclass(frozen=True) +class Prospectus: + """Struct for Prospectus""" + hash: bytes + url: str + +@dataclasses.dataclass(frozen=True) +class RoleValidity: + """Struct for RoleValidity""" + role_validity_start: int + role_validity_end: int + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class FundDueCashflowsArgs: + """Dataclass for fund_due_cashflows arguments""" + max_event_count: int + + @property + def abi_method_signature(self) -> str: + return "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class ClaimDueCashflowsArgs: + """Dataclass for claim_due_cashflows arguments""" + holding_address: str + payment_info: bytes | str + + @property + def abi_method_signature(self) -> str: + return "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class TransferSetScheduleArgs: + """Dataclass for transfer_set_schedule arguments""" + open_date: int + closure_date: int + + @property + def abi_method_signature(self) -> str: + return "transfer_set_schedule(uint64,uint64)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class PrimaryDistributionArgs: + """Dataclass for primary_distribution arguments""" + holding_address: str + units: int + + @property + def abi_method_signature(self) -> str: + return "primary_distribution(address,uint64)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class TransferArgs: + """Dataclass for transfer arguments""" + sender_holding_address: str + receiver_holding_address: str + units: int + + @property + def abi_method_signature(self) -> str: + return "transfer(address,address,uint64)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class AccountSuspensionArgs: + """Dataclass for account_suspension arguments""" + holding_address: str + suspended: bool + + @property + def abi_method_signature(self) -> str: + return "account_suspension(address,bool)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class AccountOpenArgs: + """Dataclass for account_open arguments""" + holding_address: str + payment_address: str + + @property + def abi_method_signature(self) -> str: + return "account_open(address,address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class AccountUpdatePaymentAddressArgs: + """Dataclass for account_update_payment_address arguments""" + holding_address: str + payment_address: str + + @property + def abi_method_signature(self) -> str: + return "account_update_payment_address(address,address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class AccountGetPositionArgs: + """Dataclass for account_get_position arguments""" + holding_address: str + + @property + def abi_method_signature(self) -> str: + return "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class ContractConfigArgs: + """Dataclass for contract_config arguments""" + terms: NormalizedActusTerms + initial_state: InitialKernelState + prospectus: Prospectus + + @property + def abi_method_signature(self) -> str: + return "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class ContractScheduleArgs: + """Dataclass for contract_schedule arguments""" + schedule_page_index: int + is_last_page: bool + schedule_page: list[tuple[int, int, int, int, int, int, int, int, int]] + + @property + def abi_method_signature(self) -> str: + return "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class ApplyNonCashEventArgs: + """Dataclass for apply_non_cash_event arguments""" + event_id: int + payload: ObservedEventRequest + + @property + def abi_method_signature(self) -> str: + return "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class AppendObservedCashEventArgs: + """Dataclass for append_observed_cash_event arguments""" + payload: ObservedCashEventRequest + + @property + def abi_method_signature(self) -> str: + return "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacRotateArrangerArgs: + """Dataclass for rbac_rotate_arranger arguments""" + new_arranger: str + + @property + def abi_method_signature(self) -> str: + return "rbac_rotate_arranger(address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacSetOpDaemonArgs: + """Dataclass for rbac_set_op_daemon arguments""" + address: str + + @property + def abi_method_signature(self) -> str: + return "rbac_set_op_daemon(address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacAssignRoleArgs: + """Dataclass for rbac_assign_role arguments""" + role_id: int + role_address: str + validity: RoleValidity + + @property + def abi_method_signature(self) -> str: + return "rbac_assign_role(uint8,address,(uint64,uint64))uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacRevokeRoleArgs: + """Dataclass for rbac_revoke_role arguments""" + role_id: int + role_address: str + + @property + def abi_method_signature(self) -> str: + return "rbac_revoke_role(uint8,address)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacContractSuspensionArgs: + """Dataclass for rbac_contract_suspension arguments""" + suspended: bool + + @property + def abi_method_signature(self) -> str: + return "rbac_contract_suspension(bool)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacContractDefaultArgs: + """Dataclass for rbac_contract_default arguments""" + defaulted: bool + + @property + def abi_method_signature(self) -> str: + return "rbac_contract_default(bool)uint64" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacGetAddressRolesArgs: + """Dataclass for rbac_get_address_roles arguments""" + address: str + + @property + def abi_method_signature(self) -> str: + return "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class RbacGetRoleValidityArgs: + """Dataclass for rbac_get_role_validity arguments""" + role_id: int + role_address: str + + @property + def abi_method_signature(self) -> str: + return "rbac_get_role_validity(uint8,address)(uint64,uint64)" + +@dataclasses.dataclass(frozen=True, kw_only=True) +class ContractCreateArgs: + """Dataclass for contract_create arguments""" + arranger: str + + @property + def abi_method_signature(self) -> str: + return "contract_create(address)uint64" + + +class _DasaUpdate: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppUpdateMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() + return self.app_client.params.update(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_update()void", + })) + + +class DasaParams: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + @property + def update(self) -> "_DasaUpdate": + return _DasaUpdate(self.app_client) + + def fund_due_cashflows( + self, + args: tuple[int] | FundDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", + "args": method_args, + })) + + def claim_due_cashflows( + self, + args: tuple[str, bytes | str] | ClaimDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", + "args": method_args, + })) + + def transfer_set_schedule( + self, + args: tuple[int, int] | TransferSetScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "transfer_set_schedule(uint64,uint64)uint64", + "args": method_args, + })) + + def primary_distribution( + self, + args: tuple[str, int] | PrimaryDistributionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "primary_distribution(address,uint64)uint64", + "args": method_args, + })) + + def transfer( + self, + args: tuple[str, str, int] | TransferArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "transfer(address,address,uint64)uint64", + "args": method_args, + })) + + def account_suspension( + self, + args: tuple[str, bool] | AccountSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_suspension(address,bool)uint64", + "args": method_args, + })) + + def account_open( + self, + args: tuple[str, str] | AccountOpenArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_open(address,address)uint64", + "args": method_args, + })) + + def account_update_payment_address( + self, + args: tuple[str, str] | AccountUpdatePaymentAddressArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_update_payment_address(address,address)uint64", + "args": method_args, + })) + + def account_get_position( + self, + args: tuple[str] | AccountGetPositionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", + "args": method_args, + })) + + def contract_config( + self, + args: tuple[NormalizedActusTerms, InitialKernelState, Prospectus] | ContractConfigArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", + "args": method_args, + })) + + def contract_schedule( + self, + args: tuple[int, bool, list[tuple[int, int, int, int, int, int, int, int, int]]] | ContractScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", + "args": method_args, + })) + + def contract_execute_ied( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_execute_ied()uint64", + })) + + def apply_non_cash_event( + self, + args: tuple[int, ObservedEventRequest] | ApplyNonCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": method_args, + })) + + def append_observed_cash_event( + self, + args: tuple[ObservedCashEventRequest] | AppendObservedCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": method_args, + })) + + def contract_get_state( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + })) + + def contract_get_next_due_event( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + })) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_rotate_arranger(address)uint64", + "args": method_args, + })) + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_set_op_daemon(address)uint64", + "args": method_args, + })) + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", + "args": method_args, + })) + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_revoke_role(uint8,address)uint64", + "args": method_args, + })) + + def rbac_contract_suspension( + self, + args: tuple[bool] | RbacContractSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_suspension(bool)uint64", + "args": method_args, + })) + + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", + "args": method_args, + })) + + def rbac_get_arranger( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_arranger()address", + })) + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", + "args": method_args, + })) + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", + "args": method_args, + })) + + def contract_create( + self, + args: tuple[str] | ContractCreateArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.AppCallMethodCallParams: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.params.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_create(address)uint64", + "args": method_args, + })) + + def clear_state( + self, + params: algokit_utils.AppClientBareCallParams | None = None, + + ) -> algokit_utils.AppCallParams: + return self.app_client.params.bare.clear_state( + params, + + ) + + +class _DasaUpdateTransaction: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() + return self.app_client.create_transaction.update(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_update()void", + })) + + +class DasaCreateTransactionParams: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + @property + def update(self) -> "_DasaUpdateTransaction": + return _DasaUpdateTransaction(self.app_client) + + def fund_due_cashflows( + self, + args: tuple[int] | FundDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", + "args": method_args, + })) + + def claim_due_cashflows( + self, + args: tuple[str, bytes | str] | ClaimDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", + "args": method_args, + })) + + def transfer_set_schedule( + self, + args: tuple[int, int] | TransferSetScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "transfer_set_schedule(uint64,uint64)uint64", + "args": method_args, + })) + + def primary_distribution( + self, + args: tuple[str, int] | PrimaryDistributionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "primary_distribution(address,uint64)uint64", + "args": method_args, + })) + + def transfer( + self, + args: tuple[str, str, int] | TransferArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "transfer(address,address,uint64)uint64", + "args": method_args, + })) + + def account_suspension( + self, + args: tuple[str, bool] | AccountSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_suspension(address,bool)uint64", + "args": method_args, + })) + + def account_open( + self, + args: tuple[str, str] | AccountOpenArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_open(address,address)uint64", + "args": method_args, + })) + + def account_update_payment_address( + self, + args: tuple[str, str] | AccountUpdatePaymentAddressArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_update_payment_address(address,address)uint64", + "args": method_args, + })) + + def account_get_position( + self, + args: tuple[str] | AccountGetPositionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", + "args": method_args, + })) + + def contract_config( + self, + args: tuple[NormalizedActusTerms, InitialKernelState, Prospectus] | ContractConfigArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", + "args": method_args, + })) + + def contract_schedule( + self, + args: tuple[int, bool, list[tuple[int, int, int, int, int, int, int, int, int]]] | ContractScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", + "args": method_args, + })) + + def contract_execute_ied( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_execute_ied()uint64", + })) + + def apply_non_cash_event( + self, + args: tuple[int, ObservedEventRequest] | ApplyNonCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": method_args, + })) + + def append_observed_cash_event( + self, + args: tuple[ObservedCashEventRequest] | AppendObservedCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": method_args, + })) + + def contract_get_state( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + })) + + def contract_get_next_due_event( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + })) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_rotate_arranger(address)uint64", + "args": method_args, + })) + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_set_op_daemon(address)uint64", + "args": method_args, + })) + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", + "args": method_args, + })) + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_revoke_role(uint8,address)uint64", + "args": method_args, + })) + + def rbac_contract_suspension( + self, + args: tuple[bool] | RbacContractSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_suspension(bool)uint64", + "args": method_args, + })) + + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", + "args": method_args, + })) + + def rbac_get_arranger( + self, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_arranger()address", + })) + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", + "args": method_args, + })) + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", + "args": method_args, + })) + + def contract_create( + self, + args: tuple[str] | ContractCreateArgs, + params: algokit_utils.CommonAppCallParams | None = None + ) -> algokit_utils.BuiltTransactions: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + return self.app_client.create_transaction.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_create(address)uint64", + "args": method_args, + })) + + def clear_state( + self, + params: algokit_utils.AppClientBareCallParams | None = None, + + ) -> Transaction: + return self.app_client.create_transaction.bare.clear_state( + params, + + ) + + +class _DasaUpdateSend: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.SendAppTransactionResult[None]: + + params = params or algokit_utils.CommonAppCallParams() + compilation_params = compilation_params or algokit_utils.AppClientCompilationParams() + response = self.app_client.send.update(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_update()void", + }), send_params=send_params, compilation_params=compilation_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppUpdateTransactionResult[None], parsed_response) + + +class DasaSend: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + @property + def update(self) -> "_DasaUpdateSend": + return _DasaUpdateSend(self.app_client) + + def fund_due_cashflows( + self, + args: tuple[int] | FundDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[CashFundingResult]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", + "args": method_args, + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CashFundingResult, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[CashFundingResult], parsed_response) + + def claim_due_cashflows( + self, + args: tuple[str, bytes | str] | ClaimDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[CashClaimResult]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", + "args": method_args, + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(CashClaimResult, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[CashClaimResult], parsed_response) + + def transfer_set_schedule( + self, + args: tuple[int, int] | TransferSetScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "transfer_set_schedule(uint64,uint64)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def primary_distribution( + self, + args: tuple[str, int] | PrimaryDistributionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "primary_distribution(address,uint64)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def transfer( + self, + args: tuple[str, str, int] | TransferArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "transfer(address,address,uint64)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def account_suspension( + self, + args: tuple[str, bool] | AccountSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_suspension(address,bool)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def account_open( + self, + args: tuple[str, str] | AccountOpenArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_open(address,address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def account_update_payment_address( + self, + args: tuple[str, str] | AccountUpdatePaymentAddressArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_update_payment_address(address,address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def account_get_position( + self, + args: tuple[str] | AccountGetPositionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[AccountPosition]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", + "args": method_args, + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(AccountPosition, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[AccountPosition], parsed_response) + + def contract_config( + self, + args: tuple[NormalizedActusTerms, InitialKernelState, Prospectus] | ContractConfigArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def contract_schedule( + self, + args: tuple[int, bool, list[tuple[int, int, int, int, int, int, int, int, int]]] | ContractScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def contract_execute_ied( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_execute_ied()uint64", + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def apply_non_cash_event( + self, + args: tuple[int, ObservedEventRequest] | ApplyNonCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def append_observed_cash_event( + self, + args: tuple[ObservedCashEventRequest] | AppendObservedCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def contract_get_state( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[KernelState]: + + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(KernelState, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[KernelState], parsed_response) + + def contract_get_next_due_event( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[ExecutionScheduleEntry]: + + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(ExecutionScheduleEntry, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[ExecutionScheduleEntry], parsed_response) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_rotate_arranger(address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_set_op_daemon(address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_revoke_role(uint8,address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_contract_suspension( + self, + args: tuple[bool] | RbacContractSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_suspension(bool)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def rbac_get_arranger( + self, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[str]: + + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_arranger()address", + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[str], parsed_response) + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[tuple[bool, bool, bool, bool, bool]], parsed_response) + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[RoleValidity]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", + "args": method_args, + }), send_params=send_params) + parsed_response = dataclasses.replace(response, abi_return=_init_dataclass(RoleValidity, typing.cast(dict, response.abi_return))) # type: ignore + return typing.cast(algokit_utils.SendAppTransactionResult[RoleValidity], parsed_response) + + def contract_create( + self, + args: tuple[str] | ContractCreateArgs, + params: algokit_utils.CommonAppCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[int]: + method_args = _parse_abi_args(args) + params = params or algokit_utils.CommonAppCallParams() + response = self.app_client.send.call(algokit_utils.AppClientMethodCallParams(**{ + **dataclasses.asdict(params), + "method": "contract_create(address)uint64", + "args": method_args, + }), send_params=send_params) + parsed_response = response + return typing.cast(algokit_utils.SendAppTransactionResult[int], parsed_response) + + def clear_state( + self, + params: algokit_utils.AppClientBareCallParams | None = None, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAppTransactionResult[algokit_utils.ABIReturn]: + return self.app_client.send.bare.clear_state( + params, + send_params=send_params, + ) + + +class GlobalStateValue(typing.TypedDict): + """Shape of global_state state key values""" + arranger: str + op_daemon: str + contract_suspended: int + defaulted: int + status: int + contract_type: int + prospectus_hash: bytes + prospectus_url: str + denomination_asset_id: int + settlement_asset_id: int + initial_exchange_date: int + maturity_date: int + transfer_opening_date: int + transfer_closure_date: int + day_count_convention: int + total_units: int + reserved_units_total: int + initial_exchange_amount: int + outstanding_principal: int + next_principal_redemption: int + dynamic_principal_redemption: int + interest_calculation_base: int + accrued_interest: int + nominal_interest_rate: int + rate_reset_spread: int + rate_reset_multiplier: int + rate_reset_floor: int + rate_reset_cap: int + rate_reset_next: int + has_rate_reset_floor: int + has_rate_reset_cap: int + reserved_principal: int + reserved_interest: int + cumulative_interest_index: int + cumulative_principal_index: int + event_cursor: int + schedule_entry_count: int + fixed_point_scale: int + +class DasaState: + """Methods to access state for the current DASA app""" + + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + @property + def global_state( + self + ) -> "_GlobalState": + """Methods to access global_state for the current app""" + return _GlobalState(self.app_client) + + @property + def box( + self + ) -> "_BoxState": + """Methods to access box for the current app""" + return _BoxState(self.app_client) + +class _GlobalState: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + # Pre-generated mapping of value types to their struct classes + self._struct_classes: dict[str, typing.Type[typing.Any]] = {} + + def get_all(self) -> GlobalStateValue: + """Get all current keyed values from global_state state""" + result = self.app_client.state.global_state.get_all() + if not result: + return typing.cast(GlobalStateValue, {}) + + converted = {} + for key, value in result.items(): + key_info = self.app_client.app_spec.state.keys.global_state.get(key) + struct_class = self._struct_classes.get(key_info.value_type) if key_info else None + converted[key] = ( + _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) + else value + ) + return typing.cast(GlobalStateValue, converted) + + @property + def arranger(self) -> str: + """Get the current value of the arranger key in global_state state""" + value = self.app_client.state.global_state.get_value("arranger") + if isinstance(value, dict) and "address" in self._struct_classes: + return _init_dataclass(self._struct_classes["address"], value) # type: ignore + return typing.cast(str, value) + + @property + def op_daemon(self) -> str: + """Get the current value of the op_daemon key in global_state state""" + value = self.app_client.state.global_state.get_value("op_daemon") + if isinstance(value, dict) and "address" in self._struct_classes: + return _init_dataclass(self._struct_classes["address"], value) # type: ignore + return typing.cast(str, value) + + @property + def contract_suspended(self) -> int: + """Get the current value of the contract_suspended key in global_state state""" + value = self.app_client.state.global_state.get_value("contract_suspended") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def defaulted(self) -> int: + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def status(self) -> int: + """Get the current value of the status key in global_state state""" + value = self.app_client.state.global_state.get_value("status") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def contract_type(self) -> int: + """Get the current value of the contract_type key in global_state state""" + value = self.app_client.state.global_state.get_value("contract_type") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def prospectus_hash(self) -> bytes: + """Get the current value of the prospectus_hash key in global_state state""" + value = self.app_client.state.global_state.get_value("prospectus_hash") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMBytes"], value) # type: ignore + return typing.cast(bytes, value) + + @property + def prospectus_url(self) -> str: + """Get the current value of the prospectus_url key in global_state state""" + value = self.app_client.state.global_state.get_value("prospectus_url") + if isinstance(value, dict) and "AVMString" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMString"], value) # type: ignore + return typing.cast(str, value) + + @property + def denomination_asset_id(self) -> int: + """Get the current value of the denomination_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("denomination_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def settlement_asset_id(self) -> int: + """Get the current value of the settlement_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("settlement_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def initial_exchange_date(self) -> int: + """Get the current value of the initial_exchange_date key in global_state state""" + value = self.app_client.state.global_state.get_value("initial_exchange_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def maturity_date(self) -> int: + """Get the current value of the maturity_date key in global_state state""" + value = self.app_client.state.global_state.get_value("maturity_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def transfer_opening_date(self) -> int: + """Get the current value of the transfer_opening_date key in global_state state""" + value = self.app_client.state.global_state.get_value("transfer_opening_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def transfer_closure_date(self) -> int: + """Get the current value of the transfer_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("transfer_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def day_count_convention(self) -> int: + """Get the current value of the day_count_convention key in global_state state""" + value = self.app_client.state.global_state.get_value("day_count_convention") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def total_units(self) -> int: + """Get the current value of the total_units key in global_state state""" + value = self.app_client.state.global_state.get_value("total_units") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def reserved_units_total(self) -> int: + """Get the current value of the reserved_units_total key in global_state state""" + value = self.app_client.state.global_state.get_value("reserved_units_total") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def initial_exchange_amount(self) -> int: + """Get the current value of the initial_exchange_amount key in global_state state""" + value = self.app_client.state.global_state.get_value("initial_exchange_amount") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def outstanding_principal(self) -> int: + """Get the current value of the outstanding_principal key in global_state state""" + value = self.app_client.state.global_state.get_value("outstanding_principal") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def next_principal_redemption(self) -> int: + """Get the current value of the next_principal_redemption key in global_state state""" + value = self.app_client.state.global_state.get_value("next_principal_redemption") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def dynamic_principal_redemption(self) -> int: + """Get the current value of the dynamic_principal_redemption key in global_state state""" + value = self.app_client.state.global_state.get_value("dynamic_principal_redemption") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def interest_calculation_base(self) -> int: + """Get the current value of the interest_calculation_base key in global_state state""" + value = self.app_client.state.global_state.get_value("interest_calculation_base") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def accrued_interest(self) -> int: + """Get the current value of the accrued_interest key in global_state state""" + value = self.app_client.state.global_state.get_value("accrued_interest") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def nominal_interest_rate(self) -> int: + """Get the current value of the nominal_interest_rate key in global_state state""" + value = self.app_client.state.global_state.get_value("nominal_interest_rate") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def rate_reset_spread(self) -> int: + """Get the current value of the rate_reset_spread key in global_state state""" + value = self.app_client.state.global_state.get_value("rate_reset_spread") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def rate_reset_multiplier(self) -> int: + """Get the current value of the rate_reset_multiplier key in global_state state""" + value = self.app_client.state.global_state.get_value("rate_reset_multiplier") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def rate_reset_floor(self) -> int: + """Get the current value of the rate_reset_floor key in global_state state""" + value = self.app_client.state.global_state.get_value("rate_reset_floor") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def rate_reset_cap(self) -> int: + """Get the current value of the rate_reset_cap key in global_state state""" + value = self.app_client.state.global_state.get_value("rate_reset_cap") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def rate_reset_next(self) -> int: + """Get the current value of the rate_reset_next key in global_state state""" + value = self.app_client.state.global_state.get_value("rate_reset_next") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def has_rate_reset_floor(self) -> int: + """Get the current value of the has_rate_reset_floor key in global_state state""" + value = self.app_client.state.global_state.get_value("has_rate_reset_floor") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def has_rate_reset_cap(self) -> int: + """Get the current value of the has_rate_reset_cap key in global_state state""" + value = self.app_client.state.global_state.get_value("has_rate_reset_cap") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def reserved_principal(self) -> int: + """Get the current value of the reserved_principal key in global_state state""" + value = self.app_client.state.global_state.get_value("reserved_principal") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def reserved_interest(self) -> int: + """Get the current value of the reserved_interest key in global_state state""" + value = self.app_client.state.global_state.get_value("reserved_interest") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def cumulative_interest_index(self) -> int: + """Get the current value of the cumulative_interest_index key in global_state state""" + value = self.app_client.state.global_state.get_value("cumulative_interest_index") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def cumulative_principal_index(self) -> int: + """Get the current value of the cumulative_principal_index key in global_state state""" + value = self.app_client.state.global_state.get_value("cumulative_principal_index") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def event_cursor(self) -> int: + """Get the current value of the event_cursor key in global_state state""" + value = self.app_client.state.global_state.get_value("event_cursor") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def schedule_entry_count(self) -> int: + """Get the current value of the schedule_entry_count key in global_state state""" + value = self.app_client.state.global_state.get_value("schedule_entry_count") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + + @property + def fixed_point_scale(self) -> int: + """Get the current value of the fixed_point_scale key in global_state state""" + value = self.app_client.state.global_state.get_value("fixed_point_scale") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return _init_dataclass(self._struct_classes["AVMUint64"], value) # type: ignore + return typing.cast(int, value) + +class _BoxState: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + # Pre-generated mapping of value types to their struct classes + self._struct_classes: dict[str, typing.Type[typing.Any]] = { + "RoleValidity": RoleValidity, + "AccountPosition": AccountPosition + } + + def get_all(self) -> dict[str, typing.Any]: + """Get all current keyed values from box state""" + result = self.app_client.state.box.get_all() + if not result: + return {} + + converted = {} + for key, value in result.items(): + key_info = self.app_client.app_spec.state.keys.box.get(key) + struct_class = self._struct_classes.get(key_info.value_type) if key_info else None + converted[key] = ( + _init_dataclass(struct_class, value) if struct_class and isinstance(value, dict) + else value + ) + return converted + + @property + def account_manager(self) -> "_MapState[str, RoleValidity]": + """Get values from the account_manager map in box state""" + return _MapState( + self.app_client.state.box, + "account_manager", + self._struct_classes.get("RoleValidity") + ) + + @property + def primary_dealer(self) -> "_MapState[str, RoleValidity]": + """Get values from the primary_dealer map in box state""" + return _MapState( + self.app_client.state.box, + "primary_dealer", + self._struct_classes.get("RoleValidity") + ) + + @property + def trustee(self) -> "_MapState[str, RoleValidity]": + """Get values from the trustee map in box state""" + return _MapState( + self.app_client.state.box, + "trustee", + self._struct_classes.get("RoleValidity") + ) + + @property + def authority(self) -> "_MapState[str, RoleValidity]": + """Get values from the authority map in box state""" + return _MapState( + self.app_client.state.box, + "authority", + self._struct_classes.get("RoleValidity") + ) + + @property + def observer(self) -> "_MapState[str, RoleValidity]": + """Get values from the observer map in box state""" + return _MapState( + self.app_client.state.box, + "observer", + self._struct_classes.get("RoleValidity") + ) + + @property + def schedule_page(self) -> "_MapState[int, list[tuple[int, int, int, int, int, int, int, int, int]]]": + """Get values from the schedule_page map in box state""" + return _MapState( + self.app_client.state.box, + "schedule_page", + None + ) + + @property + def account(self) -> "_MapState[str, AccountPosition]": + """Get values from the account map in box state""" + return _MapState( + self.app_client.state.box, + "account", + self._struct_classes.get("AccountPosition") + ) + +_KeyType = typing.TypeVar("_KeyType") +_ValueType = typing.TypeVar("_ValueType") + +class _AppClientStateMethodsProtocol(typing.Protocol): + def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: + ... + def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: + ... + +class _MapState(typing.Generic[_KeyType, _ValueType]): + """Generic class for accessing state maps with strongly typed keys and values""" + + def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, + struct_class: typing.Type[_ValueType] | None = None): + self._state_accessor = state_accessor + self._map_name = map_name + self._struct_class = struct_class + + def get_map(self) -> dict[_KeyType, _ValueType]: + """Get all current values in the map""" + result = self._state_accessor.get_map(self._map_name) + if self._struct_class and result: + return {k: _init_dataclass(self._struct_class, v) if isinstance(v, dict) else v + for k, v in result.items()} # type: ignore + return typing.cast(dict[_KeyType, _ValueType], result or {}) + + def get_value(self, key: _KeyType) -> _ValueType | None: + """Get a value from the map by key""" + key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore + value = self._state_accessor.get_map_value(self._map_name, key_value) + if value is not None and self._struct_class and isinstance(value, dict): + return _init_dataclass(self._struct_class, value) # type: ignore + return typing.cast(_ValueType | None, value) + + +class DasaClient: + """Client for interacting with DASA smart contract""" + + @typing.overload + def __init__(self, app_client: algokit_utils.AppClient) -> None: ... + + @typing.overload + def __init__( + self, + *, + algorand: _AlgoKitAlgorandClient, + app_id: int, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> None: ... + + def __init__( + self, + app_client: algokit_utils.AppClient | None = None, + *, + algorand: _AlgoKitAlgorandClient | None = None, + app_id: int | None = None, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> None: + if app_client: + self.app_client = app_client + elif algorand and app_id: + self.app_client = algokit_utils.AppClient( + algokit_utils.AppClientParams( + algorand=algorand, + app_spec=APP_SPEC, + app_id=app_id, + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + approval_source_map=approval_source_map, + clear_source_map=clear_source_map, + ) + ) + else: + raise ValueError("Either app_client or algorand and app_id must be provided") + + self.params = DasaParams(self.app_client) + self.create_transaction = DasaCreateTransactionParams(self.app_client) + self.send = DasaSend(self.app_client) + self.state = DasaState(self.app_client) + + @staticmethod + def from_creator_and_name( + creator_address: str, + app_name: str, + algorand: _AlgoKitAlgorandClient, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ignore_cache: bool | None = None, + app_lookup_cache: algokit_utils.ApplicationLookup | None = None, + ) -> "DasaClient": + return DasaClient( + algokit_utils.AppClient.from_creator_and_name( + creator_address=creator_address, + app_name=app_name, + app_spec=APP_SPEC, + algorand=algorand, + default_sender=default_sender, + default_signer=default_signer, + approval_source_map=approval_source_map, + clear_source_map=clear_source_map, + ignore_cache=ignore_cache, + app_lookup_cache=app_lookup_cache, + ) + ) + + @staticmethod + def from_network( + algorand: _AlgoKitAlgorandClient, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> "DasaClient": + return DasaClient( + algokit_utils.AppClient.from_network( + app_spec=APP_SPEC, + algorand=algorand, + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + approval_source_map=approval_source_map, + clear_source_map=clear_source_map, + ) + ) + + @property + def app_id(self) -> int: + return self.app_client.app_id + + @property + def app_address(self) -> str: + return self.app_client.app_address + + @property + def app_name(self) -> str: + return self.app_client.app_name + + @property + def app_spec(self) -> algokit_utils.Arc56Contract: + return self.app_client.app_spec + + @property + def algorand(self) -> _AlgoKitAlgorandClient: + return self.app_client.algorand + + def clone( + self, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> "DasaClient": + return DasaClient( + self.app_client.clone( + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + approval_source_map=approval_source_map, + clear_source_map=clear_source_map, + ) + ) + + def new_group(self) -> "DasaComposer": + return DasaComposer(self) + + @typing.overload + def decode_return_value( + self, + method: typing.Literal["fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)"], + return_value: algokit_utils.ABIReturn | None + ) -> CashFundingResult | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])"], + return_value: algokit_utils.ABIReturn | None + ) -> CashClaimResult | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["transfer_set_schedule(uint64,uint64)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["primary_distribution(address,uint64)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["transfer(address,address,uint64)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["account_suspension(address,bool)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["account_open(address,address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["account_update_payment_address(address,address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)"], + return_value: algokit_utils.ABIReturn | None + ) -> AccountPosition | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_execute_ied()uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)"], + return_value: algokit_utils.ABIReturn | None + ) -> KernelState | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)"], + return_value: algokit_utils.ABIReturn | None + ) -> ExecutionScheduleEntry | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_rotate_arranger(address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_set_op_daemon(address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_assign_role(uint8,address,(uint64,uint64))uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_revoke_role(uint8,address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_contract_suspension(bool)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_contract_default(bool)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_get_arranger()address"], + return_value: algokit_utils.ABIReturn | None + ) -> str | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_get_address_roles(address)(bool,bool,bool,bool,bool)"], + return_value: algokit_utils.ABIReturn | None + ) -> tuple[bool, bool, bool, bool, bool] | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["rbac_get_role_validity(uint8,address)(uint64,uint64)"], + return_value: algokit_utils.ABIReturn | None + ) -> RoleValidity | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_create(address)uint64"], + return_value: algokit_utils.ABIReturn | None + ) -> int | None: ... + @typing.overload + def decode_return_value( + self, + method: typing.Literal["contract_update()void"], + return_value: algokit_utils.ABIReturn | None + ) -> None: ... + @typing.overload + def decode_return_value( + self, + method: str, + return_value: algokit_utils.ABIReturn | None + ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | None: ... + + def decode_return_value( + self, + method: str, + return_value: algokit_utils.ABIReturn | None + ) -> algokit_utils.ABIValue | algokit_utils.ABIStruct | AccountPosition | CashClaimResult | CashFundingResult | ExecutionScheduleEntry | KernelState | None | RoleValidity | int | str | tuple[bool, bool, bool, bool, bool]: + """Decode ABI return value for the given method.""" + if return_value is None: + return None + + arc56_method = self.app_spec.get_arc56_method(method) + decoded = return_value.get_arc56_value(arc56_method, self.app_spec.structs) + + # If method returns a struct, convert the dict to appropriate dataclass + if (arc56_method and + arc56_method.returns and + arc56_method.returns.struct and + isinstance(decoded, dict)): + struct_class = globals().get(arc56_method.returns.struct) + if struct_class: + return struct_class(**typing.cast(dict, decoded)) + return decoded + + +@dataclasses.dataclass(frozen=True) +class DasaMethodCallCreateParams( + algokit_utils.AppClientCreateSchema, algokit_utils.BaseAppClientMethodCallParams[ + ContractCreateArgs, + str | None, + ] +): + """Parameters for creating Dasa contract using ABI""" + on_complete: typing.Literal[OnComplete.NoOpOC] | None = None + method: str | None = None + + def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallCreateParams: + method_args = _parse_abi_args(self.args) + return algokit_utils.AppClientMethodCallCreateParams( + **{ + **self.__dict__, + "method": self.method or getattr(self.args, "abi_method_signature", None), + "args": method_args, + } + ) + +@dataclasses.dataclass(frozen=True) +class DasaMethodCallUpdateParams( + algokit_utils.BaseAppClientMethodCallParams[ + typing.Any, + str | None, + ] +): + """Parameters for calling Dasa contract using ABI""" + on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None + method: str | None = None + + def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallParams: + method_args = _parse_abi_args(self.args) + return algokit_utils.AppClientMethodCallParams( + **{ + **self.__dict__, + "method": self.method or getattr(self.args, "abi_method_signature", None), + "args": method_args, + } + ) + +class DasaFactory(algokit_utils.TypedAppFactoryProtocol[DasaMethodCallCreateParams, DasaMethodCallUpdateParams, None]): + """Factory for deploying and managing DasaClient smart contracts""" + + def __init__( + self, + algorand: _AlgoKitAlgorandClient, + *, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + version: str | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None, + ): + self.app_factory = algokit_utils.AppFactory( + params=algokit_utils.AppFactoryParams( + algorand=algorand, + app_spec=APP_SPEC, + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + version=version, + compilation_params=compilation_params, + ) + ) + self.params = DasaFactoryParams(self.app_factory) + self.create_transaction = DasaFactoryCreateTransaction(self.app_factory) + self.send = DasaFactorySend(self.app_factory) + + @property + def app_name(self) -> str: + return self.app_factory.app_name + + @property + def app_spec(self) -> algokit_utils.Arc56Contract: + return self.app_factory.app_spec + + @property + def algorand(self) -> _AlgoKitAlgorandClient: + return self.app_factory.algorand + + def deploy( + self, + *, + on_update: algokit_utils.OnUpdate | None = None, + on_schema_break: algokit_utils.OnSchemaBreak | None = None, + create_params: DasaMethodCallCreateParams | None = None, + update_params: DasaMethodCallUpdateParams | None = None, + delete_params: None = None, + existing_deployments: algokit_utils.ApplicationLookup | None = None, + ignore_cache: bool = False, + app_name: str | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None, + send_params: algokit_utils.SendParams | None = None, + ) -> tuple[DasaClient, algokit_utils.AppFactoryDeployResult]: + """Deploy the application""" + deploy_response = self.app_factory.deploy( + on_update=on_update, + on_schema_break=on_schema_break, + create_params=create_params.to_algokit_utils_params() if create_params else None, + update_params=update_params.to_algokit_utils_params() if update_params else None, + delete_params=delete_params, + existing_deployments=existing_deployments, + ignore_cache=ignore_cache, + app_name=app_name, + compilation_params=compilation_params, + send_params=send_params, + ) + + return DasaClient(deploy_response[0]), deploy_response[1] + + def get_app_client_by_creator_and_name( + self, + creator_address: str, + app_name: str, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + ignore_cache: bool | None = None, + app_lookup_cache: algokit_utils.ApplicationLookup | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> DasaClient: + """Get an app client by creator address and name""" + return DasaClient( + self.app_factory.get_app_client_by_creator_and_name( + creator_address, + app_name, + default_sender, + default_signer, + ignore_cache, + app_lookup_cache, + approval_source_map, + clear_source_map, + ) + ) + + def get_app_client_by_id( + self, + app_id: int, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + approval_source_map: SourceMap | None = None, + clear_source_map: SourceMap | None = None, + ) -> DasaClient: + """Get an app client by app ID""" + return DasaClient( + self.app_factory.get_app_client_by_id( + app_id, + app_name, + default_sender, + default_signer, + approval_source_map, + clear_source_map, + ) + ) + + +class DasaFactoryParams: + """Parameters for creating transactions for Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + self.create = DasaFactoryCreateParams(app_factory) + self.update = DasaFactoryUpdateParams(app_factory) + self.delete = DasaFactoryDeleteParams(app_factory) + +class DasaFactoryCreateParams: + """Parameters for 'create' operations of Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateParams: + """Creates an instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.bare.create( + algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), + compilation_params=compilation_params) + + def fund_due_cashflows( + self, + args: tuple[int] | FundDueCashflowsArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def claim_due_cashflows( + self, + args: tuple[str, bytes | str] | ClaimDueCashflowsArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[]) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def transfer_set_schedule( + self, + args: tuple[int, int] | TransferSetScheduleArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the transfer_set_schedule(uint64,uint64)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "transfer_set_schedule(uint64,uint64)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def primary_distribution( + self, + args: tuple[str, int] | PrimaryDistributionArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the primary_distribution(address,uint64)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "primary_distribution(address,uint64)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def transfer( + self, + args: tuple[str, str, int] | TransferArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the transfer(address,address,uint64)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "transfer(address,address,uint64)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def account_suspension( + self, + args: tuple[str, bool] | AccountSuspensionArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the account_suspension(address,bool)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "account_suspension(address,bool)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def account_open( + self, + args: tuple[str, str] | AccountOpenArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the account_open(address,address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "account_open(address,address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def account_update_payment_address( + self, + args: tuple[str, str] | AccountUpdatePaymentAddressArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the account_update_payment_address(address,address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "account_update_payment_address(address,address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def account_get_position( + self, + args: tuple[str] | AccountGetPositionArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def contract_config( + self, + args: tuple[NormalizedActusTerms, InitialKernelState, Prospectus] | ContractConfigArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def contract_schedule( + self, + args: tuple[int, bool, list[tuple[int, int, int, int, int, int, int, int, int]]] | ContractScheduleArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def contract_execute_ied( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_execute_ied()uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_execute_ied()uint64", + "args": None, + } + ), + compilation_params=compilation_params + ) + + def apply_non_cash_event( + self, + args: tuple[int, ObservedEventRequest] | ApplyNonCashEventArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def append_observed_cash_event( + self, + args: tuple[ObservedCashEventRequest] | AppendObservedCashEventArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def contract_get_state( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "args": None, + } + ), + compilation_params=compilation_params + ) + + def contract_get_next_due_event( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", + "args": None, + } + ), + compilation_params=compilation_params + ) + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_rotate_arranger(address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_rotate_arranger(address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_set_op_daemon(address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_set_op_daemon(address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_assign_role(uint8,address,(uint64,uint64))uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_assign_role(uint8,address,(uint64,uint64))uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_revoke_role(uint8,address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_revoke_role(uint8,address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_contract_suspension( + self, + args: tuple[bool] | RbacContractSuspensionArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_contract_suspension(bool)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_contract_suspension(bool)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_contract_default(bool)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_contract_default(bool)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_get_arranger( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_get_arranger()address ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_get_arranger()address", + "args": None, + } + ), + compilation_params=compilation_params + ) + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_get_address_roles(address)(bool,bool,bool,bool,bool) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the rbac_get_role_validity(uint8,address)(uint64,uint64) ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "rbac_get_role_validity(uint8,address)(uint64,uint64)", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def contract_create( + self, + args: tuple[str] | ContractCreateArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_create(address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_create(address)uint64", + "args": _parse_abi_args(args), + } + ), + compilation_params=compilation_params + ) + + def contract_update( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> algokit_utils.AppCreateMethodCallParams: + """Creates a new instance using the contract_update()void ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_update()void", + "args": None, + } + ), + compilation_params=compilation_params + ) + +class DasaFactoryUpdateParams: + """Parameters for 'update' operations of Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + + ) -> algokit_utils.AppUpdateParams: + """Updates an instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.bare.deploy_update( + algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), + ) + +class DasaFactoryDeleteParams: + """Parameters for 'delete' operations of Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + + ) -> algokit_utils.AppDeleteParams: + """Deletes an instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.params.bare.deploy_delete( + algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)), + ) + + +class DasaFactoryCreateTransaction: + """Create transactions for Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + self.create = DasaFactoryCreateTransactionCreate(app_factory) + + +class DasaFactoryCreateTransactionCreate: + """Create new instances of Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + params: algokit_utils.CommonAppCallCreateParams | None = None, + ) -> Transaction: + """Creates a new instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + return self.app_factory.create_transaction.bare.create( + algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), + ) + + +class DasaFactorySend: + """Send calls to Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + self.create = DasaFactorySendCreate(app_factory) + + +class DasaFactorySendCreate: + """Send create calls to Dasa contract""" + + def __init__(self, app_factory: algokit_utils.AppFactory): + self.app_factory = app_factory + + def bare( + self, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + send_params: algokit_utils.SendParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None, + ) -> tuple[DasaClient, algokit_utils.SendAppCreateTransactionResult]: + """Creates a new instance using a bare call""" + params = params or algokit_utils.CommonAppCallCreateParams() + result = self.app_factory.send.bare.create( + algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)), + send_params=send_params, + compilation_params=compilation_params + ) + return DasaClient(result[0]), result[1] + + def contract_create( + self, + args: tuple[str] | ContractCreateArgs, + *, + params: algokit_utils.CommonAppCallCreateParams | None = None, + send_params: algokit_utils.SendParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> tuple[DasaClient, algokit_utils.AppFactoryCreateMethodCallResult[int]]: + """Creates and sends a transaction using the contract_create(address)uint64 ABI method""" + params = params or algokit_utils.CommonAppCallCreateParams() + client, result = self.app_factory.send.create( + algokit_utils.AppFactoryCreateMethodCallParams( + **{ + **dataclasses.asdict(params), + "method": "contract_create(address)uint64", + "args": _parse_abi_args(args), + } + ), + send_params=send_params, + compilation_params=compilation_params + ) + return_value = None if result.abi_return is None else typing.cast(int, result.abi_return) + + return DasaClient(client), algokit_utils.AppFactoryCreateMethodCallResult[int]( + **{ + **result.__dict__, + "app_id": result.app_id, + "abi_return": return_value, + "transaction": result.transaction, + "confirmation": result.confirmation, + "group_id": result.group_id, + "tx_ids": result.tx_ids, + "transactions": result.transactions, + "confirmations": result.confirmations, + "app_address": result.app_address, + } + ) + + +class _DasaUpdateComposer: + def __init__(self, composer: "DasaComposer"): + self.composer = composer + def contract_update( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self.composer._composer.add_app_update_method_call( + self.composer.client.params.update.contract_update( + + params=params, + compilation_params=compilation_params + ) + ) + self.composer._result_mappers.append( + lambda v: self.composer.client.decode_return_value( + "contract_update()void", v + ) + ) + return self.composer + + +class DasaComposer: + """Composer for creating transaction groups for Dasa contract calls""" + + def __init__(self, client: "DasaClient"): + self.client = client + self._composer = client.algorand.new_group() + self._result_mappers: list[typing.Callable[[algokit_utils.ABIReturn | None], object] | None] = [] + + @property + def update(self) -> "_DasaUpdateComposer": + return _DasaUpdateComposer(self) + + def fund_due_cashflows( + self, + args: tuple[int] | FundDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.fund_due_cashflows( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "fund_due_cashflows(uint64)(uint64,uint64,uint64,uint64,uint64)", v + ) + ) + return self + + def claim_due_cashflows( + self, + args: tuple[str, bytes | str] | ClaimDueCashflowsArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.claim_due_cashflows( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "claim_due_cashflows(address,byte[])(uint64,uint64,uint64,uint64,byte[])", v + ) + ) + return self + + def transfer_set_schedule( + self, + args: tuple[int, int] | TransferSetScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.transfer_set_schedule( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "transfer_set_schedule(uint64,uint64)uint64", v + ) + ) + return self + + def primary_distribution( + self, + args: tuple[str, int] | PrimaryDistributionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.primary_distribution( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "primary_distribution(address,uint64)uint64", v + ) + ) + return self + + def transfer( + self, + args: tuple[str, str, int] | TransferArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.transfer( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "transfer(address,address,uint64)uint64", v + ) + ) + return self + + def account_suspension( + self, + args: tuple[str, bool] | AccountSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.account_suspension( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "account_suspension(address,bool)uint64", v + ) + ) + return self + + def account_open( + self, + args: tuple[str, str] | AccountOpenArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.account_open( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "account_open(address,address)uint64", v + ) + ) + return self + + def account_update_payment_address( + self, + args: tuple[str, str] | AccountUpdatePaymentAddressArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.account_update_payment_address( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "account_update_payment_address(address,address)uint64", v + ) + ) + return self + + def account_get_position( + self, + args: tuple[str] | AccountGetPositionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.account_get_position( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "account_get_position(address)(address,uint64,uint64,bool,uint64,uint64,uint64,uint64,uint64)", v + ) + ) + return self + + def contract_config( + self, + args: tuple[NormalizedActusTerms, InitialKernelState, Prospectus] | ContractConfigArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.contract_config( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "contract_config((uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint8,uint64,uint64,uint64,uint64,uint64,bool,bool,bool,uint64),(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64),(byte[32],string))uint64", v + ) + ) + return self + + def contract_schedule( + self, + args: tuple[int, bool, list[tuple[int, int, int, int, int, int, int, int, int]]] | ContractScheduleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.contract_schedule( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "contract_schedule(uint64,bool,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)[])uint64", v + ) + ) + return self + + def contract_execute_ied( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.contract_execute_ied( + + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "contract_execute_ied()uint64", v + ) + ) + return self + + def apply_non_cash_event( + self, + args: tuple[int, ObservedEventRequest] | ApplyNonCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.apply_non_cash_event( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "apply_non_cash_event(uint64,(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", v + ) + ) + return self + + def append_observed_cash_event( + self, + args: tuple[ObservedCashEventRequest] | AppendObservedCashEventArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.append_observed_cash_event( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "append_observed_cash_event((uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64))uint64", v + ) + ) + return self + + def contract_get_state( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.contract_get_state( + + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "contract_get_state()(uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", v + ) + ) + return self + + def contract_get_next_due_event( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.contract_get_next_due_event( + + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "contract_get_next_due_event()(uint64,uint8,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", v + ) + ) + return self + + def rbac_rotate_arranger( + self, + args: tuple[str] | RbacRotateArrangerArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_rotate_arranger( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_rotate_arranger(address)uint64", v + ) + ) + return self + + def rbac_set_op_daemon( + self, + args: tuple[str] | RbacSetOpDaemonArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_set_op_daemon( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_set_op_daemon(address)uint64", v + ) + ) + return self + + def rbac_assign_role( + self, + args: tuple[int, str, RoleValidity] | RbacAssignRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_assign_role( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_assign_role(uint8,address,(uint64,uint64))uint64", v + ) + ) + return self + + def rbac_revoke_role( + self, + args: tuple[int, str] | RbacRevokeRoleArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_revoke_role( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_revoke_role(uint8,address)uint64", v + ) + ) + return self + + def rbac_contract_suspension( + self, + args: tuple[bool] | RbacContractSuspensionArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_contract_suspension( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_contract_suspension(bool)uint64", v + ) + ) + return self + + def rbac_contract_default( + self, + args: tuple[bool] | RbacContractDefaultArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_contract_default( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_contract_default(bool)uint64", v + ) + ) + return self + + def rbac_get_arranger( + self, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_get_arranger( + + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_get_arranger()address", v + ) + ) + return self + + def rbac_get_address_roles( + self, + args: tuple[str] | RbacGetAddressRolesArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_get_address_roles( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_get_address_roles(address)(bool,bool,bool,bool,bool)", v + ) + ) + return self + + def rbac_get_role_validity( + self, + args: tuple[int, str] | RbacGetRoleValidityArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.rbac_get_role_validity( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "rbac_get_role_validity(uint8,address)(uint64,uint64)", v + ) + ) + return self + + def contract_create( + self, + args: tuple[str] | ContractCreateArgs, + params: algokit_utils.CommonAppCallParams | None = None, + compilation_params: algokit_utils.AppClientCompilationParams | None = None + ) -> "DasaComposer": + self._composer.add_app_call_method_call( + self.client.params.contract_create( + args=args, + params=params, + ) + ) + self._result_mappers.append( + lambda v: self.client.decode_return_value( + "contract_create(address)uint64", v + ) + ) + return self + + def clear_state( + self, + *, + args: list[bytes] | None = None, + params: algokit_utils.CommonAppCallParams | None = None, + ) -> "DasaComposer": + params=params or algokit_utils.CommonAppCallParams() + self._composer.add_app_call( + self.client.params.clear_state( + algokit_utils.AppClientBareCallParams( + **{ + **dataclasses.asdict(params), + "args": args + } + ) + ) + ) + return self + + def add_transaction( + self, txn: Transaction, signer: TransactionSigner | None = None + ) -> "DasaComposer": + self._composer.add_transaction(txn, signer) + return self + + def composer(self) -> algokit_utils.TransactionComposer: + return self._composer + + def simulate( + self, + allow_more_logs: bool | None = None, + allow_empty_signatures: bool | None = None, + allow_unnamed_resources: bool | None = None, + extra_opcode_budget: int | None = None, + exec_trace_config: SimulateTraceConfig | None = None, + simulation_round: int | None = None, + skip_signatures: bool | None = None, + ) -> algokit_utils.SendAtomicTransactionComposerResults: + return self._composer.simulate( + allow_more_logs=allow_more_logs, + allow_empty_signatures=allow_empty_signatures, + allow_unnamed_resources=allow_unnamed_resources, + extra_opcode_budget=extra_opcode_budget, + exec_trace_config=exec_trace_config, + simulation_round=simulation_round, + skip_signatures=skip_signatures, + ) + + def send( + self, + send_params: algokit_utils.SendParams | None = None + ) -> algokit_utils.SendAtomicTransactionComposerResults: + return self._composer.send(send_params) diff --git a/src/d_asa/constants.py b/src/d_asa/constants.py new file mode 100644 index 00000000..e943c79c --- /dev/null +++ b/src/d_asa/constants.py @@ -0,0 +1,42 @@ +from typing import Final + +################################################################################ +# AVM +################################################################################ +MAX_UINT64: Final[int] = 2**64 - 1 +MAX_ARGS_SIZE: Final[int] = 2048 +OP_UP_CONTRACT_CONFIG_BASE_BUDGET: Final[int] = 1_500 +OP_UP_CONTRACT_CONFIG_PER_ENTRY_BUDGET: Final[int] = 100 +OP_UP_FUND_DUE_CASHFLOWS_BASE_BUDGET: Final[int] = 1_500 +OP_UP_FUND_DUE_CASHFLOWS_PER_EVENT_BUDGET: Final[int] = 100 +OP_UP_NON_CASH_BASE_BUDGET: Final[int] = 1_500 +OP_UP_NON_CASH_PER_ENTRY_BUDGET: Final[int] = 100 +SCHEDULE_PAGE_SIZE: Final[int] = 16 + +################################################################################ +# Conversions +################################################################################ +BPS: Final[int] = 10_000 +FIXED_POINT_SCALE: Final[int] = 1_000_000_000 +DAY_2_SEC: Final[int] = 24 * 60 * 60 + +################################################################################ +# Role Keys Prefix +################################################################################ +PREFIX_ID_ARRANGER: Final[bytes] = b"R:ARR#" +PREFIX_ID_OP_DAEMON: Final[bytes] = b"R:OPD#" +PREFIX_ID_ACCOUNT_MANAGER: Final[bytes] = b"R:MNG#" +PREFIX_ID_PRIMARY_DEALER: Final[bytes] = b"R:PYD#" +PREFIX_ID_TRUSTEE: Final[bytes] = b"R:TRS#" +PREFIX_ID_AUTHORITY: Final[bytes] = b"R:AUT#" +PREFIX_ID_OBSERVER: Final[bytes] = b"R:MOC#" + +################################################################################ +# Accounting Prefix +################################################################################ +PREFIX_ID_ACCOUNT: Final[bytes] = b"A#" + +################################################################################ +# ACTUS Schedule Prefix +################################################################################ +PREFIX_ID_SCHEDULE_PAGE: Final[bytes] = b"S#" diff --git a/src/d_asa/contracts.py b/src/d_asa/contracts.py new file mode 100644 index 00000000..5d5960d3 --- /dev/null +++ b/src/d_asa/contracts.py @@ -0,0 +1,303 @@ +"""ACTUS Contract Attributes: Basic Fixed-Income Maturities""" + +from __future__ import annotations + +from dataclasses import dataclass +from decimal import Decimal +from typing import Literal + +from .day_count import ( + BusinessDayConvention, + Calendar, + DayCountConvention, + EndOfMonthConvention, +) +from .errors import UnsupportedActusFeatureError +from .registry import DAY_COUNT_CONVENTION_IDS, REJECTED_BDC, SUPPORTED_CONTRACT_TYPES +from .schedule import Cycle +from .unix_time import UTCTimeStamp + + +@dataclass(frozen=True, slots=True) +class ContractAttributes: + """ + ACTUS contract attributes for fixed-income instruments. + + Represents the complete specification of a financial contract following + ACTUS standards. D-ASA supports a subset of ACTUS contract types including + PAM, LAM, NAM, ANN, LAX, and CLM. + + Attributes: + contract_id: Unique identifier for the contract. + contract_type: ACTUS contract type (e.g., "PAM", "PAM:ZCB", "LAM"). + + status_date: Reference date for contract state (must precede IED). + initial_exchange_date: Date when principal is initially exchanged. + maturity_date: Final maturity date when contract terminates. + + notional_principal: Principal amount of the contract. + premium_discount_at_ied: Premium/discount adjustment at IED + (positive for discount, negative for premium). + next_principal_redemption_amount: Fixed payment amount per period. + principal_redemption_cycle: Frequency of principal payments. + principal_redemption_anchor: Anchor date for principal schedule. + amortization_date: Start date for amortization (ANN contracts). + + nominal_interest_rate: Annual interest rate (e.g., 0.05 for 5%). + interest_payment_anchor: Anchor date for interest payment schedule. + interest_payment_cycle: Frequency of interest payments. + interest_calculation_base_anchor: Anchor for interest calculation base. + interest_calculation_base_cycle: Cycle for calculation base adjustments. + rate_reset_anchor: Anchor date for rate reset schedule. + rate_reset_cycle: Frequency of interest rate resets. + rate_reset_spread: Spread added to reset rate. + rate_reset_multiplier: Multiplier applied to reset rate. + rate_reset_floor: Minimum rate after reset. + rate_reset_cap: Maximum rate after reset. + rate_reset_next: Next known reset rate value. + + day_count_convention: Method for calculating year fractions (default: A360). + business_day_convention: How to handle non-business days (default: NOS). + end_of_month_convention: End-of-month adjustment rules (default: SD). + calendar: Calendar for business day calculations (default: NC). + + array_pr_anchor: Array of principal redemption anchor dates (LAX). + array_pr_cycle: Array of principal redemption cycles (LAX). + array_pr_next: Array of principal redemption amounts (LAX). + array_increase_decrease: Array indicating principal direction (LAX). + + Example: + >>> from decimal import Decimal + >>> contract = ContractAttributes( + ... contract_id=1, + ... contract_type="PAM:ZCB", + ... status_date=1609459200, # 2021-01-01 + ... initial_exchange_date=1612137600, # 2021-02-01 + ... maturity_date=1643673600, # 2022-02-01 + ... notional_principal=Decimal("100000"), + ... premium_discount_at_ied=Decimal("0"), + ... ) + + Note: + D-ASA supports a subset of ACTUS contract attributes. + Contract subtypes use colon notation (e.g., "PAM:ZCB" for zero coupon bond). + """ + + # Contract + contract_id: int + contract_type: str + + # Time + status_date: UTCTimeStamp + initial_exchange_date: UTCTimeStamp + maturity_date: UTCTimeStamp | None + + # Day Count Convention + day_count_convention: DayCountConvention + business_day_convention: BusinessDayConvention + end_of_month_convention: EndOfMonthConvention + calendar: Calendar + + # Principal + notional_principal: int | float | Decimal + premium_discount_at_ied: int | float | Decimal + next_principal_redemption_amount: int | float | Decimal = 0 + principal_redemption_cycle: Cycle | None = None + principal_redemption_anchor: UTCTimeStamp | None = None + amortization_date: UTCTimeStamp | None = None + + # Interest + nominal_interest_rate: int | float | Decimal = 0 + interest_payment_anchor: UTCTimeStamp | None = None + interest_payment_cycle: Cycle | None = None + interest_calculation_base_anchor: UTCTimeStamp | None = None + interest_calculation_base_cycle: Cycle | None = None + rate_reset_anchor: UTCTimeStamp | None = None + rate_reset_cycle: Cycle | None = None + rate_reset_spread: int | float | Decimal = 0 + rate_reset_multiplier: int | float | Decimal = 1 + rate_reset_floor: int | float | Decimal = 0 + rate_reset_cap: int | float | Decimal = 0 + rate_reset_next: int | float | Decimal | None = None + + # Arrays + array_pr_anchor: list[UTCTimeStamp] | None = None + array_pr_cycle: list[Cycle] | None = None + array_pr_next: list[int | float | Decimal] | None = None + array_increase_decrease: list[Literal["INC", "DEC"]] | None = None + + def __post_init__(self) -> None: + """ + Validate contract attributes after initialization. + + Ensures contract type is supported, day count convention is valid, + and business day convention is compatible with D-ASA. + + Raises: + UnsupportedActusFeatureError: If contract_type, day_count_convention, + or business_day_convention are not supported by D-ASA. + """ + # Extract base contract type (e.g., "PAM" from "PAM:ZCB") + base_contract_type = ( + self.contract_type.split(":")[0] + if ":" in self.contract_type + else self.contract_type + ) + + if base_contract_type not in SUPPORTED_CONTRACT_TYPES: + raise UnsupportedActusFeatureError( + f"Unsupported ACTUS contract type: {self.contract_type}" + ) + + if ( + self.day_count_convention is not None + and self.day_count_convention not in DAY_COUNT_CONVENTION_IDS.values() + ): + raise UnsupportedActusFeatureError( + f"Unsupported day count convention: {self.day_count_convention}" + ) + + if self.business_day_convention in REJECTED_BDC: + raise UnsupportedActusFeatureError( + f"Unsupported business day convention {self.business_day_convention.name}" + ) + + +def make_pam_zero_coupon_bond( + *, + contract_id: int, + status_date: UTCTimeStamp, + initial_exchange_date: UTCTimeStamp, + maturity_date: UTCTimeStamp, + notional_principal: int | float | Decimal, + premium_discount_at_ied: int | float | Decimal, + day_count_convention: DayCountConvention = DayCountConvention.A360, + business_day_convention: BusinessDayConvention = BusinessDayConvention.NOS, + end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, + calendar: Calendar = Calendar.NC, +) -> ContractAttributes: + """ + Build a PAM Zero Coupon Bond (ZCB) contract. + + Zero coupon bonds pay no periodic interest and return the full principal + at maturity. The contract_type is set to "PAM:ZCB" with zero interest rate. + + Args: + contract_id: Unique identifier for the contract. + status_date: Contract status reference date (must precede IED). + initial_exchange_date: Date when bond is issued and principal exchanged. + maturity_date: Date when principal is repaid. + notional_principal: Face value of the bond. + premium_discount_at_ied: Premium or discount adjustment at issuance + (positive for discount, negative for premium). + day_count_convention: Year fraction calculation method (default: A360). + business_day_convention: Non-business day handling (default: NOS). + end_of_month_convention: End-of-month adjustment rules (default: SD). + calendar: Business calendar for date calculations (default: NC). + + Returns: + ContractAttributes configured as a zero coupon bond. + + Example: + >>> from decimal import Decimal + >>> zcb = make_pam_zero_coupon_bond( + ... contract_id=1, + ... status_date=1609459200, # 2021-01-01 + ... initial_exchange_date=1612137600, # 2021-02-01 + ... maturity_date=1643673600, # 2022-02-01 + ... notional_principal=Decimal("100000"), + ... premium_discount_at_ied=Decimal("0"), + ... ) + >>> zcb.contract_type + 'PAM:ZCB' + >>> zcb.nominal_interest_rate + 0 + """ + return ContractAttributes( + contract_id=contract_id, + contract_type="PAM:ZCB", + status_date=status_date, + initial_exchange_date=initial_exchange_date, + maturity_date=maturity_date, + notional_principal=notional_principal, + premium_discount_at_ied=premium_discount_at_ied, + nominal_interest_rate=0, + day_count_convention=day_count_convention, + business_day_convention=business_day_convention, + end_of_month_convention=end_of_month_convention, + calendar=calendar, + ) + + +def make_pam_fixed_coupon_bond_profile( + *, + contract_id: int, + status_date: UTCTimeStamp, + initial_exchange_date: UTCTimeStamp, + maturity_date: UTCTimeStamp, + notional_principal: int | float | Decimal, + nominal_interest_rate: int | float | Decimal, + day_count_convention: DayCountConvention = DayCountConvention.A360, + business_day_convention: BusinessDayConvention = BusinessDayConvention.NOS, + end_of_month_convention: EndOfMonthConvention = EndOfMonthConvention.SD, + calendar: Calendar = Calendar.NC, + interest_payment_cycle: Cycle, + interest_payment_anchor: UTCTimeStamp, +) -> ContractAttributes: + """ + Build a PAM Fixed Coupon Bond (FCB) contract. + + Fixed coupon bonds pay periodic interest at a fixed rate and return the + principal at maturity. The contract_type is set to "PAM:FCB". + + Args: + contract_id: Unique identifier for the contract. + status_date: Contract status reference date (must precede IED). + initial_exchange_date: Date when bond is issued and principal exchanged. + maturity_date: Date when principal is repaid. + notional_principal: Face value of the bond. + nominal_interest_rate: Annual interest rate (e.g., 0.05 for 5%). + day_count_convention: Year fraction calculation method (default: A360). + business_day_convention: Non-business day handling (default: NOS). + end_of_month_convention: End-of-month adjustment rules (default: SD). + calendar: Business calendar for date calculations (default: NC). + interest_payment_cycle: Frequency of interest payments (e.g., 6M for semi-annual). + interest_payment_anchor: Starting date for interest payment schedule. + + Returns: + ContractAttributes configured as a fixed coupon bond. + + Example: + >>> from decimal import Decimal + >>> from d_asa.schedule import Cycle + >>> fcb = make_pam_fixed_coupon_bond_profile( + ... contract_id=2, + ... status_date=1609459200, # 2021-01-01 + ... initial_exchange_date=1612137600, # 2021-02-01 + ... maturity_date=1675209600, # 2023-02-01 + ... notional_principal=Decimal("100000"), + ... nominal_interest_rate=Decimal("0.05"), # 5% annual + ... interest_payment_cycle=Cycle(count=6, unit="M"), # Semi-annual + ... interest_payment_anchor=1620009600, # First payment date + ... ) + >>> fcb.contract_type + 'PAM:FCB' + >>> fcb.nominal_interest_rate + Decimal('0.05') + """ + return ContractAttributes( + contract_id=contract_id, + contract_type="PAM:FCB", + status_date=status_date, + initial_exchange_date=initial_exchange_date, + maturity_date=maturity_date, + notional_principal=notional_principal, + premium_discount_at_ied=0, + nominal_interest_rate=nominal_interest_rate, + day_count_convention=day_count_convention, + business_day_convention=business_day_convention, + end_of_month_convention=end_of_month_convention, + calendar=calendar, + interest_payment_cycle=interest_payment_cycle, + interest_payment_anchor=interest_payment_anchor, + ) diff --git a/src/d_asa/dasa.py b/src/d_asa/dasa.py new file mode 100644 index 00000000..3ec0b226 --- /dev/null +++ b/src/d_asa/dasa.py @@ -0,0 +1,1433 @@ +from __future__ import annotations + +from collections.abc import Sequence +from dataclasses import dataclass +from decimal import Decimal +from enum import IntEnum +from typing import Literal, cast + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + AssetTransferParams, + CommonAppCallParams, + PaymentParams, + SendParams, + SigningAccount, +) +from algosdk.atomic_transaction_composer import TransactionSigner +from algosdk.constants import ZERO_ADDRESS +from algosdk.transaction import Transaction +from algosdk.v2client.models import SimulateTraceConfig + +from . import constants as cst +from . import enums +from ._dasa_mappers import ( + to_client_initial_state, + to_client_observed_cash_event, + to_client_observed_event, + to_client_prospectus, + to_client_role_validity, + to_client_schedule_page, + to_client_terms, + to_sdk_account_position, + to_sdk_schedule_entry, +) +from .artifacts.dasa_client import ( + AccountOpenArgs, + AccountSuspensionArgs, + AccountUpdatePaymentAddressArgs, + AppendObservedCashEventArgs, + ApplyNonCashEventArgs, + CashClaimResult, + CashFundingResult, + ClaimDueCashflowsArgs, + ContractConfigArgs, + ContractCreateArgs, + ContractScheduleArgs, + FundDueCashflowsArgs, + PrimaryDistributionArgs, + RbacAssignRoleArgs, + RbacContractDefaultArgs, + RbacContractSuspensionArgs, + RbacRevokeRoleArgs, + RbacRotateArrangerArgs, + RbacSetOpDaemonArgs, + TransferArgs, + TransferSetScheduleArgs, +) +from .artifacts.dasa_client import ( + DasaClient as _GeneratedDasaClient, +) +from .artifacts.dasa_client import ( + DasaComposer as _GeneratedDasaComposer, +) +from .artifacts.dasa_client import ( + DasaFactory as _GeneratedDasaFactory, +) +from .contracts import ContractAttributes +from .day_count import year_fraction_fixed +from .models import ( + AccountPosition, + ExecutionScheduleEntry, + NormalizationResult, + ObservedCashEventRequest, + ObservedEventRequest, +) +from .normalization import normalize_contract_attributes + +DEFAULT_APP_FUNDING = AlgoAmount.from_algo(2) +DEFAULT_CLAIM_FEE = AlgoAmount.from_micro_algo(3_000) +DEFAULT_CONFIG_FEE = AlgoAmount.from_micro_algo(5_000) +DEFAULT_ROLE_VALIDITY_END = 2**64 - 1 +_MANAGED_ROLE_IDS = frozenset( + { + enums.ROLE_ACCOUNT_MANAGER, + enums.ROLE_PRIMARY_DEALER, + enums.ROLE_TRUSTEE, + enums.ROLE_AUTHORITY, + enums.ROLE_OBSERVER, + } +) + + +class DAsaRole(IntEnum): + ARRANGER = enums.ROLE_ARRANGER + OP_DAEMON = enums.ROLE_OP_DAEMON + ACCOUNT_MANAGER = enums.ROLE_ACCOUNT_MANAGER + PRIMARY_DEALER = enums.ROLE_PRIMARY_DEALER + TRUSTEE = enums.ROLE_TRUSTEE + AUTHORITY = enums.ROLE_AUTHORITY + OBSERVER = enums.ROLE_OBSERVER + + +@dataclass(frozen=True, slots=True) +class RoleValidityWindow: + start: int + end: int + + def is_active(self, timestamp: int) -> bool: + return self.start <= timestamp <= self.end + + +@dataclass(frozen=True, slots=True) +class PricingContext: + notional_unit_value: int + + def __post_init__(self) -> None: + if self.notional_unit_value <= 0: + raise ValueError("notional_unit_value must be positive") + + +@dataclass(frozen=True, slots=True) +class AddressRoles: + arranger: bool + op_daemon: bool + account_manager: bool + primary_dealer: bool + trustee: bool + authority: bool + observer: bool + + +@dataclass(frozen=True, slots=True) +class ContractState: + arranger: str + op_daemon: str + contract_suspended: bool + defaulted: bool + status: int + contract_type: int + denomination_asset_id: int + settlement_asset_id: int + initial_exchange_date: int + maturity_date: int + transfer_opening_date: int + transfer_closure_date: int + day_count_convention: int + total_units: int + reserved_units_total: int + initial_exchange_amount: int + outstanding_principal: int + next_principal_redemption: int + dynamic_principal_redemption: bool + interest_calculation_base: int + accrued_interest: int + nominal_interest_rate: int + rate_reset_spread: int + rate_reset_multiplier: int + rate_reset_floor: int + rate_reset_cap: int + rate_reset_next: int + has_rate_reset_floor: bool + has_rate_reset_cap: bool + reserved_principal: int + reserved_interest: int + cumulative_interest_index: int + cumulative_principal_index: int + event_cursor: int + schedule_entry_count: int + fixed_point_scale: int + + +@dataclass(frozen=True, slots=True) +class FundingResult: + funded_interest: int + funded_principal: int + total_funded: int + processed_events: int + timestamp: int + + +@dataclass(frozen=True, slots=True) +class ClaimResult: + interest_amount: int + principal_amount: int + total_amount: int + timestamp: int + context: bytes + + +@dataclass(frozen=True, slots=True) +class AccountValuation: + valuation_timestamp: int + position: AccountPosition + principal_share: int + claimable_interest: int + claimable_principal: int + accrued_interest_not_due: int + economic_value_total: int + + +@dataclass(frozen=True, slots=True) +class TradeQuoteInput: + clean_total_base_units: int | None = None + clean_per_unit_base_units: Decimal | int | str | None = None + clean_price_per_100: Decimal | int | str | None = None + + def resolve(self, *, units: int, pricing_context: PricingContext | None) -> Decimal: + supplied = [ + self.clean_total_base_units is not None, + self.clean_per_unit_base_units is not None, + self.clean_price_per_100 is not None, + ] + if sum(supplied) != 1: + raise ValueError("exactly one clean quote input must be supplied") + + if self.clean_total_base_units is not None: + return Decimal(self.clean_total_base_units) + + if self.clean_per_unit_base_units is not None: + return Decimal(str(self.clean_per_unit_base_units)) * Decimal(units) + + if pricing_context is None: + raise ValueError( + "clean_price_per_100 requires a pricing context with notional_unit_value" + ) + return ( + Decimal(str(self.clean_price_per_100)) + / Decimal(100) + * Decimal(pricing_context.notional_unit_value) + * Decimal(units) + ) + + +@dataclass(frozen=True, slots=True) +class TradeQuote: + trade_side: Literal["buy", "sell"] + units: int + valuation_timestamp: int + principal_share_total: int + accrued_interest_not_due_total: int + economic_value_total: int + seller_retained_claimable_interest: int + seller_retained_claimable_principal: int + par_reference_clean_total: int + par_reference_dirty_total: int + market_clean_total: Decimal | None = None + market_dirty_total: Decimal | None = None + market_clean_per_unit: Decimal | None = None + market_dirty_per_unit: Decimal | None = None + + +@dataclass(frozen=True, slots=True) +class OtcDvpDraft: + buyer_address: str + seller_address: str + sender_holding_address: str + receiver_holding_address: str + units: int + payment_amount: int + payment_asset_id: int | None + payment_transaction: Transaction + quote: TradeQuote | None + composer: _GeneratedDasaComposer + + def send(self, send_params: SendParams | None = None) -> object: + return self.composer.send(send_params) + + def simulate( + self, + *, + allow_more_logs: bool | None = None, + allow_empty_signatures: bool | None = None, + allow_unnamed_resources: bool | None = None, + extra_opcode_budget: int | None = None, + exec_trace_config: SimulateTraceConfig | None = None, + simulation_round: int | None = None, + skip_signatures: bool | None = None, + ) -> object: + return self.composer.simulate( + allow_more_logs=allow_more_logs, + allow_empty_signatures=allow_empty_signatures, + allow_unnamed_resources=allow_unnamed_resources, + extra_opcode_budget=extra_opcode_budget, + exec_trace_config=exec_trace_config, + simulation_round=simulation_round, + skip_signatures=skip_signatures, + ) + + +def _scaled_mul_div(multiplicand: int, multiplier: int, divisor: int) -> int: + if multiplicand == 0 or multiplier == 0: + return 0 + return multiplicand * multiplier // divisor + + +def _amount_to_index_delta( + amount: int, *, total_units: int, fixed_point_scale: int +) -> int: + if amount == 0: + return 0 + if total_units <= 0: + raise ValueError("total_units must be positive") + return _scaled_mul_div(amount, fixed_point_scale, total_units) + + +def _index_delta_to_amount( + index_delta: int, + *, + units: int, + fixed_point_scale: int, +) -> int: + if index_delta == 0 or units == 0: + return 0 + return _scaled_mul_div(units, index_delta, fixed_point_scale) + + +def _share_amount( + amount: int, + *, + units: int, + total_units: int, + fixed_point_scale: int, +) -> int: + index_delta = _amount_to_index_delta( + amount, + total_units=total_units, + fixed_point_scale=fixed_point_scale, + ) + return _index_delta_to_amount( + index_delta, + units=units, + fixed_point_scale=fixed_point_scale, + ) + + +def _latest_timestamp(client: _GeneratedDasaClient) -> int: + algod = client.algorand.client.algod + status = cast(dict[str, int], algod.status()) + block_info = cast(dict[str, object], algod.block_info(status["last-round"])) + block = cast(dict[str, int], block_info["block"]) + return int(block["ts"]) + + +def _normalize_result( + *, + normalized: NormalizationResult | None, + contract: ContractAttributes | None, + denomination_asset_id: int | None, + denomination_asset_decimals: int | None, + notional_unit_value: int | float | Decimal | None, + secondary_market_opening_date: int | None, + secondary_market_closure_date: int | None, + preprocessed_events: Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None, +) -> NormalizationResult: + if normalized is not None: + if contract is not None: + raise ValueError("pass either normalized or contract attributes, not both") + return normalized + + if contract is None: + raise ValueError("normalized or contract attributes are required") + + required_values = { + "denomination_asset_id": denomination_asset_id, + "denomination_asset_decimals": denomination_asset_decimals, + "notional_unit_value": notional_unit_value, + "secondary_market_opening_date": secondary_market_opening_date, + "secondary_market_closure_date": secondary_market_closure_date, + } + missing = [name for name, value in required_values.items() if value is None] + if missing: + raise ValueError( + f"missing normalization inputs for contract attributes: {', '.join(missing)}" + ) + + return normalize_contract_attributes( + contract, + denomination_asset_id=cast(int, denomination_asset_id), + denomination_asset_decimals=cast(int, denomination_asset_decimals), + notional_unit_value=cast(int | float | Decimal, notional_unit_value), + secondary_market_opening_date=cast(int, secondary_market_opening_date), + secondary_market_closure_date=cast(int, secondary_market_closure_date), + preprocessed_events=preprocessed_events, + ) + + +def _maybe_activate_reserved_units( + position: AccountPosition, + *, + state: ContractState, +) -> AccountPosition: + if state.status == enums.STATUS_PENDING_IED or position.reserved_units == 0: + return position + return AccountPosition( + units=position.units + position.reserved_units, + reserved_units=0, + payment_address=position.payment_address, + suspended=position.suspended, + settled_cursor=position.settled_cursor, + interest_checkpoint=position.interest_checkpoint, + principal_checkpoint=position.principal_checkpoint, + claimable_interest=position.claimable_interest, + claimable_principal=position.claimable_principal, + ) + + +def _actualize_position( + position: AccountPosition, *, state: ContractState +) -> AccountPosition: + preview = _maybe_activate_reserved_units(position, state=state) + interest_delta = state.cumulative_interest_index - preview.interest_checkpoint + principal_delta = state.cumulative_principal_index - preview.principal_checkpoint + if interest_delta < 0 or principal_delta < 0: + raise ValueError("account checkpoints are ahead of global cumulative indices") + claimable_interest = preview.claimable_interest + _index_delta_to_amount( + interest_delta, + units=preview.units, + fixed_point_scale=state.fixed_point_scale, + ) + claimable_principal = preview.claimable_principal + _index_delta_to_amount( + principal_delta, + units=preview.units, + fixed_point_scale=state.fixed_point_scale, + ) + return AccountPosition( + units=preview.units, + reserved_units=preview.reserved_units, + payment_address=preview.payment_address, + suspended=preview.suspended, + settled_cursor=state.event_cursor, + interest_checkpoint=state.cumulative_interest_index, + principal_checkpoint=state.cumulative_principal_index, + claimable_interest=claimable_interest, + claimable_principal=claimable_principal, + ) + + +class ContractView: + def __init__( + self, + client: _GeneratedDasaClient, + *, + pricing_context: PricingContext | None = None, + ) -> None: + self._client = client + self._pricing_context = pricing_context + + @property + def raw_client(self) -> _GeneratedDasaClient: + return self._client + + @property + def pricing_context(self) -> PricingContext | None: + return self._pricing_context + + def get_state(self) -> ContractState: + global_state = self._client.state.global_state + return ContractState( + arranger=global_state.arranger, + op_daemon=global_state.op_daemon, + contract_suspended=bool(global_state.contract_suspended), + defaulted=bool(global_state.defaulted), + status=global_state.status, + contract_type=global_state.contract_type, + denomination_asset_id=global_state.denomination_asset_id, + settlement_asset_id=global_state.settlement_asset_id, + initial_exchange_date=global_state.initial_exchange_date, + maturity_date=global_state.maturity_date, + transfer_opening_date=global_state.transfer_opening_date, + transfer_closure_date=global_state.transfer_closure_date, + day_count_convention=global_state.day_count_convention, + total_units=global_state.total_units, + reserved_units_total=global_state.reserved_units_total, + initial_exchange_amount=global_state.initial_exchange_amount, + outstanding_principal=global_state.outstanding_principal, + next_principal_redemption=global_state.next_principal_redemption, + dynamic_principal_redemption=bool( + global_state.dynamic_principal_redemption + ), + interest_calculation_base=global_state.interest_calculation_base, + accrued_interest=global_state.accrued_interest, + nominal_interest_rate=global_state.nominal_interest_rate, + rate_reset_spread=global_state.rate_reset_spread, + rate_reset_multiplier=global_state.rate_reset_multiplier, + rate_reset_floor=global_state.rate_reset_floor, + rate_reset_cap=global_state.rate_reset_cap, + rate_reset_next=global_state.rate_reset_next, + has_rate_reset_floor=bool(global_state.has_rate_reset_floor), + has_rate_reset_cap=bool(global_state.has_rate_reset_cap), + reserved_principal=global_state.reserved_principal, + reserved_interest=global_state.reserved_interest, + cumulative_interest_index=global_state.cumulative_interest_index, + cumulative_principal_index=global_state.cumulative_principal_index, + event_cursor=global_state.event_cursor, + schedule_entry_count=global_state.schedule_entry_count, + fixed_point_scale=global_state.fixed_point_scale, + ) + + def get_schedule_entry(self, event_id: int) -> ExecutionScheduleEntry | None: + state = self.get_state() + if event_id < 0 or event_id >= state.schedule_entry_count: + return None + page_index = event_id // cst.SCHEDULE_PAGE_SIZE + page_offset = event_id % cst.SCHEDULE_PAGE_SIZE + page = self._client.state.box.schedule_page.get_value(page_index) + if page is None or page_offset >= len(page): + return None + return to_sdk_schedule_entry(page[page_offset]) + + def get_next_due_event(self) -> ExecutionScheduleEntry | None: + state = self.get_state() + if state.event_cursor >= state.schedule_entry_count: + return None + return self.get_schedule_entry(state.event_cursor) + + def get_arranger(self) -> str: + return self._client.state.global_state.arranger + + def get_role_validity( + self, + role: DAsaRole, + address: str, + ) -> RoleValidityWindow | None: + if role == DAsaRole.ARRANGER: + return RoleValidityWindow(0, 0) if address == self.get_arranger() else None + if role == DAsaRole.OP_DAEMON: + return None + if int(role) not in _MANAGED_ROLE_IDS: + raise ValueError(f"unsupported role for validity lookup: {role.name}") + + if role == DAsaRole.ACCOUNT_MANAGER: + validity = self._client.state.box.account_manager.get_value(address) + elif role == DAsaRole.PRIMARY_DEALER: + validity = self._client.state.box.primary_dealer.get_value(address) + elif role == DAsaRole.TRUSTEE: + validity = self._client.state.box.trustee.get_value(address) + elif role == DAsaRole.AUTHORITY: + validity = self._client.state.box.authority.get_value(address) + else: + validity = self._client.state.box.observer.get_value(address) + + if validity is None: + return None + return RoleValidityWindow( + start=validity.role_validity_start, + end=validity.role_validity_end, + ) + + def get_address_roles( + self, + address: str, + *, + at_time: int | None = None, + ) -> AddressRoles: + if at_time is None: + timestamp = _latest_timestamp(self._client) + else: + timestamp = at_time + arranger = self._client.state.global_state.arranger + op_daemon = self._client.state.global_state.op_daemon + + def role_active(role: DAsaRole) -> bool: + validity = self.get_role_validity(role, address) + return validity is not None and validity.is_active(timestamp) + + return AddressRoles( + arranger=address == arranger and arranger != ZERO_ADDRESS, + op_daemon=address == op_daemon and op_daemon != ZERO_ADDRESS, + account_manager=role_active(DAsaRole.ACCOUNT_MANAGER), + primary_dealer=role_active(DAsaRole.PRIMARY_DEALER), + trustee=role_active(DAsaRole.TRUSTEE), + authority=role_active(DAsaRole.AUTHORITY), + observer=role_active(DAsaRole.OBSERVER), + ) + + +class _BoundRole: + def __init__(self, app: DAsa, account: SigningAccount) -> None: + self._app = app + self._account = account + self._client = app.raw_client.clone( + default_sender=account.address, + default_signer=account.signer, + ) + + @property + def raw_client(self) -> _GeneratedDasaClient: + return self._client + + @property + def account(self) -> SigningAccount: + return self._account + + @property + def contract(self) -> ContractView: + return self._app.contract + + +class ArrangerRole(_BoundRole): + def configure( + self, + normalized: NormalizationResult, + *, + prospectus_url: str = "", + prospectus_hash: bytes | None = None, + ) -> int: + result = self._client.send.contract_config( + ContractConfigArgs( + terms=to_client_terms(normalized), + initial_state=to_client_initial_state(normalized), + prospectus=to_client_prospectus( + url=prospectus_url, + hash_bytes=prospectus_hash, + ), + ), + params=CommonAppCallParams(max_fee=DEFAULT_CONFIG_FEE), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + return cast(int, result.abi_return) + + def configure_from_attributes( + self, + contract: ContractAttributes, + *, + denomination_asset_id: int, + denomination_asset_decimals: int, + notional_unit_value: int | float | Decimal, + secondary_market_opening_date: int, + secondary_market_closure_date: int, + preprocessed_events: ( + Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None + ) = None, + prospectus_url: str = "", + prospectus_hash: bytes | None = None, + ) -> NormalizationResult: + normalized = normalize_contract_attributes( + contract, + denomination_asset_id=denomination_asset_id, + denomination_asset_decimals=denomination_asset_decimals, + notional_unit_value=notional_unit_value, + secondary_market_opening_date=secondary_market_opening_date, + secondary_market_closure_date=secondary_market_closure_date, + preprocessed_events=preprocessed_events, + ) + self.configure( + normalized, + prospectus_url=prospectus_url, + prospectus_hash=prospectus_hash, + ) + return normalized + + def upload_schedule( + self, + normalized: NormalizationResult, + *, + page_size: int = cst.SCHEDULE_PAGE_SIZE, + ) -> tuple[int, ...]: + timestamps: list[int] = [] + pages = normalized.schedule_pages(page_size) + for index, page in enumerate(pages): + result = self._client.send.contract_schedule( + ContractScheduleArgs( + schedule_page_index=index, + is_last_page=index == len(pages) - 1, + schedule_page=to_client_schedule_page(page), + ), + params=CommonAppCallParams(max_fee=DEFAULT_CONFIG_FEE), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + timestamps.append(cast(int, result.abi_return)) + return tuple(timestamps) + + def configure_contract( + self, + *, + normalized: NormalizationResult | None = None, + contract: ContractAttributes | None = None, + denomination_asset_id: int | None = None, + denomination_asset_decimals: int | None = None, + notional_unit_value: int | float | Decimal | None = None, + secondary_market_opening_date: int | None = None, + secondary_market_closure_date: int | None = None, + preprocessed_events: ( + Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None + ) = None, + prospectus_url: str = "", + prospectus_hash: bytes | None = None, + page_size: int = cst.SCHEDULE_PAGE_SIZE, + transfer_opening_date: int | None = None, + transfer_closure_date: int | None = None, + ) -> NormalizationResult: + resolved = _normalize_result( + normalized=normalized, + contract=contract, + denomination_asset_id=denomination_asset_id, + denomination_asset_decimals=denomination_asset_decimals, + notional_unit_value=notional_unit_value, + secondary_market_opening_date=secondary_market_opening_date, + secondary_market_closure_date=secondary_market_closure_date, + preprocessed_events=preprocessed_events, + ) + self.configure( + resolved, + prospectus_url=prospectus_url, + prospectus_hash=prospectus_hash, + ) + self.upload_schedule(resolved, page_size=page_size) + if transfer_opening_date is not None and transfer_closure_date is not None: + self.set_transfer_window( + open_date=transfer_opening_date, + closure_date=transfer_closure_date, + ) + self._app._pricing_context = PricingContext( + notional_unit_value=resolved.terms.notional_unit_value + ) + self._app.contract._pricing_context = self._app._pricing_context + return resolved + + def execute_ied(self) -> int: + result = self._client.send.contract_execute_ied() + return cast(int, result.abi_return) + + def set_transfer_window(self, *, open_date: int, closure_date: int) -> int: + result = self._client.send.transfer_set_schedule( + TransferSetScheduleArgs(open_date=open_date, closure_date=closure_date) + ) + return cast(int, result.abi_return) + + def fund_due_cashflows(self, *, max_event_count: int) -> FundingResult: + result = self._client.send.fund_due_cashflows( + FundDueCashflowsArgs(max_event_count=max_event_count) + ) + funding = cast(CashFundingResult, result.abi_return) + return FundingResult( + funded_interest=funding.funded_interest, + funded_principal=funding.funded_principal, + total_funded=funding.total_funded, + processed_events=funding.processed_events, + timestamp=funding.timestamp, + ) + + def append_observed_cash_event(self, payload: ObservedCashEventRequest) -> int: + event_id = self.contract.get_state().schedule_entry_count + result = self._client.send.append_observed_cash_event( + AppendObservedCashEventArgs( + payload=to_client_observed_cash_event(payload, event_id=event_id) + ) + ) + return cast(int, result.abi_return) + + def append_observed_cash_events( + self, + payloads: Sequence[ObservedCashEventRequest], + ) -> tuple[int, ...]: + timestamps: list[int] = [] + for payload in payloads: + timestamps.append(self.append_observed_cash_event(payload)) + return tuple(timestamps) + + def apply_non_cash_event( + self, *, event_id: int, payload: ObservedEventRequest + ) -> int: + payload_event_id = ( + self.contract.get_state().schedule_entry_count + if payload.flags & enums.FLAG_OBSERVED_EVENT + else event_id + ) + result = self._client.send.apply_non_cash_event( + ApplyNonCashEventArgs( + event_id=event_id, + payload=to_client_observed_event(payload, event_id=payload_event_id), + ) + ) + return cast(int, result.abi_return) + + def rotate_arranger(self, new_arranger: str) -> int: + result = self._client.send.rbac_rotate_arranger( + RbacRotateArrangerArgs(new_arranger=new_arranger) + ) + return cast(int, result.abi_return) + + def set_op_daemon(self, address: str) -> int: + result = self._client.send.rbac_set_op_daemon( + RbacSetOpDaemonArgs(address=address) + ) + return cast(int, result.abi_return) + + def assign_role( + self, + role: DAsaRole, + address: str, + *, + validity: RoleValidityWindow | None = None, + ) -> int: + validity_window = validity or RoleValidityWindow(0, DEFAULT_ROLE_VALIDITY_END) + result = self._client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=int(role), + role_address=address, + validity=to_client_role_validity( + start=validity_window.start, + end=validity_window.end, + ), + ) + ) + return cast(int, result.abi_return) + + def revoke_role(self, role: DAsaRole, address: str) -> int: + result = self._client.send.rbac_revoke_role( + RbacRevokeRoleArgs(role_id=int(role), role_address=address) + ) + return cast(int, result.abi_return) + + +class AccountManagerRole(_BoundRole): + def open_account(self, *, holding_address: str, payment_address: str) -> int: + result = self._client.send.account_open( + AccountOpenArgs( + holding_address=holding_address, + payment_address=payment_address, + ) + ) + return cast(int, result.abi_return) + + +class PrimaryDealerRole(_BoundRole): + def primary_distribution(self, *, holding_address: str, units: int) -> int: + result = self._client.send.primary_distribution( + PrimaryDistributionArgs(holding_address=holding_address, units=units) + ) + return cast(int, result.abi_return) + + +class TrusteeRole(_BoundRole): + def set_default(self, *, defaulted: bool) -> int: + result = self._client.send.rbac_contract_default( + RbacContractDefaultArgs(defaulted=defaulted) + ) + return cast(int, result.abi_return) + + +class AuthorityRole(_BoundRole): + def suspend_account(self, *, holding_address: str, suspended: bool) -> int: + result = self._client.send.account_suspension( + AccountSuspensionArgs(holding_address=holding_address, suspended=suspended) + ) + return cast(int, result.abi_return) + + def set_contract_suspension(self, *, suspended: bool) -> int: + result = self._client.send.rbac_contract_suspension( + RbacContractSuspensionArgs(suspended=suspended) + ) + return cast(int, result.abi_return) + + +class ObserverRole(_BoundRole): + def apply_non_cash_event( + self, *, event_id: int, payload: ObservedEventRequest + ) -> int: + result = self._client.send.apply_non_cash_event( + ApplyNonCashEventArgs( + event_id=event_id, + payload=to_client_observed_event(payload, event_id=event_id), + ) + ) + return cast(int, result.abi_return) + + +class OpDaemonRole(_BoundRole): + def claim( + self, *, holding_address: str, payment_info: bytes | str = b"" + ) -> ClaimResult: + result = self._client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=holding_address, + payment_info=payment_info, + ), + params=CommonAppCallParams(max_fee=DEFAULT_CLAIM_FEE), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + claim = cast(CashClaimResult, result.abi_return) + return ClaimResult( + interest_amount=claim.interest_amount, + principal_amount=claim.principal_amount, + total_amount=claim.total_amount, + timestamp=claim.timestamp, + context=claim.context, + ) + + +class HoldingAccount(_BoundRole): + def __init__( + self, + app: DAsa, + account: SigningAccount, + *, + holding_address: str | None = None, + ) -> None: + super().__init__(app, account) + self._holding_address = holding_address or account.address + + @property + def holding_address(self) -> str: + return self._holding_address + + def get_raw_position(self) -> AccountPosition: + position = self._app.raw_client.state.box.account.get_value( + self.holding_address + ) + if position is None: + raise ValueError(f"unknown holding address: {self.holding_address}") + return to_sdk_account_position(position) + + def get_actualized_position(self, at_time: int | None = None) -> AccountPosition: + if at_time is not None: + self._resolve_quote_timestamp(at_time) + return _actualize_position( + self.get_raw_position(), + state=self.contract.get_state(), + ) + + def get_valuation(self, at_time: int | None = None) -> AccountValuation: + valuation_timestamp = self._resolve_quote_timestamp(at_time) + state = self.contract.get_state() + position = self.get_actualized_position(valuation_timestamp) + principal_share = _share_amount( + state.outstanding_principal, + units=position.units, + total_units=state.total_units, + fixed_point_scale=state.fixed_point_scale, + ) + accrued_interest_not_due = self._accrued_interest_not_due( + state=state, + units=position.units, + at_time=valuation_timestamp, + ) + return AccountValuation( + valuation_timestamp=valuation_timestamp, + position=position, + principal_share=principal_share, + claimable_interest=position.claimable_interest, + claimable_principal=position.claimable_principal, + accrued_interest_not_due=accrued_interest_not_due, + economic_value_total=( + principal_share + + position.claimable_interest + + position.claimable_principal + + accrued_interest_not_due + ), + ) + + def quote_trade( + self, + units: int, + *, + at_time: int | None = None, + trade_side: Literal["buy", "sell"] = "sell", + clean_quote: TradeQuoteInput | None = None, + ) -> TradeQuote: + if trade_side not in {"buy", "sell"}: + raise ValueError("trade_side must be 'buy' or 'sell'") + valuation_timestamp = self._resolve_quote_timestamp(at_time) + state = self.contract.get_state() + next_due_event = self.contract.get_next_due_event() + if ( + next_due_event is not None + and next_due_event.scheduled_time <= valuation_timestamp + ): + raise ValueError("cannot quote while a due ACTUS event is pending") + self._assert_transfer_is_open(state=state, at_time=valuation_timestamp) + + valuation = self.get_valuation(valuation_timestamp) + if units <= 0: + raise ValueError("units must be greater than zero") + if units > valuation.position.units: + raise ValueError("units exceed the actualized active balance") + + principal_share_total = _share_amount( + state.outstanding_principal, + units=units, + total_units=state.total_units, + fixed_point_scale=state.fixed_point_scale, + ) + accrued_interest_not_due_total = self._accrued_interest_not_due( + state=state, + units=units, + at_time=valuation_timestamp, + ) + par_reference_clean_total = principal_share_total + par_reference_dirty_total = ( + principal_share_total + accrued_interest_not_due_total + ) + + market_clean_total: Decimal | None = None + market_dirty_total: Decimal | None = None + market_clean_per_unit: Decimal | None = None + market_dirty_per_unit: Decimal | None = None + if clean_quote is not None: + market_clean_total = clean_quote.resolve( + units=units, + pricing_context=self._app.pricing_context, + ) + market_dirty_total = market_clean_total + Decimal( + accrued_interest_not_due_total + ) + market_clean_per_unit = market_clean_total / Decimal(units) + market_dirty_per_unit = market_dirty_total / Decimal(units) + + return TradeQuote( + trade_side=trade_side, + units=units, + valuation_timestamp=valuation_timestamp, + principal_share_total=principal_share_total, + accrued_interest_not_due_total=accrued_interest_not_due_total, + economic_value_total=par_reference_dirty_total, + seller_retained_claimable_interest=valuation.claimable_interest, + seller_retained_claimable_principal=valuation.claimable_principal, + par_reference_clean_total=par_reference_clean_total, + par_reference_dirty_total=par_reference_dirty_total, + market_clean_total=market_clean_total, + market_dirty_total=market_dirty_total, + market_clean_per_unit=market_clean_per_unit, + market_dirty_per_unit=market_dirty_per_unit, + ) + + def build_otc_dvp( + self, + *, + buyer: SigningAccount, + units: int, + payment_amount: int, + payment_asset_id: int | None = None, + seller: SigningAccount | None = None, + sender_holding_address: str | None = None, + receiver_holding_address: str | None = None, + payment_receiver: str | None = None, + at_time: int | None = None, + clean_quote: TradeQuoteInput | None = None, + quote_tolerance: int | None = None, + ) -> OtcDvpDraft: + seller_account = seller or self.account + sender_address = sender_holding_address or self.holding_address + receiver_address = receiver_holding_address or buyer.address + payee = payment_receiver or seller_account.address + + if units <= 0: + raise ValueError("units must be greater than zero") + if payment_amount <= 0: + raise ValueError("payment_amount must be greater than zero") + if ( + seller_account.address == buyer.address + or sender_address == receiver_address + ): + raise ValueError("buyer and seller must be different") + if seller_account.address != sender_address: + raise ValueError( + "seller signer must match sender_holding_address for the D-ASA transfer leg" + ) + + quote: TradeQuote | None = None + if quote_tolerance is not None: + quote = self.quote_trade( + units, + at_time=at_time, + trade_side="sell", + clean_quote=clean_quote, + ) + reference_total = ( + quote.market_dirty_total + if quote.market_dirty_total is not None + else Decimal(quote.par_reference_dirty_total) + ) + delta = abs(Decimal(payment_amount) - reference_total) + if delta > Decimal(quote_tolerance): + raise ValueError( + "payment amount is outside the configured quote tolerance" + ) + + seller_client = self._app.raw_client.clone( + default_sender=seller_account.address, + default_signer=seller_account.signer, + ) + if payment_asset_id is None: + payment_transaction = seller_client.algorand.create_transaction.payment( + PaymentParams( + sender=buyer.address, + signer=buyer.signer, + receiver=payee, + amount=AlgoAmount.from_micro_algo(payment_amount), + ) + ) + else: + payment_transaction = ( + seller_client.algorand.create_transaction.asset_transfer( + AssetTransferParams( + asset_id=payment_asset_id, + amount=payment_amount, + sender=buyer.address, + signer=buyer.signer, + receiver=payee, + ) + ) + ) + + composer = ( + seller_client.new_group() + .add_transaction( + payment_transaction, + buyer.signer, + ) + .transfer( + TransferArgs( + sender_holding_address=sender_address, + receiver_holding_address=receiver_address, + units=units, + ) + ) + ) + return OtcDvpDraft( + buyer_address=buyer.address, + seller_address=seller_account.address, + sender_holding_address=sender_address, + receiver_holding_address=receiver_address, + units=units, + payment_amount=payment_amount, + payment_asset_id=payment_asset_id, + payment_transaction=payment_transaction, + quote=quote, + composer=composer, + ) + + def transfer(self, *, receiver_holding_address: str, units: int) -> int: + if self.account.address != self.holding_address: + raise ValueError( + "transfer requires a signer that matches the holding address" + ) + result = self._client.send.transfer( + TransferArgs( + sender_holding_address=self.holding_address, + receiver_holding_address=receiver_holding_address, + units=units, + ) + ) + return cast(int, result.abi_return) + + def claim(self, *, payment_info: bytes | str = b"") -> ClaimResult: + result = self._client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=self.holding_address, + payment_info=payment_info, + ), + params=CommonAppCallParams(max_fee=DEFAULT_CLAIM_FEE), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + claim = cast(CashClaimResult, result.abi_return) + return ClaimResult( + interest_amount=claim.interest_amount, + principal_amount=claim.principal_amount, + total_amount=claim.total_amount, + timestamp=claim.timestamp, + context=claim.context, + ) + + def update_payment_address(self, *, payment_address: str) -> int: + if self.account.address != self.holding_address: + raise ValueError( + "payment address updates require a signer that matches the holding address" + ) + result = self._client.send.account_update_payment_address( + AccountUpdatePaymentAddressArgs( + holding_address=self.holding_address, + payment_address=payment_address, + ) + ) + return cast(int, result.abi_return) + + def _resolve_quote_timestamp(self, at_time: int | None) -> int: + now = _latest_timestamp(self._app.raw_client) + if at_time is None: + return now + if at_time < now: + raise ValueError( + "at_time cannot be earlier than the latest on-chain timestamp" + ) + return at_time + + def _assert_transfer_is_open(self, *, state: ContractState, at_time: int) -> None: + if state.status == enums.STATUS_PENDING_IED: + raise ValueError("cannot quote or trade before IED executes") + if state.transfer_opening_date and at_time < state.transfer_opening_date: + raise ValueError("transfer window is not open yet") + if state.transfer_closure_date and at_time >= state.transfer_closure_date: + raise ValueError("transfer window is closed") + + def _accrued_interest_not_due( + self, + *, + state: ContractState, + units: int, + at_time: int, + ) -> int: + if state.status != enums.STATUS_ACTIVE or units == 0: + return 0 + if state.total_units <= 0 or state.fixed_point_scale <= 0: + return 0 + + accrued_share = _share_amount( + state.accrued_interest, + units=units, + total_units=state.total_units, + fixed_point_scale=state.fixed_point_scale, + ) + if state.event_cursor >= state.schedule_entry_count: + return accrued_share + + next_entry = self.contract.get_schedule_entry(state.event_cursor) + if next_entry is None or at_time >= next_entry.scheduled_time: + return accrued_share + start_time = self._partial_accrual_start(state=state) + if start_time is None or at_time <= start_time: + return accrued_share + + partial_factor = year_fraction_fixed( + start_time, + at_time, + day_count_convention=state.day_count_convention, + maturity_date=state.maturity_date or None, + ) + if partial_factor == 0: + return accrued_share + + period_interest = _scaled_mul_div( + state.interest_calculation_base, + state.nominal_interest_rate, + state.fixed_point_scale, + ) + partial_amount = _scaled_mul_div( + period_interest, + partial_factor, + state.fixed_point_scale, + ) + return accrued_share + _share_amount( + partial_amount, + units=units, + total_units=state.total_units, + fixed_point_scale=state.fixed_point_scale, + ) + + def _partial_accrual_start(self, *, state: ContractState) -> int | None: + if state.event_cursor == 0: + return None + previous_entry = self.contract.get_schedule_entry(state.event_cursor - 1) + if previous_entry is None: + return None + return previous_entry.scheduled_time + + +class DAsa: + def __init__( + self, + client: _GeneratedDasaClient, + *, + pricing_context: PricingContext | None = None, + ) -> None: + self._client = client + self._pricing_context = pricing_context + self.contract = ContractView(client, pricing_context=pricing_context) + + @classmethod + def deploy( + cls, + *, + algorand: AlgorandClient, + arranger: SigningAccount, + app_name: str | None = None, + send_params: SendParams | None = None, + ) -> DAsa: + factory = _GeneratedDasaFactory( + algorand, + app_name=app_name, + default_sender=arranger.address, + default_signer=arranger.signer, + ) + client, _ = factory.send.create.contract_create( + ContractCreateArgs(arranger=arranger.address), + send_params=send_params, + ) + return cls(client) + + @classmethod + def deploy_configured( + cls, + *, + algorand: AlgorandClient, + arranger: SigningAccount, + normalized: NormalizationResult | None = None, + contract: ContractAttributes | None = None, + denomination_asset_id: int | None = None, + denomination_asset_decimals: int | None = None, + notional_unit_value: int | float | Decimal | None = None, + secondary_market_opening_date: int | None = None, + secondary_market_closure_date: int | None = None, + preprocessed_events: ( + Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None + ) = None, + app_name: str | None = None, + prospectus_url: str = "", + prospectus_hash: bytes | None = None, + page_size: int = cst.SCHEDULE_PAGE_SIZE, + transfer_opening_date: int | None = None, + transfer_closure_date: int | None = None, + app_account_funding: AlgoAmount | None = DEFAULT_APP_FUNDING, + funding_account: SigningAccount | None = None, + ) -> DAsa: + resolved = _normalize_result( + normalized=normalized, + contract=contract, + denomination_asset_id=denomination_asset_id, + denomination_asset_decimals=denomination_asset_decimals, + notional_unit_value=notional_unit_value, + secondary_market_opening_date=secondary_market_opening_date, + secondary_market_closure_date=secondary_market_closure_date, + preprocessed_events=preprocessed_events, + ) + app = cls.deploy( + algorand=algorand, + arranger=arranger, + app_name=app_name, + ) + if app_account_funding is not None: + app._fund_app_account( + payer=funding_account or arranger, + amount=app_account_funding, + ) + app.arranger(arranger).configure_contract( + normalized=resolved, + prospectus_url=prospectus_url, + prospectus_hash=prospectus_hash, + page_size=page_size, + transfer_opening_date=transfer_opening_date, + transfer_closure_date=transfer_closure_date, + ) + app._pricing_context = PricingContext( + notional_unit_value=resolved.terms.notional_unit_value + ) + app.contract._pricing_context = app._pricing_context + return app + + @classmethod + def from_app_id( + cls, + *, + algorand: AlgorandClient, + app_id: int, + app_name: str | None = None, + default_sender: str | None = None, + default_signer: TransactionSigner | None = None, + pricing_context: PricingContext | None = None, + ) -> DAsa: + return cls( + _GeneratedDasaClient( + algorand=algorand, + app_id=app_id, + app_name=app_name, + default_sender=default_sender, + default_signer=default_signer, + ), + pricing_context=pricing_context, + ) + + @classmethod + def from_client( + cls, + client: _GeneratedDasaClient, + *, + pricing_context: PricingContext | None = None, + ) -> DAsa: + return cls(client, pricing_context=pricing_context) + + @property + def raw_client(self) -> _GeneratedDasaClient: + return self._client + + @property + def pricing_context(self) -> PricingContext | None: + return self._pricing_context + + @property + def app_id(self) -> int: + return self._client.app_id + + @property + def app_address(self) -> str: + return self._client.app_address + + def arranger(self, account: SigningAccount) -> ArrangerRole: + return ArrangerRole(self, account) + + def account( + self, + holding_account: SigningAccount, + holding_address: str | None = None, + ) -> HoldingAccount: + return HoldingAccount(self, holding_account, holding_address=holding_address) + + def account_manager(self, account: SigningAccount) -> AccountManagerRole: + return AccountManagerRole(self, account) + + def primary_dealer(self, account: SigningAccount) -> PrimaryDealerRole: + return PrimaryDealerRole(self, account) + + def trustee(self, account: SigningAccount) -> TrusteeRole: + return TrusteeRole(self, account) + + def authority(self, account: SigningAccount) -> AuthorityRole: + return AuthorityRole(self, account) + + def observer(self, account: SigningAccount) -> ObserverRole: + return ObserverRole(self, account) + + def op_daemon(self, account: SigningAccount) -> OpDaemonRole: + return OpDaemonRole(self, account) + + def _fund_app_account(self, *, payer: SigningAccount, amount: AlgoAmount) -> None: + self._client.algorand.send.payment( + PaymentParams( + sender=payer.address, + signer=payer.signer, + receiver=self.app_address, + amount=amount, + ) + ) diff --git a/src/d_asa/day_count.py b/src/d_asa/day_count.py new file mode 100644 index 00000000..e762d690 --- /dev/null +++ b/src/d_asa/day_count.py @@ -0,0 +1,410 @@ +from calendar import monthrange +from datetime import datetime +from enum import IntEnum + +from . import constants as cst +from . import enums +from .errors import ActusNormalizationError +from .unix_time import UTCTimeStamp, timestamp_to_datetime + + +class DayCountConvention(IntEnum): + """ + Day Count Convention (DCC). + + Method defining how days are counted between two dates. This defines the + year fraction in accrual calculations for interest and other computations. + + The day count convention affects how interest accrues over time by defining: + - How many days are in a month + - How many days are in a year + - Special rules for month-end dates + """ + + ACTUAL_ACTUAL = enums.DCC_AA + """Actual/Actual (AA): Year fractions accrue on the basis of the actual + number of days per month and per year in the respective period.""" + + ACTUAL_360 = enums.DCC_A360 + """Actual/360 (A360): Year fractions accrue on the basis of the actual + number of days per month and 360 days per year in the respective period.""" + + ACTUAL_365 = enums.DCC_A365 + """Actual/365 (A365): Year fractions accrue on the basis of the actual + number of days per month and 365 days per year in the respective period.""" + + THIRTY_E_360_ISDA = enums.DCC_30E360ISDA + """30E/360 ISDA (30E360ISDA): Year fractions accrue on the basis of 30 days + per month and 360 days per year in the respective period (ISDA method).""" + + THIRTY_E_360 = enums.DCC_30E360 + """30E/360 (30E360): Year fractions accrue on the basis of 30 days per month + and 360 days per year in the respective period.""" + + # Aliases for convenience + AA = ACTUAL_ACTUAL + A360 = ACTUAL_360 + A365 = ACTUAL_365 + E30_360_ISDA = THIRTY_E_360_ISDA + E30_360 = THIRTY_E_360 + + +class Calendar(IntEnum): + """ + Calendar (CLDR). + + Calendar defines the non-working days which affect the dates of contract + events (CDE's) in combination with EOMC and BDC. Custom calendars can be + added as additional enum options. + """ + + NO_CALENDAR = enums.CLDR_NC + """No holidays defined.""" + + MONDAY_TO_FRIDAY = enums.CLDR_MF + """Saturdays and Sundays are holidays.""" + + # Aliases for convenience + NC = NO_CALENDAR + MF = MONDAY_TO_FRIDAY + + +class EndOfMonthConvention(IntEnum): + """ + End of Month Convention (EOMC). + + When computing schedules a special problem arises if an anchor date is at + the end of a month and a cycle of monthly or quarterly is applied (yearly + in the case of leap years only). How do we have to interpret an anchor date + April 30 plus 1M cycles? + + - EOM: Will jump to the 31st of May, then June 30, July 31 and so on. + - SD: Will jump to the 30th always with an exception in February. + + This logic applies for all months having 30 or less days and an anchor date + at the last day. Months with 31 days will at any rate jump to the last of + the month if anchor date is on the last day. + """ + + SAME_DAY = enums.EOMC_SD + """Schedule times always fall on the schedule anchor date day of the month.""" + + END_OF_MONTH = enums.EOMC_EOM + """Schedule times fall on the end of every month if the anchor date represents + the last day of the respective month.""" + + # Aliases for convenience + SD = SAME_DAY + EOM = END_OF_MONTH + + +def is_end_of_month(value: datetime) -> bool: + """Return whether the datetime falls on its month's final day.""" + + return value.day == monthrange(value.year, value.month)[1] + + +def is_business_day(timestamp: UTCTimeStamp, calendar: Calendar = Calendar.NC) -> bool: + """Return whether a UTC UNIX timestamp falls on a business day for a named calendar.""" + + if calendar == Calendar.NO_CALENDAR: + return True + + return timestamp_to_datetime(timestamp).weekday() < 5 + + +class BusinessDayConvention(IntEnum): + """ + Business Day Convention (BDC). + + BDC's are linked to a calendar. Calendars have working and non-working days. + A BDC value other than N means that cash flows cannot fall on non-working + days, they must be shifted to the next business day (following) or the + previous one (preceding). + + These two simple rules get refined twofold: + - Following modified (preceding modified): Same like following (preceding), + however if a cash flow gets shifted into a new month, then it is shifted + to preceding (following) business day. + - Shift/calculate (SC) and calculate/shift (CS). Accrual, principal, and + possibly other calculations are affected by this choice. In the case of + SC first the dates are shifted and after the shift cash flows are + calculated. In the case of CS it is the other way round. + + Note: Does not affect non-cyclical dates such as PRD, MD, TD, IPCED since + they can be set to the correct date directly. + """ + + NO_SHIFT = enums.BDC_NOS + """No shift applied to non-business days.""" + + SHIFT_CALCULATE_FOLLOWING = enums.BDC_SCF + """Shift event dates first then calculate accruals etc. Strictly shift to + the next following business day.""" + + SHIFT_CALCULATE_MODIFIED_FOLLOWING = enums.BDC_SCMF + """Shift event dates first then calculate accruals etc. Shift to the next + following business day if this falls in the same month. Shift to the most + recent preceding business day otherwise.""" + + CALCULATE_SHIFT_FOLLOWING = enums.BDC_CSF + """Calculate accruals etc. first then shift event dates. Strictly shift to + the next following business day.""" + + CALCULATE_SHIFT_MODIFIED_FOLLOWING = enums.BDC_CSMF + """Calculate accruals etc. first then shift event dates. Shift to the next + following business day if this falls in the same month. Shift to the most + recent preceding business day otherwise.""" + + SHIFT_CALCULATE_PRECEDING = enums.BDC_SCP + """Shift event dates first then calculate accruals etc. Strictly shift to + the most recent preceding business day.""" + + SHIFT_CALCULATE_MODIFIED_PRECEDING = enums.BDC_SCMP + """Shift event dates first then calculate accruals etc. Shift to the most + recent preceding business day if this falls in the same month. Shift to the + next following business day otherwise.""" + + CALCULATE_SHIFT_PRECEDING = enums.BDC_CSP + """Calculate accruals etc. first then shift event dates. Strictly shift to + the most recent preceding business day.""" + + CALCULATE_SHIFT_MODIFIED_PRECEDING = enums.BDC_CSMP + """Calculate accruals etc. first then shift event dates. Shift to the most + recent preceding business day if this falls in the same month. Shift to the + next following business day otherwise.""" + + # Aliases for convenience + NOS = NO_SHIFT + SCF = SHIFT_CALCULATE_FOLLOWING + SCMF = SHIFT_CALCULATE_MODIFIED_FOLLOWING + CSF = CALCULATE_SHIFT_FOLLOWING + CSMF = CALCULATE_SHIFT_MODIFIED_FOLLOWING + SCP = SHIFT_CALCULATE_PRECEDING + SCMP = SHIFT_CALCULATE_MODIFIED_PRECEDING + CSP = CALCULATE_SHIFT_PRECEDING + CSMP = CALCULATE_SHIFT_MODIFIED_PRECEDING + + +def adjust_to_business_day( + timestamp: UTCTimeStamp, + *, + business_day_convention: BusinessDayConvention, + calendar: Calendar = Calendar.NC, +) -> UTCTimeStamp: + """Adjust a UTC UNIX timestamp according to an ACTUS business-day convention.""" + + # No shift convention - return timestamp as-is + if business_day_convention == BusinessDayConvention.NO_SHIFT: + return timestamp + + # If already a business day, no adjustment needed + if is_business_day(timestamp, calendar): + return timestamp + + current = timestamp + original = timestamp + original_month = timestamp_to_datetime(timestamp).month + + # Following conventions (shift forward) + if business_day_convention in ( + BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_FOLLOWING, + ): + while not is_business_day(current, calendar): + current += cst.DAY_2_SEC + # Modified following: if shifted to next month, shift back to preceding + if ( + business_day_convention + in ( + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_FOLLOWING, + ) + and timestamp_to_datetime(current).month != original_month + ): + current = original + while not is_business_day(current, calendar): + current -= cst.DAY_2_SEC + + # Preceding conventions (shift backward) + elif business_day_convention in ( + BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_PRECEDING, + ): + while not is_business_day(current, calendar): + current -= cst.DAY_2_SEC + # Modified preceding: if shifted to previous month, shift forward to following + if ( + business_day_convention + in ( + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_PRECEDING, + ) + and timestamp_to_datetime(current).month != original_month + ): + current = original + while not is_business_day(current, calendar): + current += cst.DAY_2_SEC + + return current + + +def is_calculate_shift(business_day_convention: BusinessDayConvention) -> bool: + """Return whether the BDC is calculate-then-shift.""" + + return business_day_convention in ( + BusinessDayConvention.CALCULATE_SHIFT_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_PRECEDING, + ) + + +def is_shift_calculate(business_day_convention: BusinessDayConvention) -> bool: + """Return whether the BDC is shift-then-calculate.""" + + return business_day_convention in ( + BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, + ) + + +def year_fraction_fixed( + start_ts: UTCTimeStamp, + end_ts: UTCTimeStamp, + *, + day_count_convention: int, + maturity_date: UTCTimeStamp | None, +) -> int: + """Return a fixed-point year fraction for a supported day-count convention.""" + if end_ts <= start_ts: + return 0 + + if day_count_convention == DayCountConvention.A360: + return _days_between(start_ts, end_ts) * cst.FIXED_POINT_SCALE // 360 + if day_count_convention == DayCountConvention.A365: + return _days_between(start_ts, end_ts) * cst.FIXED_POINT_SCALE // 365 + if day_count_convention == DayCountConvention.AA: + return _year_fraction_actual_actual(start_ts, end_ts) + if day_count_convention == DayCountConvention.E30_360: + return _days_30e_360(start_ts, end_ts) * cst.FIXED_POINT_SCALE // 360 + if day_count_convention == DayCountConvention.E30_360_ISDA: + if maturity_date is None: + raise ActusNormalizationError("30E/360 ISDA requires maturity_date") + return ( + _days_30e_360_isda(start_ts, end_ts, maturity_date) + * cst.FIXED_POINT_SCALE + // 360 + ) + raise ActusNormalizationError("Unsupported day-count convention") + + +def days_in_month(year: int, month: int) -> int: + """Return the number of days in a Gregorian month.""" + return monthrange(year, month)[1] + + +def _year_fraction_actual_actual(start_ts: UTCTimeStamp, end_ts: UTCTimeStamp) -> int: + """Return the Actual/Actual year fraction in fixed-point form.""" + start_year, start_month, start_day = _date_parts(start_ts) + end_year, end_month, end_day = _date_parts(end_ts) + if start_year == end_year: + return ( + _days_between(start_ts, end_ts) + * cst.FIXED_POINT_SCALE + // _days_in_year(start_year) + ) + + start_day_of_year = _day_of_year(start_year, start_month, start_day) + end_day_of_year = _day_of_year(end_year, end_month, end_day) + start_fraction = ( + (_days_in_year(start_year) - (start_day_of_year - 1)) + * cst.FIXED_POINT_SCALE + // _days_in_year(start_year) + ) + full_years = max(end_year - start_year - 1, 0) * cst.FIXED_POINT_SCALE + end_fraction = ( + (end_day_of_year - 1) * cst.FIXED_POINT_SCALE // _days_in_year(end_year) + ) + return start_fraction + full_years + end_fraction + + +def _days_between(start_ts: UTCTimeStamp, end_ts: UTCTimeStamp) -> int: + """Return whole UTC days between two timestamps.""" + if end_ts <= start_ts: + return 0 + return (end_ts - start_ts) // cst.DAY_2_SEC + + +def _days_30e_360(start_ts: UTCTimeStamp, end_ts: UTCTimeStamp) -> int: + """Return the 30E/360 day-count numerator between two timestamps.""" + y1, m1, d1 = _date_parts(start_ts) + y2, m2, d2 = _date_parts(end_ts) + if d1 == 31: + d1 = 30 + if d2 == 31: + d2 = 30 + return (y2 - y1) * 360 + (m2 - m1) * 30 + (d2 - d1) + + +def _days_30e_360_isda( + start_ts: UTCTimeStamp, end_ts: UTCTimeStamp, maturity_ts: UTCTimeStamp +) -> int: + """Return the 30E/360 ISDA day-count numerator between two timestamps.""" + y1, m1, d1 = _date_parts(start_ts) + y2, m2, d2 = _date_parts(end_ts) + maturity_parts = _date_parts(maturity_ts) + if _is_last_day_of_feb(y1, m1, d1) or d1 == 31: + d1 = 30 + if (_is_last_day_of_feb(y2, m2, d2) and (y2, m2, d2) != maturity_parts) or d2 == 31: + d2 = 30 + return (y2 - y1) * 360 + (m2 - m1) * 30 + (d2 - d1) + + +def _days_30_360(start_ts: UTCTimeStamp, end_ts: UTCTimeStamp) -> int: + """Return the 30/360 bond-basis day-count numerator between two timestamps.""" + y1, m1, d1 = _date_parts(start_ts) + y2, m2, d2 = _date_parts(end_ts) + if d1 == 31: + d1 = 30 + if d1 >= 30 and d2 == 31: + d2 = 30 + return (y2 - y1) * 360 + (m2 - m1) * 30 + (d2 - d1) + + +def _date_parts(timestamp: UTCTimeStamp) -> tuple[int, int, int]: + """Return the UTC year, month, and day for a timestamp.""" + current = timestamp_to_datetime(timestamp) + return current.year, current.month, current.day + + +def _day_of_year(year: int, month: int, day: int) -> int: + """Return the ordinal day number within a year.""" + month_offsets = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334) + value = month_offsets[month - 1] + day + if month > 2 and _is_leap_year(year): + value += 1 + return value + + +def _days_in_year(year: int) -> int: + """Return the number of days in a Gregorian year.""" + return 366 if _is_leap_year(year) else 365 + + +def _is_leap_year(year: int) -> bool: + """Return whether a Gregorian year is a leap year.""" + return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0) + + +def _is_last_day_of_feb(year: int, month: int, day: int) -> bool: + """Return whether a date is the last day of February.""" + if month != 2: + return False + return day == (29 if _is_leap_year(year) else 28) diff --git a/src/d_asa/enums.py b/src/d_asa/enums.py new file mode 100644 index 00000000..c0cfdcd3 --- /dev/null +++ b/src/d_asa/enums.py @@ -0,0 +1,122 @@ +"""Copy of smart_contracts/enums.py""" + +from typing import Final + +################################################################################ +# AVM Contract Status +################################################################################ +STATUS_INACTIVE: Final[int] = 0 +STATUS_PENDING_IED: Final[int] = 50 +STATUS_ACTIVE: Final[int] = 100 +STATUS_ENDED: Final[int] = 200 + +################################################################################ +# ACTUS Contract Types +################################################################################ +CT_PAM: Final[int] = 0 +CT_ANN: Final[int] = 1 +CT_NAM: Final[int] = 2 +CT_LAM: Final[int] = 3 +CT_LAX: Final[int] = 4 +CT_CLM: Final[int] = 5 + +################################################################################ +# ACTUS Event types +################################################################################ +EVT_AD: Final[int] = 0 +EVT_IED: Final[int] = 1 +EVT_PR: Final[int] = 3 +EVT_PI: Final[int] = 4 +EVT_PRF: Final[int] = 5 +EVT_PY: Final[int] = 6 +EVT_PP: Final[int] = 7 +EVT_IP: Final[int] = 8 +EVT_RRF: Final[int] = 11 +EVT_RR: Final[int] = 12 +EVT_IPCB: Final[int] = 18 +EVT_MD: Final[int] = 19 + +################################################################################ +# Event flags +################################################################################ +FLAG_CASH_EVENT: Final[int] = 1 << 0 +FLAG_NON_CASH_EVENT: Final[int] = 1 << 1 +FLAG_OBSERVED_EVENT: Final[int] = 1 << 2 +FLAG_INITIAL_PRF: Final[int] = 1 << 3 + +################################################################################ +# Day-count Conventions +################################################################################ +DCC_AA: Final[int] = 0 +DCC_A360: Final[int] = 1 +DCC_A365: Final[int] = 2 +DCC_30E360ISDA: Final[int] = 3 +DCC_30E360: Final[int] = 4 + +################################################################################ +# Calendar +################################################################################ +CLDR_NC: Final[int] = 0 +CLDR_MF: Final[int] = 1 +CLDR_CUST: Final[int] = 255 + +################################################################################ +# Business Day Convention +################################################################################ +BDC_NOS: Final[int] = 0 +BDC_SCF: Final[int] = 1 +BDC_SCMF: Final[int] = 2 +BDC_CSF: Final[int] = 3 +BDC_CSMF: Final[int] = 4 +BDC_SCP: Final[int] = 5 +BDC_SCMP: Final[int] = 6 +BDC_CSP: Final[int] = 7 +BDC_CSMP: Final[int] = 8 + +################################################################################ +# End of Month Convention +################################################################################ +EOMC_SD: Final[int] = 0 +EOMC_EOM: Final[int] = 1 + +################################################################################ +# Prepayment Effect +################################################################################ +PPEF_N: Final[int] = 0 +PPEF_A: Final[int] = 1 +PPEF_M: Final[int] = 2 + +################################################################################ +# Penalty Type +################################################################################ +PYTP_N: Final[int] = 0 +PYTP_A: Final[int] = 1 +PYTP_R: Final[int] = 2 +PYTP_I: Final[int] = 3 + +################################################################################ +# Contract Performance +################################################################################ +PRF_PERFORMANT: Final[int] = 0 +PRF_DELAYED: Final[int] = 1 +PRF_DELINQUENT: Final[int] = 2 +PRF_DEFAULTED: Final[int] = 3 +PRF_MATURED: Final[int] = 4 +PRF_TERMINATED: Final[int] = 5 + +################################################################################ +# Role IDs +################################################################################ +ROLE_ARRANGER: Final[int] = 20 +ROLE_OP_DAEMON: Final[int] = 25 +ROLE_ACCOUNT_MANAGER: Final[int] = 40 +ROLE_PRIMARY_DEALER: Final[int] = 50 +ROLE_TRUSTEE: Final[int] = 60 +ROLE_AUTHORITY: Final[int] = 70 +ROLE_OBSERVER: Final[int] = 80 + +################################################################################ +# Payoff Sign +################################################################################ +PAYOFF_SIGN_POSITIVE: Final[int] = 1 +PAYOFF_SIGN_NEGATIVE: Final[int] = 255 diff --git a/src/d_asa/errors.py b/src/d_asa/errors.py new file mode 100644 index 00000000..ca931c17 --- /dev/null +++ b/src/d_asa/errors.py @@ -0,0 +1,10 @@ +class ActusNormalizationError(ValueError): + """Raised when raw ACTUS attributes cannot be normalized for AVM use.""" + + pass + + +class UnsupportedActusFeatureError(ActusNormalizationError): + """Raised when normalization encounters an out-of-scope ACTUS feature.""" + + pass diff --git a/src/d_asa/localnet.py b/src/d_asa/localnet.py new file mode 100644 index 00000000..3840ac9f --- /dev/null +++ b/src/d_asa/localnet.py @@ -0,0 +1,487 @@ +from __future__ import annotations + +import argparse +import os +import struct +import time +from base64 import b64decode +from dataclasses import dataclass +from typing import Any +from urllib.error import URLError + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + PaymentParams, + SendAppTransactionResult, + SigningAccount, +) +from algokit_utils.config import config as algokit_config +from algokit_utils.models.network import AlgoClientNetworkConfig +from algosdk.kmd import KMDClient +from algosdk.v2client.algod import AlgodClient + +from . import enums +from .artifacts.dasa_client import AccountGetPositionArgs + +DEFAULT_LOCALNET_HOST = "localhost" +DEFAULT_LOCALNET_TOKEN = "a" * 64 +DEFAULT_ALGOD_PORT = 4001 +DEFAULT_KMD_PORT = 4002 +DEFAULT_INDEXER_PORT = 8980 +DEFAULT_INITIAL_ALGO_FUNDS = AlgoAmount.from_algo(10_000) +ROUND_WARP_MAX_ATTEMPTS = 3 + + +@dataclass(frozen=True, slots=True) +class LocalNetConfig: + host: str = DEFAULT_LOCALNET_HOST + token: str = DEFAULT_LOCALNET_TOKEN + algod_port: int = DEFAULT_ALGOD_PORT + kmd_port: int = DEFAULT_KMD_PORT + indexer_port: int = DEFAULT_INDEXER_PORT + algod_host: str | None = None + kmd_host: str | None = None + indexer_host: str | None = None + + @property + def server(self) -> str: + return f"http://{self.host}" + + @property + def algod_server(self) -> str: + return f"http://{self.algod_host or self.host}" + + @property + def kmd_server(self) -> str: + return f"http://{self.kmd_host or self.host}" + + @property + def indexer_server(self) -> str: + return f"http://{self.indexer_host or self.host}" + + @property + def algod_address(self) -> str: + return f"{self.algod_server}:{self.algod_port}" + + @property + def kmd_address(self) -> str: + return f"{self.kmd_server}:{self.kmd_port}" + + @property + def indexer_address(self) -> str: + return f"{self.indexer_server}:{self.indexer_port}" + + def algod_client_config(self) -> AlgoClientNetworkConfig: + return AlgoClientNetworkConfig( + server=self.algod_server, + token=self.token, + port=self.algod_port, + ) + + def indexer_client_config(self) -> AlgoClientNetworkConfig: + return AlgoClientNetworkConfig( + server=self.indexer_server, + token=self.token, + port=self.indexer_port, + ) + + def kmd_client_config(self) -> AlgoClientNetworkConfig: + return AlgoClientNetworkConfig( + server=self.kmd_server, + token=self.token, + port=self.kmd_port, + ) + + +@dataclass(frozen=True, slots=True) +class Currency: + id: int + total: int + decimals: int + name: str + unit_name: str + asa_to_unit: float + + +@dataclass(kw_only=True) +class DAsaAccountManager(SigningAccount): + @classmethod + def role_id(cls) -> int: + return enums.ROLE_ACCOUNT_MANAGER + + +@dataclass(kw_only=True) +class DAsaPrimaryDealer(SigningAccount): + @classmethod + def role_id(cls) -> int: + return enums.ROLE_PRIMARY_DEALER + + +@dataclass(kw_only=True) +class DAsaTrustee(SigningAccount): + @classmethod + def role_id(cls) -> int: + return enums.ROLE_TRUSTEE + + +@dataclass(kw_only=True) +class DAsaAuthority(SigningAccount): + @classmethod + def role_id(cls) -> int: + return enums.ROLE_AUTHORITY + + +@dataclass(kw_only=True) +class DAsaInterestOracle(SigningAccount): + @classmethod + def role_id(cls) -> int: + return enums.ROLE_OBSERVER + + +@dataclass(kw_only=True) +class DAsaAccount(SigningAccount): + holding_address: str + d_asa_client: Any + + @property + def payment_address(self) -> str: + return self.d_asa_client.send.account_get_position( + AccountGetPositionArgs( + holding_address=self.holding_address, + ) + ).abi_return.payment_address + + @property + def units(self) -> int: + return self.d_asa_client.send.account_get_position( + AccountGetPositionArgs(holding_address=self.holding_address) + ).abi_return.units + + @property + def suspended(self) -> bool: + return self.d_asa_client.send.account_get_position( + AccountGetPositionArgs(holding_address=self.holding_address) + ).abi_return.suspended + + +def load_localnet_config(default_host: str = DEFAULT_LOCALNET_HOST) -> LocalNetConfig: + return LocalNetConfig( + host=os.getenv("D_ASA_LOCALNET_HOST", default_host), + token=os.getenv("D_ASA_LOCALNET_TOKEN", DEFAULT_LOCALNET_TOKEN), + algod_port=int(os.getenv("D_ASA_ALGOD_PORT", str(DEFAULT_ALGOD_PORT))), + kmd_port=int(os.getenv("D_ASA_KMD_PORT", str(DEFAULT_KMD_PORT))), + indexer_port=int(os.getenv("D_ASA_INDEXER_PORT", str(DEFAULT_INDEXER_PORT))), + algod_host=os.getenv("D_ASA_ALGOD_HOST"), + kmd_host=os.getenv("D_ASA_KMD_HOST"), + indexer_host=os.getenv("D_ASA_INDEXER_HOST"), + ) + + +def algorand_client_from_localnet( + localnet_config: LocalNetConfig | None = None, +) -> AlgorandClient: + localnet = localnet_config or load_localnet_config() + algokit_config.configure( + debug=True, + populate_app_call_resources=True, + ) + client = AlgorandClient.from_config( + algod_config=localnet.algod_client_config(), + indexer_config=localnet.indexer_client_config(), + kmd_config=localnet.kmd_client_config(), + ) + client.set_suggested_params_cache_timeout(0) + return client + + +def get_last_round(algod_client: AlgodClient) -> int: + return int(algod_client.status()["last-round"]) # type: ignore[index] + + +def get_latest_timestamp(algod_client: AlgodClient) -> int: + block = algod_client.block_info(get_last_round(algod_client))["block"] # type: ignore[index] + return int(block["ts"]) # type: ignore[index] + + +def round_warp( + to_round: int | None = None, + *, + algorand: AlgorandClient | None = None, + localnet_config: LocalNetConfig | None = None, +) -> None: + algorand_client = algorand or algorand_client_from_localnet(localnet_config) + dispenser = algorand_client.account.localnet_dispenser() + if to_round is not None: + last_round = get_last_round(algorand_client.client.algod) + if to_round <= last_round: + raise ValueError("to_round must be greater than the latest round") + n_rounds = to_round - last_round + else: + n_rounds = 1 + + for _ in range(n_rounds): + for attempt in range(1, ROUND_WARP_MAX_ATTEMPTS + 1): + try: + algorand_client.send.payment( + PaymentParams( + signer=dispenser.signer, + sender=dispenser.address, + receiver=dispenser.address, + amount=AlgoAmount.from_algo(0), + ) + ) + break + except (TimeoutError, URLError, ConnectionError): + if attempt == ROUND_WARP_MAX_ATTEMPTS: + raise + wait_for_algod( + localnet_config=localnet_config, + timeout_seconds=15.0, + poll_interval_seconds=1.0, + ) + + +def time_warp( + to_timestamp: int, + *, + algorand: AlgorandClient | None = None, + localnet_config: LocalNetConfig | None = None, +) -> None: + algorand_client = algorand or algorand_client_from_localnet(localnet_config) + algod_client = algorand_client.client.algod + algod_client.set_timestamp_offset(to_timestamp - get_latest_timestamp(algod_client)) + round_warp(algorand=algorand_client, localnet_config=localnet_config) + algod_client.set_timestamp_offset(0) + + +def wait_for_algod( + *, + localnet_config: LocalNetConfig | None = None, + timeout_seconds: float = 60.0, + poll_interval_seconds: float = 2.0, +) -> None: + localnet = localnet_config or load_localnet_config() + algod_client = AlgodClient(localnet.token, localnet.algod_address) + deadline = time.monotonic() + timeout_seconds + last_error: Exception | None = None + + while time.monotonic() < deadline: + try: + status = algod_client.status() + if "last-round" in status: + return + except Exception as exc: # pragma: no cover - exercised via CLI/manual flow + last_error = exc + time.sleep(poll_interval_seconds) + + message = f"Timed out waiting for algod at {localnet.algod_address}" + if last_error is not None: + raise TimeoutError(f"{message}: {last_error}") from last_error + raise TimeoutError(message) + + +def wait_for_kmd( + *, + localnet_config: LocalNetConfig | None = None, + timeout_seconds: float = 60.0, + poll_interval_seconds: float = 2.0, +) -> None: + localnet = localnet_config or load_localnet_config() + kmd_client = KMDClient(localnet.token, localnet.kmd_address) + deadline = time.monotonic() + timeout_seconds + last_error: Exception | None = None + + while time.monotonic() < deadline: + try: + kmd_client.list_wallets() + return + except Exception as exc: # pragma: no cover - exercised via CLI/manual flow + last_error = exc + time.sleep(poll_interval_seconds) + + message = f"Timed out waiting for kmd at {localnet.kmd_address}" + if last_error is not None: + raise TimeoutError(f"{message}: {last_error}") from last_error + raise TimeoutError(message) + + +def wait_for_localnet( + *, + localnet_config: LocalNetConfig | None = None, + timeout_seconds: float = 60.0, + poll_interval_seconds: float = 2.0, +) -> None: + wait_for_algod( + localnet_config=localnet_config, + timeout_seconds=timeout_seconds, + poll_interval_seconds=poll_interval_seconds, + ) + wait_for_kmd( + localnet_config=localnet_config, + timeout_seconds=timeout_seconds, + poll_interval_seconds=poll_interval_seconds, + ) + + +def ensure_funded_role_account( + algorand: AlgorandClient, + role_account_class: type[SigningAccount], + *, + min_spending_balance: AlgoAmount = DEFAULT_INITIAL_ALGO_FUNDS, +) -> SigningAccount: + account = algorand.account.random() + role_account = role_account_class(private_key=account.private_key) + algorand.account.ensure_funded_from_environment( + account_to_fund=role_account.address, + min_spending_balance=min_spending_balance, + ) + return role_account + + +def get_event_from_call_result(call_result: SendAppTransactionResult) -> bytes: + event = call_result.returns[0].tx_info["logs"][-2] + event_bytes = b64decode(event) + return event_bytes[4:] + + +def get_primary_tx_id(call_result: SendAppTransactionResult) -> str: + tx_ids = getattr(call_result, "tx_ids", None) + if isinstance(tx_ids, list) and tx_ids: + return tx_ids[0] + + transaction = getattr(call_result, "transaction", None) + tx_id = getattr(transaction, "tx_id", None) + if callable(tx_id): + return tx_id() + if isinstance(tx_id, str): + return tx_id + + raise ValueError("Unable to extract transaction id from call result") + + +def decode_actus_event(event_bytes: bytes) -> dict[str, int | str]: + offset = 0 + + contract_id = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] + offset += 8 + + event_type = event_bytes[offset] + offset += 1 + + type_name_offset = struct.unpack(">H", event_bytes[offset : offset + 2])[0] + offset += 2 + + event_time = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] + offset += 8 + + payoff = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] + offset += 8 + + currency_id = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] + offset += 8 + + currency_unit_offset = struct.unpack(">H", event_bytes[offset : offset + 2])[0] + offset += 2 + + nominal_value = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] + offset += 8 + + nominal_rate_bps = struct.unpack(">H", event_bytes[offset : offset + 2])[0] + offset += 2 + + nominal_accrued = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] + + type_name_length = struct.unpack( + ">H", event_bytes[type_name_offset : type_name_offset + 2] + )[0] + type_name = event_bytes[ + type_name_offset + 2 : type_name_offset + 2 + type_name_length + ].decode("utf-8") + + currency_unit_length = struct.unpack( + ">H", event_bytes[currency_unit_offset : currency_unit_offset + 2] + )[0] + currency_unit = event_bytes[ + currency_unit_offset + 2 : currency_unit_offset + 2 + currency_unit_length + ].decode("utf-8") + + return { + "contract_id": contract_id, + "type": event_type, + "type_name": type_name, + "time": event_time, + "payoff": payoff, + "currency_id": currency_id, + "currency_unit": currency_unit, + "nominal_value": nominal_value, + "nominal_rate_bps": nominal_rate_bps, + "nominal_accrued": nominal_accrued, + } + + +def decode_actus_execution_event(event_bytes: bytes) -> dict[str, int]: + ( + contract_id, + event_id, + event_type, + scheduled_time, + applied_at, + payoff, + payoff_sign, + settled_amount, + currency_id, + sequence, + ) = struct.unpack(">QQBQQQBQQQ", event_bytes) + + return { + "contract_id": contract_id, + "event_id": event_id, + "event_type": event_type, + "scheduled_time": scheduled_time, + "applied_at": applied_at, + "payoff": payoff, + "payoff_sign": payoff_sign, + "settled_amount": settled_amount, + "currency_id": currency_id, + "sequence": sequence, + } + + +def _build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description="Utilities for connecting to and waiting on D-ASA LocalNet.", + ) + subcommands = parser.add_subparsers(dest="command", required=True) + wait_parser = subcommands.add_parser( + "wait", + help="Wait for the LocalNet services required by the showcase.", + ) + wait_parser.add_argument( + "--timeout", + type=float, + default=60.0, + help="Maximum number of seconds to wait.", + ) + wait_parser.add_argument( + "--poll-interval", + type=float, + default=2.0, + help="Seconds between readiness checks.", + ) + return parser + + +def main() -> None: + parser = _build_parser() + args = parser.parse_args() + if args.command == "wait": + wait_for_localnet( + localnet_config=load_localnet_config(), + timeout_seconds=args.timeout, + poll_interval_seconds=args.poll_interval, + ) + + +if __name__ == "__main__": + main() diff --git a/src/d_asa/models.py b/src/d_asa/models.py new file mode 100644 index 00000000..02959d0f --- /dev/null +++ b/src/d_asa/models.py @@ -0,0 +1,211 @@ +from __future__ import annotations + +from dataclasses import dataclass + +from . import enums +from .errors import ActusNormalizationError +from .unix_time import UTCTimeStamp + + +@dataclass(frozen=True, slots=True) +class NormalizedActusTerms: + """ + ACTUS normalized contract terms for AVM deployment. + + AVM IDs + - Contract ID: D-ASA Application ID + - Contract Type: Contract Type enumerative ID + - Denomination Asset ID: ASA ID + + AVM Time + - UTC UNIX timestamp + + AVM Numeric values (UInt64): + - Amounts: in ASA minimal units + - Fixed Point are scaled + + NOTE: `notional_unit_value` is an SDK-only metadata. It is used to derive an exact + `total_units` count before AVM deployment, but it is not persisted on-chain. + """ + + # Contract + contract_id: int + contract_type: int + + # Denomination + denomination_asset_id: int + + # Time + initial_exchange_date: UTCTimeStamp + maturity_date: UTCTimeStamp | None + secondary_market_opening_date: UTCTimeStamp + secondary_market_closure_date: UTCTimeStamp + + # Principal + notional_principal: int + notional_unit_value: int + initial_exchange_amount: int + next_principal_redemption_amount: int + + # Interest + rate_reset_spread: int + rate_reset_multiplier: int + rate_reset_floor: int + rate_reset_cap: int + rate_reset_next: int + + # Day Count Convention + day_count_convention: int + + # Scaling + fixed_point_scale: int + + def __post_init__(self) -> None: + if self.notional_unit_value <= 0: + raise ActusNormalizationError("notional_unit_value must be positive") + + if self.notional_principal % self.notional_unit_value != 0: + raise ActusNormalizationError( + "D-ASA requires notional_principal be divisible by notional_unit_value" + ) + + @property + def total_units(self) -> int: + return self.notional_principal // self.notional_unit_value + + @property + def dynamic_principal_redemption(self) -> bool: + return ( + self.contract_type == enums.CT_ANN + and not self.next_principal_redemption_amount + ) + + @property + def has_rate_reset_floor(self) -> bool: + return self.rate_reset_floor != 0 + + @property + def has_rate_reset_cap(self) -> bool: + return self.rate_reset_cap != 0 + + +@dataclass(frozen=True, slots=True) +class ExecutionScheduleEntry: + """Representation of one normalized ACTUS schedule event.""" + + event_id: int + event_type: str + scheduled_time: UTCTimeStamp + accrual_factor: int + redemption_accrual_factor: int + next_nominal_interest_rate: int + next_principal_redemption: int + next_outstanding_principal: int + flags: int = 0 + + +@dataclass(frozen=True, slots=True) +class InitialKernelState: + """Contract initial kernel snapshot used for contract configuration.""" + + status_date: UTCTimeStamp + event_cursor: int + outstanding_principal: int + interest_calculation_base: int + nominal_interest_rate: int + accrued_interest: int + next_principal_redemption: int + cumulative_interest_index: int + cumulative_principal_index: int + + +@dataclass(frozen=True, slots=True) +class ObservedEventRequest: + """SDK-side representation of an observed ACTUS event payload.""" + + event_type: str + scheduled_time: UTCTimeStamp + accrual_factor: int + redemption_accrual_factor: int + observed_rate: int + next_nominal_interest_rate: int + next_principal_redemption: int + next_outstanding_principal: int + flags: int = 0 + + def to_schedule_entry(self, event_id: int) -> ExecutionScheduleEntry: + """Convert an observed payload into the Execution Schedule Entry shape.""" + return ExecutionScheduleEntry( + event_id=event_id, + event_type=self.event_type, + scheduled_time=self.scheduled_time, + accrual_factor=self.accrual_factor, + redemption_accrual_factor=self.redemption_accrual_factor, + next_nominal_interest_rate=self.next_nominal_interest_rate, + next_principal_redemption=self.next_principal_redemption, + next_outstanding_principal=self.next_outstanding_principal, + flags=self.flags, + ) + + +@dataclass(frozen=True, slots=True) +class ObservedCashEventRequest: + """SDK-side representation of an observed ACTUS cash-event payload.""" + + event_type: str + scheduled_time: UTCTimeStamp + accrual_factor: int + redemption_accrual_factor: int + next_nominal_interest_rate: int + next_principal_redemption: int + next_outstanding_principal: int + flags: int = 0 + + def to_schedule_entry(self, event_id: int) -> ExecutionScheduleEntry: + """Convert an observed cash payload into the Execution Schedule Entry shape.""" + return ExecutionScheduleEntry( + event_id=event_id, + event_type=self.event_type, + scheduled_time=self.scheduled_time, + accrual_factor=self.accrual_factor, + redemption_accrual_factor=self.redemption_accrual_factor, + next_nominal_interest_rate=self.next_nominal_interest_rate, + next_principal_redemption=self.next_principal_redemption, + next_outstanding_principal=self.next_outstanding_principal, + flags=self.flags, + ) + + +@dataclass(frozen=True, slots=True) +class AccountPosition: + """SDK-side D-ASA Contract holder position.""" + + units: int + reserved_units: int + payment_address: str + suspended: bool + settled_cursor: int + interest_checkpoint: int + principal_checkpoint: int + claimable_interest: int + claimable_principal: int + + +@dataclass(frozen=True, slots=True) +class NormalizationResult: + """Bundle returned by normalization for AVM deployment and verification.""" + + terms: NormalizedActusTerms + schedule: tuple[ExecutionScheduleEntry, ...] + initial_state: InitialKernelState + + def schedule_pages( + self, page_size: int + ) -> tuple[tuple[ExecutionScheduleEntry, ...], ...]: + """Chunk the normalized schedule into fixed-size upload pages.""" + if page_size <= 0: + raise ValueError("page_size must be positive") + pages: list[tuple[ExecutionScheduleEntry, ...]] = [] + for start in range(0, len(self.schedule), page_size): + pages.append(self.schedule[start : start + page_size]) + return tuple(pages) diff --git a/src/d_asa/normalization/__init__.py b/src/d_asa/normalization/__init__.py new file mode 100644 index 00000000..76668580 --- /dev/null +++ b/src/d_asa/normalization/__init__.py @@ -0,0 +1,24 @@ +"""ACTUS Contract normalization to AVM. + +This package provides functionality to normalize ACTUS contract attributes +into AVM-compatible representations with proper separation of concerns: + +- conversions: Unit and rate conversion utilities +- calculations: Financial calculations (interest, principal payments) +- event_seeds: Event seed management and utilities +- schedules: Schedule resolution for various event types +- annuity: Annuity-specific calculations +- builders: Contract-type specific schedule builders +- ann_builder: ANN contract schedule builder +- core: Main normalization logic + +Public API: +- normalize_contract_attributes: Main normalization function +- Helper utilities for testing and advanced use cases +""" + +from .core import normalize_contract_attributes + +__all__ = [ + "normalize_contract_attributes", +] diff --git a/src/d_asa/normalization/ann_builder.py b/src/d_asa/normalization/ann_builder.py new file mode 100644 index 00000000..e92547c2 --- /dev/null +++ b/src/d_asa/normalization/ann_builder.py @@ -0,0 +1,222 @@ +"""ANN (Annuity) schedule builder for ACTUS normalization.""" + +from __future__ import annotations + +from .. import constants as cst +from .. import enums +from ..contracts import ContractAttributes +from ..errors import ActusNormalizationError +from ..models import NormalizedActusTerms +from .annuity import get_annuity_start_timestamp, resolve_annuity_payment +from .calculations import calculate_interest, interpolate_balance_at_timestamp +from .conversions import rate_to_fp +from .event_seeds import EventSeed, create_seed +from .schedules import resolve_principal_schedule, resolve_rate_reset_occurrences + + +def build_ipcb_seeds( + contract: ContractAttributes, + terms: NormalizedActusTerms, + balance_timeline: list[tuple[int, int]], + initial_principal: int, +) -> tuple[EventSeed, ...]: + """Helper to import from builders to avoid circular dependency.""" + from .builders import build_ipcb_seeds as _build_ipcb_seeds + + return _build_ipcb_seeds(contract, terms, balance_timeline, initial_principal) + + +def build_ann_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, +) -> tuple[EventSeed, ...]: + """ + Build the normalized ANN (Annuity) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the ANN schedule. + """ + # Use maturity_date or amortization_date (whichever is set) + end_date = terms.maturity_date or contract.amortization_date + if end_date is None: + raise ActusNormalizationError( + "ANN normalization requires maturity_date or amortization_date" + ) + + pr_schedule = resolve_principal_schedule( + contract, terms, lax=False, end_date=end_date + ) + if not pr_schedule: + raise ActusNormalizationError( + "ANN normalization requires a principal redemption schedule" + ) + + formula_redemption_times = sorted(set(pr_schedule)) + if end_date not in formula_redemption_times: + formula_redemption_times.append(end_date) + + pr_anchor = contract.principal_redemption_anchor + if pr_anchor is None: + pr_anchor = terms.initial_exchange_date + + pr_cycle = contract.principal_redemption_cycle + if pr_cycle is None: + raise ActusNormalizationError( + "ANN normalization requires principal_redemption_cycle" + ) + + annuity_start = get_annuity_start_timestamp( + initial_exchange_date=terms.initial_exchange_date, + principal_redemption_anchor=pr_anchor, + principal_redemption_cycle=pr_cycle, + ) + rate_fp = rate_to_fp(contract.nominal_interest_rate) + dynamic_redemption = terms.dynamic_principal_redemption + payment_total = resolve_annuity_payment(contract, terms, asa_decimals) + + seeds: list[EventSeed] = [] + rr_schedule = resolve_rate_reset_occurrences(contract, terms) + next_rate = rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate + ) + + if dynamic_redemption: + if pr_anchor > terms.initial_exchange_date and formula_redemption_times: + prf_time = pr_anchor - cst.DAY_2_SEC + seeds.append( + EventSeed( + event_type="PRF", + scheduled_time=prf_time, + redemption_accrual_start=annuity_start, + redemption_accrual_end=formula_redemption_times[0], + flags=enums.FLAG_NON_CASH_EVENT | enums.FLAG_INITIAL_PRF, + ) + ) + for ts, _event_type in rr_schedule: + next_redemption = next( + (value for value in formula_redemption_times if value > ts), + None, + ) + if next_redemption is None: + continue + seeds.append( + EventSeed( + event_type="PRF", + scheduled_time=ts, + redemption_accrual_start=ts, + redemption_accrual_end=next_redemption, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + rr_events = dict(rr_schedule) + + outstanding = terms.notional_principal + previous_due = terms.initial_exchange_date + previous_redemption = annuity_start + # Track balance timeline for interpolation + balance_timeline: list[tuple[int, int]] = [] + + for ts in pr_schedule: + due_time = ts + interest_due = calculate_interest( + principal=outstanding, + rate_fp=rate_fp, + start_ts=previous_due, + end_ts=due_time, + day_count_convention=terms.day_count_convention, + maturity_date=end_date, + ) + principal_payment = min(max(payment_total - interest_due, 0), outstanding) + next_outstanding = max(outstanding - principal_payment, 0) + + # Record balance change + balance_timeline.append((ts, next_outstanding)) + + seeds.append( + create_seed( + ts, + event_type="PR", + redemption_accrual_start=previous_redemption, + redemption_accrual_end=due_time, + next_principal_redemption=0 if dynamic_redemption else payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + seeds.append( + create_seed( + ts, + event_type="IP", + next_principal_redemption=0 if dynamic_redemption else payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + event_key = ts + if event_key in rr_events: + event_type = rr_events[event_key] + seeds.append( + create_seed( + ts, + event_type=event_type, + next_nominal_interest_rate=( + next_rate if event_type == "RRF" else 0 + ), + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + outstanding = next_outstanding + previous_due = due_time + previous_redemption = due_time + + # Add non-coincident reset events with interpolated balance + for ts, event_type in rr_schedule: + if any(ts == pr_ts for pr_ts in pr_schedule): + continue + if ts >= end_date: + continue + # Interpolate balance at this timestamp + balance_at_reset = interpolate_balance_at_timestamp( + ts, balance_timeline, terms.notional_principal + ) + seeds.append( + create_seed( + ts, + event_type=event_type, + next_nominal_interest_rate=(next_rate if event_type == "RRF" else 0), + next_outstanding_principal=balance_at_reset, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + seeds.extend( + build_ipcb_seeds(contract, terms, balance_timeline, terms.notional_principal) + ) + md_redemption_start = 0 + md_redemption_end = 0 + if not any(ts == end_date for ts in pr_schedule): + md_redemption_start = previous_redemption + md_redemption_end = end_date + seeds.append( + create_seed( + end_date, + event_type="MD", + redemption_accrual_start=md_redemption_start, + redemption_accrual_end=md_redemption_end, + next_principal_redemption=0 if dynamic_redemption else payment_total, + next_outstanding_principal=0, + flags=enums.FLAG_CASH_EVENT, + ) + ) + return tuple(seeds) diff --git a/src/d_asa/normalization/annuity.py b/src/d_asa/normalization/annuity.py new file mode 100644 index 00000000..33fec2f7 --- /dev/null +++ b/src/d_asa/normalization/annuity.py @@ -0,0 +1,214 @@ +"""Annuity payment calculation for ANN contracts.""" + +from __future__ import annotations + +from collections.abc import Sequence + +from .. import constants as cst +from ..contracts import ContractAttributes +from ..day_count import days_in_month, year_fraction_fixed +from ..errors import ActusNormalizationError +from ..models import NormalizedActusTerms +from ..schedule import Cycle, datetime_to_timestamp, timestamp_to_datetime +from ..unix_time import UTCTimeStamp +from .conversions import rate_to_fp, to_asa_units +from .schedules import resolve_principal_schedule + + +def subtract_one_cycle(timestamp: UTCTimeStamp, cycle: Cycle) -> int: + """ + Move one ACTUS cycle backward from a timestamp. + + Supports daily (D), weekly (W), monthly (M), quarterly (Q), + semi-annual (H), and yearly (Y) cycles. + + Example: + >>> cycle = Cycle(count=1, unit="M") + >>> subtract_one_cycle(1612137600, cycle) # 2021-02-01 -> 2021-01-01 + + Args: + timestamp: Starting Unix timestamp. + cycle: ACTUS cycle specification. + + Returns: + Unix timestamp one cycle earlier. + + Raises: + ActusNormalizationError: If cycle unit is unsupported. + """ + if cycle.unit == "D": + return timestamp - cycle.count * cst.DAY_2_SEC + + if cycle.unit == "W": + return timestamp - cycle.count * 7 * cst.DAY_2_SEC + + month_delta_map = {"M": 1, "Q": 3, "H": 6, "Y": 12} + if cycle.unit not in month_delta_map: + raise ActusNormalizationError(f"Unsupported ACTUS cycle unit: {cycle.unit}") + + current = timestamp_to_datetime(timestamp) + months = cycle.count * month_delta_map[cycle.unit] + month_index = (current.month - 1) - months + year = current.year + month_index // 12 + month = (month_index % 12) + 1 + day = min(current.day, days_in_month(year, month)) + return datetime_to_timestamp(current.replace(year=year, month=month, day=day)) + + +def get_annuity_start_timestamp( + *, + initial_exchange_date: UTCTimeStamp, + principal_redemption_anchor: UTCTimeStamp, + principal_redemption_cycle: Cycle, +) -> int: + """ + Return the start timestamp used by the ANN payment formula. + + The annuity calculation starts from the later of: IED or one cycle + before the first principal redemption. + + Args: + initial_exchange_date: Contract IED timestamp. + principal_redemption_anchor: Anchor date for principal redemptions. + principal_redemption_cycle: Principal redemption cycle. + + Returns: + Start timestamp for annuity calculation. + """ + return max( + initial_exchange_date, + subtract_one_cycle(principal_redemption_anchor, principal_redemption_cycle), + ) + + +def calculate_annuity_payment( + *, + start_ts: int, + redemption_schedule: Sequence[int], + notional: int, + accrued_interest: int, + rate_fp: int, + day_count_convention: int, + maturity_date: int | None, +) -> int: + """ + Calculate an annuity payment from a redemption schedule and rate path. + + Uses the present value formula to compute the constant payment amount + that amortizes the principal plus accrued interest over the schedule. + + Args: + start_ts: Calculation start timestamp. + redemption_schedule: Sequence of payment timestamps. + notional: Principal amount in ASA base units. + accrued_interest: Accrued interest at start. + rate_fp: Interest rate in fixed-point representation. + day_count_convention: Day count convention code. + maturity_date: Optional maturity date for calculations. + + Returns: + Annuity payment amount in ASA base units. + """ + remaining = tuple(due_ts for due_ts in redemption_schedule if due_ts > start_ts) + if not remaining: + return 0 + + discount_fp = cst.FIXED_POINT_SCALE + denominator_fp = 0 + previous_ts = start_ts + for due_ts in remaining: + period_factor = year_fraction_fixed( + previous_ts, + due_ts, + day_count_convention=day_count_convention, + maturity_date=maturity_date, + ) + period_rate = cst.FIXED_POINT_SCALE + ( + rate_fp * period_factor // cst.FIXED_POINT_SCALE + ) + if period_rate <= 0: + raise ActusNormalizationError( + "Invalid ANN redemption schedule discount factor" + ) + discount_fp = discount_fp * cst.FIXED_POINT_SCALE // period_rate + denominator_fp += discount_fp + previous_ts = due_ts + + if denominator_fp <= 0: + raise ActusNormalizationError( + "ANN normalization requires a positive annuity denominator" + ) + numerator = max(notional, 0) + max(accrued_interest, 0) + return numerator * cst.FIXED_POINT_SCALE // denominator_fp + + +def resolve_annuity_payment( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, +) -> int: + """ + Resolve the initial annuity payment amount from terms or formula. + + For ANN contracts, either uses the configured payment amount or calculates + it using the annuity formula based on present value of cash flows. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Annuity payment amount in ASA base units. + + Raises: + ActusNormalizationError: If required fields are missing. + """ + payment_total = to_asa_units( + contract.next_principal_redemption_amount, asa_decimals + ) + if not terms.dynamic_principal_redemption and payment_total > 0: + return payment_total + + # Use maturity_date or amortization_date (whichever is set) + end_date = contract.maturity_date or contract.amortization_date + if end_date is None: + raise ActusNormalizationError( + "ANN normalization requires maturity_date or amortization_date" + ) + + pr_schedule = resolve_principal_schedule( + contract, terms, lax=False, end_date=end_date + ) + if not pr_schedule: + raise ActusNormalizationError( + "ANN normalization requires a principal redemption schedule" + ) + + formula_redemption_dates = sorted(set(pr_schedule)) + if end_date not in formula_redemption_dates: + formula_redemption_dates.append(end_date) + + pr_anchor = contract.principal_redemption_anchor + if pr_anchor is None: + pr_anchor = terms.initial_exchange_date + pr_cycle = contract.principal_redemption_cycle + if pr_cycle is None: + raise ActusNormalizationError( + "ANN normalization requires principal_redemption_cycle" + ) + + annuity_start = get_annuity_start_timestamp( + initial_exchange_date=terms.initial_exchange_date, + principal_redemption_anchor=pr_anchor, + principal_redemption_cycle=pr_cycle, + ) + return calculate_annuity_payment( + start_ts=annuity_start, + redemption_schedule=formula_redemption_dates, + notional=terms.notional_principal, + accrued_interest=0, + rate_fp=rate_to_fp(contract.nominal_interest_rate), + day_count_convention=terms.day_count_convention, + maturity_date=end_date, + ) diff --git a/src/d_asa/normalization/builders.py b/src/d_asa/normalization/builders.py new file mode 100644 index 00000000..7a40c515 --- /dev/null +++ b/src/d_asa/normalization/builders.py @@ -0,0 +1,554 @@ +"""Contract-type specific schedule builders for ACTUS normalization.""" + +from __future__ import annotations + +from .. import constants as cst +from .. import enums +from ..contracts import ContractAttributes +from ..errors import ActusNormalizationError +from ..models import NormalizedActusTerms +from .calculations import ( + calculate_interest, + calculate_principal_payment, + interpolate_balance_at_timestamp, +) +from .conversions import rate_to_fp, to_asa_units +from .event_seeds import EventSeed, create_seed +from .schedules import ( + resolve_interest_schedule, + resolve_ipcb_schedule, + resolve_principal_schedule, + resolve_rate_reset_occurrences, +) + + +def build_ied_seed( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, +) -> EventSeed: + """ + Build the mandatory initial exchange event seed. + + Creates the IED (Initial Exchange Date) event that establishes the initial + contract state including principal and interest rate. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Event seed for the IED event. + """ + from .core import get_initial_next_principal_redemption + + return EventSeed( + event_type="IED", + scheduled_time=terms.initial_exchange_date, + next_nominal_interest_rate=rate_to_fp(contract.nominal_interest_rate), + next_principal_redemption=get_initial_next_principal_redemption( + contract, terms, asa_decimals + ), + next_outstanding_principal=terms.notional_principal, + flags=enums.FLAG_NON_CASH_EVENT, + ) + + +def build_rate_reset_seeds( + contract: ContractAttributes, + outstanding: int, + terms: NormalizedActusTerms, + next_rate_fp: int, +) -> tuple[EventSeed, ...]: + """ + Build non-cash RR/RRF event seeds from the rate reset schedule. + + Creates RR (Rate Reset) and RRF (Rate Reset with Fixed spread) event seeds + that update the interest rate without cash flows. + + Args: + contract: ACTUS contract attributes. + outstanding: Current outstanding principal. + terms: Normalized contract terms. + next_rate_fp: Next rate in fixed-point representation. + + Returns: + Tuple of rate reset event seeds. + """ + return tuple( + create_seed( + ts, + event_type=event_type, + next_nominal_interest_rate=next_rate_fp if event_type == "RRF" else 0, + next_outstanding_principal=outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + for ts, event_type in resolve_rate_reset_occurrences(contract, terms) + ) + + +def build_ipcb_seeds( + contract: ContractAttributes, + terms: NormalizedActusTerms, + balance_timeline: list[tuple[int, int]], + initial_principal: int, +) -> tuple[EventSeed, ...]: + """ + Build IPCB event seeds for interest calculation base adjustments. + + IPCB (Interest Payment Calculation Base) events adjust the base amount + used for interest calculations without generating cash flows. Each IPCB + event uses the interpolated balance at its scheduled timestamp. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + balance_timeline: List of (timestamp, balance) tuples tracking principal changes. + initial_principal: Initial principal amount before any events. + + Returns: + Tuple of IPCB event seeds. + """ + return tuple( + create_seed( + ts, + event_type="IPCB", + next_outstanding_principal=interpolate_balance_at_timestamp( + ts, balance_timeline, initial_principal + ), + flags=enums.FLAG_NON_CASH_EVENT, + ) + for ts in resolve_ipcb_schedule(contract, terms) + ) + + +def build_pam_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms +) -> tuple[EventSeed, ...]: + """ + Build the normalized PAM (Principal at Maturity) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + + Returns: + Tuple of event seeds for the PAM schedule. + + Raises: + ActusNormalizationError: If maturity_date is not specified. + """ + if terms.maturity_date is None: + raise ActusNormalizationError("PAM normalization requires maturity_date") + + seeds: list[EventSeed] = [] + outstanding = terms.notional_principal + + for ts in resolve_interest_schedule(contract, terms): + seeds.append( + create_seed( + ts, + event_type="IP", + next_outstanding_principal=outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + + next_rate = rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate + ) + seeds.extend(build_rate_reset_seeds(contract, outstanding, terms, next_rate)) + + seeds.append( + create_seed( + terms.maturity_date, + event_type="MD", + next_outstanding_principal=0, + flags=enums.FLAG_CASH_EVENT, + ) + ) + return tuple(seeds) + + +def build_clm_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms +) -> tuple[EventSeed, ...]: + """ + Build the normalized CLM (Call Money) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + + Returns: + Tuple of event seeds for the CLM schedule. + """ + seeds: list[EventSeed] = [] + outstanding = terms.notional_principal + + if terms.maturity_date is not None: + for ts in resolve_interest_schedule(contract, terms): + seeds.append( + create_seed( + ts, + event_type="IP", + next_outstanding_principal=outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + seeds.append( + create_seed( + terms.maturity_date, + event_type="MD", + next_outstanding_principal=0, + flags=enums.FLAG_CASH_EVENT, + ) + ) + + next_rate = rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate + ) + seeds.extend(build_rate_reset_seeds(contract, outstanding, terms, next_rate)) + return tuple(seeds) + + +def build_lam_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int +) -> tuple[EventSeed, ...]: + """ + Build the normalized LAM (Linear Amortizer) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the LAM schedule. + """ + return build_amortizing_schedule( + contract, terms, asa_decimals, allow_negative=False, lax=False + ) + + +def build_nam_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int +) -> tuple[EventSeed, ...]: + """ + Build the normalized NAM (Negative Amortizer) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the NAM schedule. + """ + return build_amortizing_schedule( + contract, terms, asa_decimals, allow_negative=True, lax=False + ) + + +def build_lax_schedule( + contract: ContractAttributes, terms: NormalizedActusTerms, asa_decimals: int +) -> tuple[EventSeed, ...]: + """ + Build the normalized LAX (Linear Amortizer with eXtensions) event seed schedule. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the LAX schedule. + """ + return build_amortizing_schedule( + contract, terms, asa_decimals, allow_negative=True, lax=True + ) + + +def get_lax_direction(contract: ContractAttributes, period_index: int) -> str: + """ + Return whether a LAX period decreases or increases principal. + + Uses array_increase_decrease to determine if a period generates + a principal increase (INC) or decrease (DEC) event. + + Args: + contract: ACTUS contract attributes. + period_index: Zero-based index of the period. + + Returns: + "INC" for increase or "DEC" for decrease (default). + """ + directions = tuple( + str(value).upper() for value in contract.array_increase_decrease or () + ) + if period_index < len(directions): + return directions[period_index] + return "DEC" + + +def build_amortizing_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, + *, + allow_negative: bool, + lax: bool, +) -> tuple[EventSeed, ...]: + """ + Build a generic amortizing schedule for LAM, NAM, and LAX. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + allow_negative: Whether negative amortization is allowed (NAM). + lax: Whether this is a LAX contract with array-based schedules. + + Returns: + Tuple of event seeds for the amortizing schedule. + + Raises: + ActusNormalizationError: If required fields are missing. + """ + contract_type = contract.contract_type + if terms.maturity_date is None: + raise ActusNormalizationError( + f"{contract_type} normalization requires maturity_date or amortization_date" + ) + + seeds: list[EventSeed] = [] + outstanding = terms.notional_principal + rate_fp = rate_to_fp(contract.nominal_interest_rate) + pr_schedule = resolve_principal_schedule(contract, terms, lax=lax) + if not pr_schedule: + raise ActusNormalizationError( + f"{contract_type} normalization requires a principal redemption schedule" + ) + + payment_total = to_asa_units( + contract.next_principal_redemption_amount or 0, + asa_decimals, + ) + + # Precompute LAX principal amounts once + pr_values_scaled: tuple[int, ...] | None = None + if lax and contract.array_pr_next is not None: + pr_values_scaled = tuple( + to_asa_units(value, asa_decimals) for value in contract.array_pr_next + ) + # Validate that all scaled values are within uint64 bounds + for idx, scaled_value in enumerate(pr_values_scaled): + if scaled_value < 0 or scaled_value > cst.MAX_UINT64: + raise ActusNormalizationError( + f"LAX array_pr_next[{idx}] scaled value {scaled_value} exceeds uint64 bounds " + f"(0 to {cst.MAX_UINT64})" + ) + + # Build rate reset schedule as dict for efficient lookup + rr_schedule = resolve_rate_reset_occurrences(contract, terms) + rr_events = dict(rr_schedule) + next_rate = rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate + ) + + previous_due = terms.initial_exchange_date + # Track balance timeline for interpolation + balance_timeline: list[tuple[int, int]] = [] + + for index, ts in enumerate(pr_schedule): + due_time = ts + interest_due = calculate_interest( + principal=outstanding, + rate_fp=rate_fp, + start_ts=previous_due, + end_ts=due_time, + day_count_convention=terms.day_count_convention, + maturity_date=terms.maturity_date, + ) + principal_payment, payment_total = calculate_principal_payment( + outstanding=outstanding, + payment_total=payment_total, + interest_due=interest_due, + allow_negative=allow_negative, + annuity=False, + lax=lax, + period_index=index, + pr_values_scaled=pr_values_scaled, + ) + lax_direction = get_lax_direction(contract, index) if lax else "DEC" + + # For NAM, negative principal_payment means capitalization (increase outstanding) + # For other types, subtract principal_payment from outstanding + if allow_negative and not lax: + # NAM: negative principal_payment increases outstanding (capitalization) + next_outstanding = outstanding - principal_payment + # Validate that capitalization doesn't cause uint64 overflow + if next_outstanding < 0 or next_outstanding > cst.MAX_UINT64: + raise ActusNormalizationError( + f"NAM capitalization at period {index} would result in outstanding principal " + f"{next_outstanding} which exceeds uint64 bounds (0 to {cst.MAX_UINT64}). " + f"Outstanding: {outstanding}, principal_payment: {principal_payment}" + ) + else: + # LAM/LAX: normally decrease or maintain outstanding. However, for LAX with + # allow_negative=True, a negative principal_payment implies capitalization + # (outstanding - principal_payment becomes an addition), which may overflow. + if lax and allow_negative and principal_payment < 0: + candidate_outstanding = outstanding - principal_payment + if candidate_outstanding > cst.MAX_UINT64: + raise ActusNormalizationError( + f"LAX capitalization at period {index} would result in outstanding principal " + f"{candidate_outstanding} which exceeds uint64 bounds (0 to {cst.MAX_UINT64}). " + f"Outstanding: {outstanding}, principal_payment: {principal_payment}" + ) + next_outstanding = max(candidate_outstanding, 0) + else: + next_outstanding = max(outstanding - principal_payment, 0) + + if lax_direction == "INC": + # LAX INC periods: explicitly increase outstanding by payment_total. + # Validate payment_total is within bounds before addition + if payment_total < 0 or payment_total > cst.MAX_UINT64: + raise ActusNormalizationError( + f"LAX INC at period {index} has invalid payment_total {payment_total} " + f"which exceeds uint64 bounds (0 to {cst.MAX_UINT64})" + ) + candidate_outstanding = outstanding + payment_total + if candidate_outstanding > cst.MAX_UINT64: + raise ActusNormalizationError( + f"LAX INC at period {index} would result in outstanding principal " + f"{candidate_outstanding} which exceeds uint64 bounds (0 to {cst.MAX_UINT64}). " + f"Outstanding: {outstanding}, payment_total: {payment_total}" + ) + next_outstanding = candidate_outstanding + + # Record balance change + balance_timeline.append((ts, next_outstanding)) + + # For NAM with negative principal_payment (capitalization), still generate PR event + # For LAM/LAX, only generate events if principal_payment > 0 + if principal_payment > 0 or (allow_negative and not lax): + # For LAX INC periods, generate PI (Principal Increase) events + if lax and lax_direction == "INC": + seeds.append( + create_seed( + ts, + event_type="PI", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + else: + # Normal redemption or DEC periods generate PR events + # For NAM with negative principal_payment, this is a cash event (payment made) + # but outstanding increases due to capitalization + seeds.append( + create_seed( + ts, + event_type="PR", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + elif lax: + # For LAX with zero principal_payment, still respect direction + if lax_direction == "INC": + seeds.append( + create_seed( + ts, + event_type="PI", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + else: # DEC + seeds.append( + create_seed( + ts, + event_type="PR", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + if interest_due > 0 or due_time == terms.maturity_date: + seeds.append( + create_seed( + ts, + event_type="IP", + next_principal_redemption=payment_total, + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_CASH_EVENT, + ) + ) + + # Check if this timestamp has a rate reset event + event_key = ts + if event_key in rr_events: + event_type = rr_events[event_key] + seeds.append( + create_seed( + ts, + event_type=event_type, + next_nominal_interest_rate=( + next_rate if event_type == "RRF" else 0 + ), + next_outstanding_principal=next_outstanding, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + outstanding = next_outstanding + previous_due = due_time + + # Add remaining rate reset events that don't coincide with PR dates + pr_timestamps = set(pr_schedule) + for ts, event_type in rr_schedule: + if ts in pr_timestamps: + continue + if ts >= terms.maturity_date: + continue + # Interpolate balance at this timestamp + balance_at_reset = interpolate_balance_at_timestamp( + ts, balance_timeline, terms.notional_principal + ) + seeds.append( + create_seed( + ts, + event_type=event_type, + next_nominal_interest_rate=(next_rate if event_type == "RRF" else 0), + next_outstanding_principal=balance_at_reset, + flags=enums.FLAG_NON_CASH_EVENT, + ) + ) + + seeds.extend( + build_ipcb_seeds(contract, terms, balance_timeline, terms.notional_principal) + ) + if outstanding: + seeds.append( + create_seed( + terms.maturity_date, + event_type="MD", + next_principal_redemption=payment_total, + next_outstanding_principal=0, + flags=enums.FLAG_CASH_EVENT, + ) + ) + return tuple(seeds) diff --git a/src/d_asa/normalization/calculations.py b/src/d_asa/normalization/calculations.py new file mode 100644 index 00000000..f9821f18 --- /dev/null +++ b/src/d_asa/normalization/calculations.py @@ -0,0 +1,142 @@ +"""Financial calculation utilities for ACTUS normalization.""" + +from __future__ import annotations + +from .. import constants as cst +from ..day_count import year_fraction_fixed + + +def calculate_interest( + *, + principal: int, + rate_fp: int, + start_ts: int, + end_ts: int, + day_count_convention: int, + maturity_date: int | None, +) -> int: + """ + Compute interest in minor units for a principal and accrual interval. + + Calculates interest as: principal * rate * year_fraction, where rate + and year_fraction are in fixed-point representation. + + Example: + >>> calculate_interest( + ... principal=100000, + ... rate_fp=50000000, # 5% in fixed-point + ... start_ts=1609459200, + ... end_ts=1612137600, + ... day_count_convention=2, # 30/360 + ... maturity_date=None + ... ) + + Args: + principal: Principal amount in ASA base units. + rate_fp: Interest rate in fixed-point representation. + start_ts: Accrual start timestamp. + end_ts: Accrual end timestamp. + day_count_convention: Day count convention code. + maturity_date: Optional maturity date for year fraction calculation. + + Returns: + Interest amount in ASA base units. + """ + if rate_fp <= 0 or end_ts <= start_ts: + return 0 + year_fraction = year_fraction_fixed( + start_ts, + end_ts, + day_count_convention=day_count_convention, + maturity_date=maturity_date, + ) + return ( + principal + * rate_fp + * year_fraction + // cst.FIXED_POINT_SCALE + // cst.FIXED_POINT_SCALE + ) + + +def interpolate_balance_at_timestamp( + timestamp: int, + balance_timeline: list[tuple[int, int]], + initial_balance: int, +) -> int: + """ + Interpolate the outstanding principal balance at a specific timestamp. + + Args: + timestamp: The timestamp to query. + balance_timeline: List of (timestamp, balance_after) tuples in chronological order. + initial_balance: The starting balance before any events. + + Returns: + The outstanding balance at the given timestamp. + """ + if not balance_timeline: + return initial_balance + + # If timestamp is before first event, return initial balance + if timestamp < balance_timeline[0][0]: + return initial_balance + + # Find the last event on or before the timestamp + balance = initial_balance + for ts, balance_after in balance_timeline: + if ts <= timestamp: + balance = balance_after + else: + break + + return balance + + +def calculate_principal_payment( + *, + outstanding: int, + payment_total: int, + interest_due: int, + allow_negative: bool, + annuity: bool, + lax: bool, + period_index: int, + pr_values_scaled: tuple[int, ...] | None = None, +) -> tuple[int, int]: + """ + Resolve the principal cashflow for one amortizing period. + + Calculates the principal payment amount based on contract type, + payment structure, and period-specific parameters. + + Args: + outstanding: Current outstanding principal. + payment_total: Total payment amount for the period. + interest_due: Interest amount due for the period. + allow_negative: Whether negative amortization is allowed. + annuity: Whether this is an annuity contract. + lax: Whether this is a LAX contract with array-based amounts. + period_index: Index of the current period. + pr_values_scaled: Precomputed scaled principal values for LAX contracts. + + Returns: + Tuple of (principal_payment, payment_total) where payment_total may be + updated from array_pr_next for LAX contracts. + """ + # For LAX contracts, override payment_total with period-specific value + if lax and pr_values_scaled is not None and period_index < len(pr_values_scaled): + payment_total = pr_values_scaled[period_index] + + if annuity: + return min(max(payment_total - interest_due, 0), outstanding), payment_total + + if allow_negative: + # For NAM, allow negative principal payments (representing capitalization) + # When payment_total < interest_due, the difference is capitalized + candidate = payment_total - interest_due + # Clamp negative values to prevent exceeding outstanding balance + # and positive values to not exceed outstanding + return max(min(candidate, outstanding), -outstanding), payment_total + + return min(max(payment_total, 0), outstanding), payment_total diff --git a/src/d_asa/normalization/conversions.py b/src/d_asa/normalization/conversions.py new file mode 100644 index 00000000..e0d156e3 --- /dev/null +++ b/src/d_asa/normalization/conversions.py @@ -0,0 +1,139 @@ +"""Unit conversion utilities for ACTUS to AVM normalization.""" + +from __future__ import annotations + +from decimal import Decimal +from typing import cast + +from .. import constants as cst +from ..errors import ActusNormalizationError + + +def to_asa_units(amount: int | float | Decimal, asa_decimals: int) -> int: + """ + Convert a decimal amount to ASA base units (uint64). + + Scales the amount by 10^asa_decimals to represent fractional values as integers. + + Example: + >>> to_asa_units(100.42, 3) # 100.42 with 3 decimals + 100420 + >>> to_asa_units(100, 2) # 100 with 2 decimals + 10000 + + Args: + amount: The numeric value to convert. + asa_decimals: Number of decimal places for the ASA. + + Returns: + The amount in ASA base units as an integer. + + Raises: + TypeError: If value is not int, float, or Decimal. + ActusNormalizationError: If result exceeds uint64 bounds. + """ + if isinstance(amount, (int, float, Decimal)): + scale = cast(int, 10**asa_decimals) + amount_decimal = Decimal(str(amount)) + scale_decimal = Decimal(scale) + result = int(amount_decimal * scale_decimal) + else: + raise TypeError(f"Unsupported value type: {type(amount)}") + + if result < 0 or result > cst.MAX_UINT64: + raise ActusNormalizationError( + f"Value {amount} results in {result} which exceeds uint64 bounds" + ) + + return result + + +def rate_to_fp(value: int | float | Decimal) -> int: + """ + Convert decimal rates to fixed-point integer representation. + + Scales decimal rates by FIXED_POINT_SCALE for AVM-compatible uint64 storage. + + Example: + >>> rate_to_fp(0.05) # 5% rate with FIXED_POINT_SCALE=1_000_000_000 + 50000000 + + Args: + value: The rate value (e.g., 0.05 for 5%). + + Returns: + Fixed-point scaled rate as uint64 integer. + + Raises: + TypeError: If value is not int, float, or Decimal. + ActusNormalizationError: If result exceeds uint64 bounds. + """ + if isinstance(value, (int, float, Decimal)): + value_decimal = Decimal(str(value)) + scale_decimal = Decimal(cst.FIXED_POINT_SCALE) + result = int(value_decimal * scale_decimal) + else: + raise TypeError(f"Unsupported value type: {type(value)}") + + if result < 0 or result > cst.MAX_UINT64: + raise ActusNormalizationError( + f"Value {value} results in {result} which exceeds uint64 bounds" + ) + + return result + + +def compute_initial_exchange_amount( + notional: int | float | Decimal, + premium_discount_at_ied: int | float | Decimal, + asa_decimals: int, +) -> int: + """ + Calculate the initial exchange amount adjusted for premium/discount. + + Returns the net notional after subtracting any premium/discount at IED + (Initial Exchange Date). + + Args: + notional: The notional principal amount. + premium_discount_at_ied: Premium/discount adjustment at IED. + Positive value = discount (reduces notional) + Negative value = premium (increases notional) + asa_decimals: Number of decimal places for the ASA. + + Returns: + Net initial exchange amount in ASA base units. + + Raises: + ActusNormalizationError: If result is negative or exceeds uint64 bounds. + """ + notional = to_asa_units(notional, asa_decimals) + + # Handle premium (negative) and discount (positive) separately + # to avoid to_asa_units rejecting negative values + scale = cast(int, 10**asa_decimals) + notional_display = notional / scale + if premium_discount_at_ied >= 0: + pdied = to_asa_units(premium_discount_at_ied, asa_decimals) + # Validate that discount doesn't exceed notional (would result in negative amount) + if pdied > notional: + raise ActusNormalizationError( + f"Premium/discount at IED ({premium_discount_at_ied}) exceeds notional " + f"({notional_display}), which would result in a negative " + f"initial exchange amount. This is invalid for uint64 encoding." + ) + result = notional - pdied + else: + # For negative premium_discount (premium), convert absolute value and add + pdied = to_asa_units(-premium_discount_at_ied, asa_decimals) + result = notional + pdied + + # Validate uint64 bounds for AVM encoding + if result > cst.MAX_UINT64: + raise ActusNormalizationError( + f"Initial exchange amount {result} exceeds uint64 maximum ({cst.MAX_UINT64}). " + f"Notional={notional_display}, " + f"premium_discount_at_ied={premium_discount_at_ied}" + ) + + return result diff --git a/src/d_asa/normalization/core.py b/src/d_asa/normalization/core.py new file mode 100644 index 00000000..90644689 --- /dev/null +++ b/src/d_asa/normalization/core.py @@ -0,0 +1,373 @@ +"""Core normalization logic for ACTUS contracts.""" + +from __future__ import annotations + +from collections.abc import Sequence +from decimal import Decimal + +from .. import constants as cst +from ..contracts import ContractAttributes +from ..day_count import BusinessDayConvention, Calendar, year_fraction_fixed +from ..errors import ActusNormalizationError, UnsupportedActusFeatureError +from ..models import ( + ExecutionScheduleEntry, + InitialKernelState, + NormalizationResult, + NormalizedActusTerms, + ObservedEventRequest, +) +from ..registry import ALLOWED_EVENT_TYPES, CONTRACT_TYPE_IDS +from ..unix_time import UTCTimeStamp +from .ann_builder import build_ann_schedule +from .builders import ( + build_clm_schedule, + build_ied_seed, + build_lam_schedule, + build_lax_schedule, + build_nam_schedule, + build_pam_schedule, +) +from .conversions import compute_initial_exchange_amount, rate_to_fp, to_asa_units +from .event_seeds import EventSeed, get_seed_sort_key, seed_from_preprocessed + + +def _coerce_schedule_int(value: int | float | Decimal) -> int: + """Coerce pre-normalized schedule payload values to concrete ints.""" + return int(value) + + +def extract_base_contract_type(contract_type: str) -> str: + """ + Extract the base contract type from a potentially subtyped contract type string. + + The type:subtype notation allows contracts to specify variants (e.g., "ANN:ZCB"). + This function extracts the base type for validation and logic that should apply + to all subtypes of a given base type. + + Args: + contract_type: Contract type string, possibly with subtype (e.g., "ANN:ZCB") + + Returns: + Base contract type without subtype (e.g., "ANN" from "ANN:ZCB") + + Example: + >>> extract_base_contract_type("ANN:ZCB") + 'ANN' + >>> extract_base_contract_type("PAM") + 'PAM' + """ + return contract_type.split(":")[0] if ":" in contract_type else contract_type + + +def get_initial_next_principal_redemption( + contract: ContractAttributes, + terms: NormalizedActusTerms, + asa_decimals: int, +) -> int: + """ + Resolve the initial next principal redemption for the first IED state. + + For ANN contracts (including subtypes like "ANN:ZCB"), calculates the annuity payment amount. + For other contracts, uses the configured next_principal_redemption_amount. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Initial principal redemption amount in ASA base units. + """ + from .annuity import resolve_annuity_payment + + base_type = extract_base_contract_type(contract.contract_type) + if base_type != "ANN": + if contract.next_principal_redemption_amount is None: + return 0 + return to_asa_units(contract.next_principal_redemption_amount, asa_decimals) + return resolve_annuity_payment(contract, terms, asa_decimals) + + +def normalize_contract_attributes( + contract: ContractAttributes, + *, + denomination_asset_id: int, + denomination_asset_decimals: int, + notional_unit_value: int | float | Decimal, + secondary_market_opening_date: UTCTimeStamp, + secondary_market_closure_date: UTCTimeStamp, + preprocessed_events: ( + Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None + ) = None, +) -> NormalizationResult: + """ + Normalize ACTUS contract attributes into AVM-compatible terms, schedule, and state. + + Transforms human-readable ACTUS contract parameters into fixed-point integers, + generates the execution schedule, and initializes the contract kernel state. + + Args: + contract: ACTUS contract attributes with dates, amounts, and cycles. + denomination_asset_id: ASA ID for the denomination asset. + denomination_asset_decimals: Decimal places for the denomination ASA. + notional_unit_value: Notional value per unit in denomination ASA. + secondary_market_opening_date: Unix timestamp for secondary market opening. + secondary_market_closure_date: Unix timestamp for secondary market closure. + preprocessed_events: Optional pre-generated event schedule. + + Returns: + NormalizationResult containing normalized terms, execution schedule, and initial state. + + Raises: + ActusNormalizationError: If status_date >= initial_exchange_date or invalid config. + + Example: + >>> contract = ContractAttributes( + ... contract_type="PAM", + ... status_date=1609459200, # 2021-01-01 + ... initial_exchange_date=1612137600, # 2021-02-01 + ... maturity_date=1643673600, # 2022-02-01 + ... notional_principal=100000, + ... nominal_interest_rate=0.05, + ... ) + >>> result = normalize_contract_attributes( + ... contract, + ... denomination_asset_id=1, + ... denomination_asset_decimals=6, + ... notional_unit_value=100, + ... ) + """ + if contract.status_date >= contract.initial_exchange_date: + raise ActusNormalizationError( + "D-ASA requires status_date to be strictly before initial_exchange_date" + ) + + if contract.business_day_convention != BusinessDayConvention.NOS: + raise UnsupportedActusFeatureError( + "D-ASA compliance profile only supports business_day_convention=NOS" + ) + + if contract.calendar != Calendar.NC: + raise UnsupportedActusFeatureError( + "D-ASA compliance profile only supports calendar=NC" + ) + + # Extract base contract type (e.g., "PAM" from "PAM:ZCB") + base_contract_type = extract_base_contract_type(contract.contract_type) + + pdied_asa = compute_initial_exchange_amount( + contract.notional_principal, + contract.premium_discount_at_ied, + denomination_asset_decimals, + ) + + # Normalize ACTUS contract terms to AVM + terms = NormalizedActusTerms( + # Contract + contract_id=contract.contract_id, + contract_type=CONTRACT_TYPE_IDS[base_contract_type], + # Denomination + denomination_asset_id=denomination_asset_id, + # Time + initial_exchange_date=contract.initial_exchange_date, + maturity_date=contract.maturity_date, + secondary_market_opening_date=secondary_market_opening_date, + secondary_market_closure_date=secondary_market_closure_date, + # Principal + notional_principal=to_asa_units( + contract.notional_principal, denomination_asset_decimals + ), + notional_unit_value=to_asa_units( + notional_unit_value, denomination_asset_decimals + ), + initial_exchange_amount=pdied_asa, + next_principal_redemption_amount=to_asa_units( + contract.next_principal_redemption_amount, denomination_asset_decimals + ), + # Interest + rate_reset_spread=rate_to_fp(contract.rate_reset_spread), + rate_reset_multiplier=rate_to_fp(contract.rate_reset_multiplier), + rate_reset_floor=rate_to_fp(contract.rate_reset_floor), + rate_reset_cap=rate_to_fp(contract.rate_reset_cap), + rate_reset_next=rate_to_fp( + contract.rate_reset_next + if contract.rate_reset_next is not None + else contract.nominal_interest_rate + ), + # Day Count Convention + day_count_convention=contract.day_count_convention, + # Scaling + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + + # Normalize ACTUS contract schedule to AVM + schedule = build_schedule( + contract, + terms=terms, + preprocessed_events=preprocessed_events, + contract_type=contract.contract_type, + status_date=contract.status_date, + asa_decimals=denomination_asset_decimals, + ) + + # Normalize ACTUS contract initial state to AVM + initial_state = InitialKernelState( + status_date=contract.status_date, + event_cursor=0, + outstanding_principal=0, + interest_calculation_base=0, + nominal_interest_rate=0, + accrued_interest=0, + next_principal_redemption=0, + cumulative_interest_index=0, + cumulative_principal_index=0, + ) + return NormalizationResult( + terms=terms, + schedule=schedule, + initial_state=initial_state, + ) + + +def build_schedule( + contract: ContractAttributes, + *, + terms: NormalizedActusTerms, + preprocessed_events: Sequence[ObservedEventRequest | ExecutionScheduleEntry] | None, + contract_type: str, + status_date: int, + asa_decimals: int, +) -> tuple[ExecutionScheduleEntry, ...]: + """ + Build the final execution schedule from event seeds or preprocessed events. + + Converts intermediate event seeds into fully populated ExecutionScheduleEntry + objects with computed accrual factors and proper event ordering. + + Args: + contract: Original ACTUS contract attributes. + terms: Normalized contract terms. + preprocessed_events: Optional pre-generated event schedule. + contract_type: Base contract type (e.g., "PAM", "LAM"). + status_date: Contract status date (must precede all events). + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Sorted tuple of ExecutionScheduleEntry objects. + + Raises: + UnsupportedActusFeatureError: If event type not allowed for contract type. + ActusNormalizationError: If events not in chronological order. + """ + # Extract base contract type + base_contract_type = extract_base_contract_type(contract_type) + + if preprocessed_events is not None: + seeds = [ + seed_from_preprocessed(index, item) + for index, item in enumerate(preprocessed_events) + ] + else: + seeds = list( + build_schedule_seeds( + contract, + terms, + contract_type=base_contract_type, + asa_decimals=asa_decimals, + ) + ) + + if not any(seed.event_type == "IED" for seed in seeds): + seeds.append(build_ied_seed(contract, terms, asa_decimals=asa_decimals)) + + ordered = sorted(seeds, key=get_seed_sort_key) + allowed = ALLOWED_EVENT_TYPES[base_contract_type] + entries: list[ExecutionScheduleEntry] = [] + previous_ts = status_date + for event_id, seed in enumerate(ordered): + if seed.event_type not in allowed: + raise UnsupportedActusFeatureError( + f"Unsupported event {seed.event_type} for {base_contract_type}" + ) + if seed.event_type != "IED" and seed.scheduled_time < previous_ts: + raise ActusNormalizationError( + "ACTUS scheduled_time must be non-decreasing in event execution order" + ) + accrual_factor = seed.accrual_factor + if accrual_factor is None: + if seed.event_type == "IED": + accrual_factor = 0 + else: + accrual_factor = year_fraction_fixed( + previous_ts, + seed.scheduled_time, + day_count_convention=terms.day_count_convention, + maturity_date=terms.maturity_date, + ) + redemption_accrual_factor = seed.redemption_accrual_factor + if redemption_accrual_factor is None: + if seed.redemption_accrual_end > seed.redemption_accrual_start: + redemption_accrual_factor = year_fraction_fixed( + seed.redemption_accrual_start, + seed.redemption_accrual_end, + day_count_convention=terms.day_count_convention, + maturity_date=terms.maturity_date, + ) + else: + redemption_accrual_factor = 0 + entries.append( + ExecutionScheduleEntry( + event_id=event_id, + event_type=seed.event_type, + scheduled_time=seed.scheduled_time, + accrual_factor=_coerce_schedule_int(accrual_factor), + redemption_accrual_factor=_coerce_schedule_int( + redemption_accrual_factor + ), + next_nominal_interest_rate=_coerce_schedule_int( + seed.next_nominal_interest_rate + ), + next_principal_redemption=seed.next_principal_redemption, + next_outstanding_principal=seed.next_outstanding_principal, + flags=seed.flags, + ) + ) + previous_ts = seed.scheduled_time + return tuple(entries) + + +def build_schedule_seeds( + contract: ContractAttributes, + terms: NormalizedActusTerms, + *, + contract_type: str, + asa_decimals: int, +) -> tuple[EventSeed, ...]: + """ + Dispatch contract-type-specific schedule construction. + + Routes to the appropriate schedule builder based on contract type + (PAM, LAM, NAM, ANN, LAX, or CLM). + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + contract_type: Base contract type (without subtype). + asa_decimals: Decimal places for the denomination ASA. + + Returns: + Tuple of event seeds for the contract's execution schedule. + """ + if contract_type == "PAM": + return build_pam_schedule(contract, terms) + if contract_type == "CLM": + return build_clm_schedule(contract, terms) + if contract_type == "LAM": + return build_lam_schedule(contract, terms, asa_decimals) + if contract_type == "NAM": + return build_nam_schedule(contract, terms, asa_decimals) + if contract_type == "ANN": + return build_ann_schedule(contract, terms, asa_decimals) + if contract_type == "LAX": + return build_lax_schedule(contract, terms, asa_decimals) + raise ActusNormalizationError(f"Unsupported ACTUS contract type: {contract_type}") diff --git a/src/d_asa/normalization/event_seeds.py b/src/d_asa/normalization/event_seeds.py new file mode 100644 index 00000000..f9dc625b --- /dev/null +++ b/src/d_asa/normalization/event_seeds.py @@ -0,0 +1,146 @@ +"""Event seed management for ACTUS contract normalization.""" + +from __future__ import annotations + +from collections.abc import Sequence +from dataclasses import dataclass +from decimal import Decimal + +from ..models import ExecutionScheduleEntry, ObservedEventRequest +from ..registry import EVENT_SCHEDULE_PRIORITY +from ..unix_time import UTCTimeStamp + + +@dataclass(frozen=True, slots=True) +class EventSeed: + """ + Intermediate normalized event before final schedule encoding. + + Represents a scheduled event during the normalization process, containing + all necessary information to generate the final ExecutionScheduleEntry. + + Attributes: + event_type: ACTUS event type (e.g., "IED", "IP", "PR", "MD"). + scheduled_time: Unix timestamp when event occurs. + accrual_factor: Optional year fraction for interest accrual. + redemption_accrual_factor: Optional year fraction for redemption accrual. + redemption_accrual_start: Start timestamp for redemption accrual period. + redemption_accrual_end: End timestamp for redemption accrual period. + next_nominal_interest_rate: Interest rate after this event. + next_principal_redemption: Principal redemption amount. + next_outstanding_principal: Outstanding principal after this event. + flags: Event flags (cash/non-cash, etc.). + """ + + event_type: str + scheduled_time: UTCTimeStamp + accrual_factor: int | float | Decimal | None = None + redemption_accrual_factor: int | float | Decimal | None = None + redemption_accrual_start: int = 0 + redemption_accrual_end: int = 0 + next_nominal_interest_rate: int | float | Decimal = 0 + next_principal_redemption: int = 0 + next_outstanding_principal: int = 0 + flags: int = 0 + + +def create_seed( + timestamp: UTCTimeStamp, + *, + event_type: str, + redemption_accrual_start: UTCTimeStamp = 0, + redemption_accrual_end: UTCTimeStamp = 0, + next_nominal_interest_rate: int = 0, + next_principal_redemption: int = 0, + next_outstanding_principal: int = 0, + flags: int = 0, +) -> EventSeed: + """ + Create an intermediate event seed from a resolved schedule timestamp. + + Factory function for creating EventSeed instances with default values + for optional fields. + + Args: + timestamp: Unix timestamp when event occurs. + event_type: ACTUS event type (e.g., "IED", "IP", "PR"). + redemption_accrual_start: Start of redemption accrual period. + redemption_accrual_end: End of redemption accrual period. + next_nominal_interest_rate: Interest rate after this event. + next_principal_redemption: Principal redemption amount. + next_outstanding_principal: Outstanding principal after event. + flags: Event flags (cash/non-cash, etc.). + + Returns: + Event seed with specified parameters. + """ + return EventSeed( + event_type=event_type, + scheduled_time=timestamp, + redemption_accrual_start=redemption_accrual_start, + redemption_accrual_end=redemption_accrual_end, + next_nominal_interest_rate=next_nominal_interest_rate, + next_principal_redemption=next_principal_redemption, + next_outstanding_principal=next_outstanding_principal, + flags=flags, + ) + + +def seed_from_preprocessed( + event_id: int, item: ObservedEventRequest | ExecutionScheduleEntry +) -> EventSeed: + """ + Convert a preprocessed event payload into an intermediate event seed. + + Handles both ObservedEventRequest and ExecutionScheduleEntry types, + converting them to the internal EventSeed representation. + + Args: + event_id: Unique identifier for the event. + item: Preprocessed event or schedule entry. + + Returns: + Event seed representation of the preprocessed event. + """ + if isinstance(item, ExecutionScheduleEntry): + return EventSeed( + event_type=item.event_type, + scheduled_time=item.scheduled_time, + accrual_factor=item.accrual_factor, + redemption_accrual_factor=item.redemption_accrual_factor, + next_nominal_interest_rate=item.next_nominal_interest_rate, + next_principal_redemption=item.next_principal_redemption, + next_outstanding_principal=item.next_outstanding_principal, + flags=item.flags, + ) + entry = item.to_schedule_entry(event_id) + return seed_from_preprocessed(event_id, entry) + + +def get_seed_sort_key(seed: EventSeed) -> tuple[int, int, str]: + """ + Return the deterministic ACTUS event ordering key for a seed. + + Events are ordered by: (1) scheduled time, (2) priority, (3) event type. + Ensures deterministic ordering when multiple events occur at the same time. + + Args: + seed: Event seed to generate sort key for. + + Returns: + Tuple of (scheduled_time, priority, event_type) for sorting. + """ + priority = EVENT_SCHEDULE_PRIORITY.get(seed.event_type, 99) + return seed.scheduled_time, priority, seed.event_type + + +def deduplicate_timestamps(ts: Sequence[UTCTimeStamp]) -> tuple[UTCTimeStamp, ...]: + """Remove duplicate timestamps while preserving sorted schedule order.""" + seen: set[UTCTimeStamp] = set() + ordered_unique: list[UTCTimeStamp] = [] + for timestamp in sorted(ts): + if timestamp in seen: + continue + seen.add(timestamp) + ordered_unique.append(timestamp) + return tuple(ordered_unique) diff --git a/src/d_asa/normalization/schedules.py b/src/d_asa/normalization/schedules.py new file mode 100644 index 00000000..fb5a52b3 --- /dev/null +++ b/src/d_asa/normalization/schedules.py @@ -0,0 +1,266 @@ +"""Schedule resolution utilities for ACTUS contracts.""" + +from __future__ import annotations + +from ..contracts import ContractAttributes +from ..errors import ActusNormalizationError +from ..models import NormalizedActusTerms +from ..schedule import Cycle, resolve_array_schedule, resolve_cycle_schedule +from ..unix_time import UTCTimeStamp +from .event_seeds import deduplicate_timestamps + + +def resolve_principal_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, + *, + lax: bool, + end_date: int | None = None, +) -> tuple[int, ...]: + """ + Resolve the principal redemption occurrence schedule. + + Generates timestamps for principal redemption events based on either + array-based schedules (LAX) or cycle-based schedules (standard contracts). + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms. + lax: Whether to use LAX array-based schedule logic. + end_date: Explicit end date for the schedule. If not provided, falls back to terms.maturity_date. + + Returns: + Tuple of Unix timestamps for principal redemption events. + + Raises: + ActusNormalizationError: If LAX arrays have misaligned lengths. + """ + if lax and contract.array_pr_anchor is not None: + anchors = tuple(ts for ts in contract.array_pr_anchor) + cycles = tuple(contract.array_pr_cycle or ()) + increases = tuple(value for value in contract.array_increase_decrease or ()) + pr_next = tuple(contract.array_pr_next or ()) + + anchor_len = len(anchors) + + # Validate all LAX arrays have aligned lengths + if cycles and len(cycles) != anchor_len: + raise ActusNormalizationError( + f"LAX array_pr_cycle length ({len(cycles)}) must match " + f"array_pr_anchor length ({anchor_len})" + ) + if increases and len(increases) != anchor_len: + raise ActusNormalizationError( + f"LAX array_increase_decrease length ({len(increases)}) must match " + f"array_pr_anchor length ({anchor_len})" + ) + if pr_next and len(pr_next) != anchor_len: + raise ActusNormalizationError( + f"LAX array_pr_next length ({len(pr_next)}) must match " + f"array_pr_anchor length ({anchor_len})" + ) + + # Use provided end_date or fall back to terms.maturity_date + effective_end = end_date if end_date is not None else terms.maturity_date + if effective_end is None: + return () + + if cycles: + timestamps = resolve_array_schedule( + anchors, + cycles, + effective_end, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + else: + timestamps = tuple(anchor for anchor in anchors) + return tuple( + ts + for ts in deduplicate_timestamps(timestamps) + if terms.initial_exchange_date < ts < effective_end + ) + + anchor = contract.principal_redemption_anchor + cycle = contract.principal_redemption_cycle + + # Use provided end_date or fall back to terms.maturity_date + effective_end = end_date if end_date is not None else terms.maturity_date + + if anchor is None or cycle is None or effective_end is None: + return () + + # Parse cycle to access stub attribute + parsed_cycle = Cycle.parse_cycle(cycle) + + timestamps = resolve_cycle_schedule( + anchor, + cycle, + effective_end, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + if parsed_cycle.stub == "+" and timestamps: + if timestamps[-1] != effective_end: + timestamps = timestamps[:-1] + return tuple( + ts for ts in timestamps if terms.initial_exchange_date <= ts < effective_end + ) + + +def resolve_interest_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, +) -> tuple[UTCTimeStamp, ...]: + """ + Resolve the interest payment occurrence schedule. + + Generates timestamps for interest payment (IP) events based on the + interest payment cycle. Ensures maturity date is included and all + events fall within the contract's active period (after IED, up to MD). + + The function handles cycle suffixes: + - If cycle ends with "+", the last event is adjusted to maturity_date + - Otherwise, maturity_date is appended to the schedule + + Args: + contract: ACTUS contract attributes with interest payment parameters. + terms: Normalized contract terms with IED and maturity date. + + Returns: + Tuple of Unix timestamps for interest payment events, deduplicated + and filtered to (IED, maturity_date]. Returns empty tuple if + interest_payment_anchor, interest_payment_cycle, or maturity_date + are not specified. + + Example: + >>> # Monthly interest payments from Feb to Dec 2021 + >>> contract = ContractAttributes( + ... interest_payment_anchor=1612137600, # 2021-02-01 + ... interest_payment_cycle=Cycle(count=1, unit="M"), + ... ... + ... ) + >>> terms = NormalizedActusTerms( + ... initial_exchange_date=1609459200, # 2021-01-01 + ... maturity_date=1640995200, # 2022-01-01 + ... ... + ... ) + >>> schedule = resolve_interest_schedule(contract, terms) + # Returns timestamps: [Feb 1, Mar 1, ..., Dec 1, Jan 1 2022] + """ + anchor = contract.interest_payment_anchor + cycle = contract.interest_payment_cycle + if anchor is None or cycle is None or terms.maturity_date is None: + return () + + # Parse cycle to access stub attribute + parsed_cycle = Cycle.parse_cycle(cycle) + + timestamps = list( + resolve_cycle_schedule( + anchor, + cycle, + terms.maturity_date, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + ) + timestamps = [ + ts + for ts in timestamps + if terms.initial_exchange_date < ts <= terms.maturity_date + ] + if timestamps: + md_present = terms.maturity_date in timestamps + if not md_present: + maturity_date = terms.maturity_date + if parsed_cycle.stub == "+": + timestamps[-1] = maturity_date + else: + timestamps.append(maturity_date) + return tuple(deduplicate_timestamps(timestamps)) + + +def resolve_rate_reset_occurrences( + contract: ContractAttributes, + terms: NormalizedActusTerms, +) -> tuple[tuple[int, str], ...]: + """ + Resolve rate reset occurrences and label them as RR or RRF. + + Generates tuples of (timestamp, event_type) for rate reset events, + distinguishing between simple resets (RR) and fixed resets (RRF). + + Events are filtered to occur after initial_exchange_date and before + maturity_date to ensure proper lifecycle ordering. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms with IED and maturity date. + + Returns: + Tuple of (timestamp, event_type) pairs for rate reset events. + """ + anchor = contract.rate_reset_anchor + cycle = contract.rate_reset_cycle + if anchor is None or cycle is None or terms.maturity_date is None: + return () + + timestamps = tuple( + ts + for ts in resolve_cycle_schedule( + anchor, + cycle, + terms.maturity_date, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + if terms.initial_exchange_date < ts < terms.maturity_date + ) + if not timestamps: + return () + + first_is_rrf = contract.rate_reset_next is not None + return tuple( + (ts, "RRF" if first_is_rrf and index == 0 else "RR") + for index, ts in enumerate(timestamps) + ) + + +def resolve_ipcb_schedule( + contract: ContractAttributes, + terms: NormalizedActusTerms, +) -> tuple[int, ...]: + """ + Resolve IPCB (Interest Payment Calculation Base) occurrence schedule. + + Events are filtered to occur after initial_exchange_date and up to + maturity_date to ensure proper lifecycle ordering. + + Args: + contract: ACTUS contract attributes. + terms: Normalized contract terms with IED and maturity date. + + Returns: + Tuple of timestamps for IPCB events. + """ + anchor = contract.interest_calculation_base_anchor + cycle = contract.interest_calculation_base_cycle + if anchor is None or cycle is None or terms.maturity_date is None: + return () + return tuple( + ts + for ts in resolve_cycle_schedule( + anchor, + cycle, + terms.maturity_date, + end_of_month_convention=contract.end_of_month_convention, + business_day_convention=contract.business_day_convention, + calendar=contract.calendar, + ) + if terms.initial_exchange_date < ts <= terms.maturity_date + ) diff --git a/src/d_asa/pam_lifecycle.py b/src/d_asa/pam_lifecycle.py new file mode 100644 index 00000000..5cbc7682 --- /dev/null +++ b/src/d_asa/pam_lifecycle.py @@ -0,0 +1,537 @@ +from __future__ import annotations + +from dataclasses import dataclass +from datetime import UTC, datetime +from decimal import Decimal + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + AssetOptInParams, + AssetTransferParams, + CommonAppCallParams, + SendParams, + SigningAccount, +) + +from . import constants as cst +from . import enums +from .artifacts.dasa_client import ( + AccountOpenArgs, + ContractConfigArgs, + ContractScheduleArgs, + DasaClient, + InitialKernelState, + NormalizedActusTerms, + PrimaryDistributionArgs, + Prospectus, +) +from .localnet import Currency, DAsaAccountManager, DAsaPrimaryDealer +from .models import ExecutionScheduleEntry, NormalizationResult +from .registry import EVENT_TYPE_IDS +from .schedule import Cycle + +PRINCIPAL = 10_000 +MINIMUM_DENOMINATION = 100 +ISSUANCE_DELAY_CYCLE = Cycle.parse_cycle("30D") +LOCALNET_EXPLORER_TX_BASE_URL = "https://lora.algokit.io/localnet/transaction/" +EVENT_TYPE_NAMES = {value: key for key, value in EVENT_TYPE_IDS.items()} +STATUS_NAMES = { + enums.STATUS_INACTIVE: "INACTIVE", + enums.STATUS_PENDING_IED: "PENDING_IED", + enums.STATUS_ACTIVE: "ACTIVE", + enums.STATUS_ENDED: "ENDED", +} + + +@dataclass(frozen=True) +class PamLifecycleParticipants: + investor: SigningAccount + receiver: SigningAccount + + +@dataclass(frozen=True, slots=True) +class PamLifecycleClaimTrace: + interest_amount: int + principal_amount: int + total_amount: int + timestamp: int + + +@dataclass(frozen=True, slots=True) +class PamLifecycleTraceStep: + schedule_entry: ExecutionScheduleEntry + execution_event: dict[str, int] + funded_amount: int + execution_tx_id: str + claim: PamLifecycleClaimTrace | None = None + claim_tx_id: str | None = None + + +@dataclass(frozen=True, slots=True) +class PamLifecycleTrace: + title: str + contract_variant: str + description: str + normalized: NormalizationResult + currency_decimals: int + currency_unit_name: str + investor_payment_amount: int + total_interest_claimed: int + total_principal_claimed: int + status_before_ied: int + status_after_ied: int + final_status: int + steps: tuple[PamLifecycleTraceStep, ...] + + +def client_terms(result: NormalizationResult) -> NormalizedActusTerms: + return NormalizedActusTerms( + contract_type=result.terms.contract_type, + denomination_asset_id=result.terms.denomination_asset_id, + settlement_asset_id=result.terms.denomination_asset_id, + total_units=result.terms.total_units, + notional_principal=result.terms.notional_principal, + initial_exchange_amount=result.terms.initial_exchange_amount, + initial_exchange_date=result.terms.initial_exchange_date, + maturity_date=result.terms.maturity_date or 0, + day_count_convention=int(result.terms.day_count_convention), + rate_reset_spread=result.terms.rate_reset_spread, + rate_reset_multiplier=result.terms.rate_reset_multiplier, + rate_reset_floor=result.terms.rate_reset_floor, + rate_reset_cap=result.terms.rate_reset_cap, + rate_reset_next=result.terms.rate_reset_next, + has_rate_reset_floor=result.terms.has_rate_reset_floor, + has_rate_reset_cap=result.terms.has_rate_reset_cap, + dynamic_principal_redemption=result.terms.dynamic_principal_redemption, + fixed_point_scale=result.terms.fixed_point_scale, + ) + + +def client_initial_state(result: NormalizationResult) -> InitialKernelState: + return InitialKernelState( + status_date=result.initial_state.status_date, + event_cursor=result.initial_state.event_cursor, + outstanding_principal=result.initial_state.outstanding_principal, + interest_calculation_base=result.initial_state.interest_calculation_base, + nominal_interest_rate=result.initial_state.nominal_interest_rate, + accrued_interest=result.initial_state.accrued_interest, + next_principal_redemption=result.initial_state.next_principal_redemption, + cumulative_interest_index=result.initial_state.cumulative_interest_index, + cumulative_principal_index=result.initial_state.cumulative_principal_index, + ) + + +def client_schedule_page( + page: tuple[ExecutionScheduleEntry, ...], +) -> list[tuple[int, int, int, int, int, int, int, int, int]]: + return [ + ( + entry.event_id, + EVENT_TYPE_IDS[entry.event_type], + entry.scheduled_time, + entry.accrual_factor, + entry.redemption_accrual_factor, + entry.next_nominal_interest_rate, + entry.next_principal_redemption, + entry.next_outstanding_principal, + entry.flags, + ) + for entry in page + ] + + +def cycle_duration_seconds(cycle: Cycle) -> int: + if cycle.unit == "D": + return cycle.count * cst.DAY_2_SEC + if cycle.unit == "W": + return cycle.count * 7 * cst.DAY_2_SEC + raise ValueError(f"Unsupported fixed-duration ACTUS cycle for this test: {cycle}") + + +def scale_currency_amount(amount: int, currency_scale: int) -> int: + return amount * currency_scale + + +def make_claim_trace( + *, + interest_amount: int, + principal_amount: int, + total_amount: int, + timestamp: int, +) -> PamLifecycleClaimTrace: + return PamLifecycleClaimTrace( + interest_amount=interest_amount, + principal_amount=principal_amount, + total_amount=total_amount, + timestamp=timestamp, + ) + + +def format_lifecycle_trace(trace: PamLifecycleTrace) -> str: + total_received = trace.total_interest_claimed + trace.total_principal_claimed + net_cash = total_received - trace.investor_payment_amount + principal = _format_asset_amount( + trace.normalized.terms.notional_principal, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + issue_price = _format_asset_amount( + trace.investor_payment_amount, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + interest_total = _format_asset_amount( + trace.total_interest_claimed, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + principal_total = _format_asset_amount( + trace.total_principal_claimed, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + total_received_label = _format_asset_amount( + total_received, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + net_cash_label = _format_asset_amount( + net_cash, + decimals=trace.currency_decimals, + unit_name=trace.currency_unit_name, + ) + maturity_label = ( + _format_timestamp(trace.normalized.terms.maturity_date) + if trace.normalized.terms.maturity_date + else "open-ended" + ) + + lines = [ + trace.title, + "=" * len(trace.title), + f"Variant : {trace.contract_variant}", + f"Description : {trace.description}", + f"Units : {trace.normalized.terms.total_units}", + f"Principal : {principal}", + f"Issue price : {issue_price}", + f"Issue date : {_format_timestamp(trace.normalized.terms.initial_exchange_date)}", + f"Maturity : {maturity_label}", + ( + "Status path : " + f"{STATUS_NAMES[trace.status_before_ied]} -> " + f"{STATUS_NAMES[trace.status_after_ied]} -> " + f"{STATUS_NAMES[trace.final_status]}" + ), + ( + "Investor P&L : " + f"paid {issue_price}, received {total_received_label} " + f"(interest {interest_total}, principal {principal_total}), net {net_cash_label}" + ), + f"Timeline ({trace.currency_unit_name} amounts)", + "--------------------------------", + ] + + table_headers = ( + "id", + "evt", + "due", + "applied", + "lag", + "accrual", + "payoff", + "settled", + "interest", + "principal", + "next out", + "rate", + ) + table_rows: list[tuple[str, ...]] = [] + + for step in trace.steps: + proof = step.execution_event + proof_type = EVENT_TYPE_NAMES.get(proof["event_type"], str(proof["event_type"])) + table_rows.append( + ( + f"{step.schedule_entry.event_id:02d}", + proof_type, + _format_table_timestamp(step.schedule_entry.scheduled_time), + _format_table_timestamp(proof["applied_at"]), + _format_time_delta( + proof["applied_at"] - step.schedule_entry.scheduled_time + ), + _format_ratio(step.schedule_entry.accrual_factor), + _format_scaled_amount( + proof["payoff"], + decimals=trace.currency_decimals, + ), + _format_scaled_amount( + proof["settled_amount"], + decimals=trace.currency_decimals, + ), + ( + _format_scaled_amount( + step.claim.interest_amount, + decimals=trace.currency_decimals, + ) + if step.claim is not None + else "-" + ), + ( + _format_scaled_amount( + step.claim.principal_amount, + decimals=trace.currency_decimals, + ) + if step.claim is not None + else "-" + ), + _format_scaled_amount( + step.schedule_entry.next_outstanding_principal, + decimals=trace.currency_decimals, + ), + ( + _format_rate(step.schedule_entry.next_nominal_interest_rate) + if step.schedule_entry.next_nominal_interest_rate + else "-" + ), + ) + ) + + lines.extend(_render_table(table_headers, table_rows)) + lines.extend(["", "Execution Links", "---------------"]) + execution_link_headers = ("id", "evt", "execution", "claim") + execution_link_rows = [ + ( + f"{step.schedule_entry.event_id:02d}", + step.schedule_entry.event_type, + _format_explorer_transaction_url(step.execution_tx_id), + ( + _format_explorer_transaction_url(step.claim_tx_id) + if step.claim_tx_id is not None + else "-" + ), + ) + for step in trace.steps + ] + lines.extend(_render_table(execution_link_headers, execution_link_rows)) + return "\n".join(lines) + + +def _open_contract_account( + client: DasaClient, + *, + account_manager: SigningAccount, + holding_address: str, + payment_address: str, +) -> None: + client.send.account_open( + AccountOpenArgs( + holding_address=holding_address, + payment_address=payment_address, + ), + params=CommonAppCallParams( + sender=account_manager.address, + signer=account_manager.signer, + ), + ) + + +def setup_pam_lifecycle( + *, + client: DasaClient, + primary_dealer: DAsaPrimaryDealer, + account_manager: DAsaAccountManager, + algorand: AlgorandClient, + bank: SigningAccount, + currency: Currency, + normalized: NormalizationResult, + bank_funding_amount: int, + investor_payment_amount: int, + prospectus_url: str, +) -> PamLifecycleParticipants: + pages = normalized.schedule_pages(cst.SCHEDULE_PAGE_SIZE) + client.send.contract_config( + ContractConfigArgs( + terms=client_terms(normalized), + initial_state=client_initial_state(normalized), + prospectus=Prospectus( + hash=bytes(32), + url=prospectus_url, + ), + ), + params=CommonAppCallParams(max_fee=AlgoAmount.from_micro_algo(5_000)), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + for index, page in enumerate(pages): + client.send.contract_schedule( + ContractScheduleArgs( + schedule_page_index=index, + is_last_page=index == len(pages) - 1, + schedule_page=client_schedule_page(page), + ), + params=CommonAppCallParams(max_fee=AlgoAmount.from_micro_algo(5_000)), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + + if bank_funding_amount > 0: + algorand.send.asset_transfer( + AssetTransferParams( + asset_id=currency.id, + amount=bank_funding_amount, + receiver=client.app_address, + sender=bank.address, + signer=bank.signer, + ) + ) + + investor = algorand.account.random() + algorand.account.ensure_funded_from_environment( + account_to_fund=investor.address, + min_spending_balance=AlgoAmount.from_algo(10), + ) + algorand.send.asset_opt_in( + AssetOptInParams( + asset_id=currency.id, + sender=investor.address, + signer=investor.signer, + ) + ) + _open_contract_account( + client, + account_manager=account_manager, + holding_address=investor.address, + payment_address=investor.address, + ) + + algorand.send.asset_transfer( + AssetTransferParams( + asset_id=currency.id, + amount=investor_payment_amount, + receiver=investor.address, + sender=bank.address, + signer=bank.signer, + ) + ) + + receiver = algorand.account.random() + algorand.account.ensure_funded_from_environment( + account_to_fund=receiver.address, + min_spending_balance=AlgoAmount.from_algo(10), + ) + _open_contract_account( + client, + account_manager=account_manager, + holding_address=receiver.address, + payment_address=receiver.address, + ) + + assert ( + algorand.asset.get_account_information(investor.address, currency.id).balance + == investor_payment_amount + ) + + investor_purchase_txn = algorand.create_transaction.asset_transfer( + AssetTransferParams( + asset_id=currency.id, + amount=investor_payment_amount, + receiver=client.app_address, + sender=investor.address, + signer=investor.signer, + ) + ) + client.new_group().add_transaction( + investor_purchase_txn, investor.signer + ).primary_distribution( + PrimaryDistributionArgs( + holding_address=investor.address, + units=normalized.terms.total_units, + ), + params=CommonAppCallParams( + sender=primary_dealer.address, + signer=primary_dealer.signer, + ), + ).send() + + assert ( + algorand.asset.get_account_information(investor.address, currency.id).balance + == 0 + ) + assert ( + algorand.asset.get_account_information(client.app_address, currency.id).balance + == bank_funding_amount + investor_payment_amount + ) + + return PamLifecycleParticipants( + investor=investor, + receiver=receiver, + ) + + +def _format_timestamp(timestamp: int) -> str: + return datetime.fromtimestamp(timestamp, tz=UTC).strftime("%Y-%m-%d %H:%M:%SZ") + + +def _format_asset_amount(amount: int, *, decimals: int, unit_name: str) -> str: + quantizer = Decimal(1).scaleb(-decimals) + scaled = (Decimal(amount) / (Decimal(10) ** decimals)).quantize(quantizer) + return f"{scaled:,.{decimals}f} {unit_name}" + + +def _format_scaled_amount(amount: int, *, decimals: int) -> str: + quantizer = Decimal(1).scaleb(-decimals) + scaled = (Decimal(amount) / (Decimal(10) ** decimals)).quantize(quantizer) + return f"{scaled:,.{decimals}f}" + + +def _format_table_timestamp(timestamp: int) -> str: + return datetime.fromtimestamp(timestamp, tz=UTC).strftime("%Y-%m-%d") + + +def _format_time_delta(delta_seconds: int) -> str: + sign = "+" if delta_seconds >= 0 else "-" + abs_delta = abs(delta_seconds) + if abs_delta % cst.DAY_2_SEC == 0: + return f"{sign}{abs_delta // cst.DAY_2_SEC}d" + if abs_delta % 3600 == 0: + return f"{sign}{abs_delta // 3600}h" + if abs_delta % 60 == 0: + return f"{sign}{abs_delta // 60}m" + return f"{sign}{abs_delta}s" + + +def _format_ratio(value: int) -> str: + scaled = Decimal(value) / Decimal(cst.FIXED_POINT_SCALE) + return f"{scaled:.6f}" + + +def _format_rate(value: int) -> str: + percent = Decimal(value) * Decimal(100) / Decimal(cst.FIXED_POINT_SCALE) + return f"{percent:.4f}%" + + +def _format_explorer_transaction_url(tx_id: str) -> str: + return f"{LOCALNET_EXPLORER_TX_BASE_URL}{tx_id}" + + +def _render_table( + headers: tuple[str, ...], + rows: list[tuple[str, ...]], +) -> list[str]: + widths = [len(header) for header in headers] + for row in rows: + for index, cell in enumerate(row): + widths[index] = max(widths[index], len(cell)) + + left_align = {1, 2, 3} + + def render_row(row: tuple[str, ...]) -> str: + cells: list[str] = [] + for index, cell in enumerate(row): + if index in left_align: + cells.append(cell.ljust(widths[index])) + else: + cells.append(cell.rjust(widths[index])) + return " | ".join(cells) + + separator = "-+-".join("-" * width for width in widths) + return [render_row(headers), separator, *[render_row(row) for row in rows]] diff --git a/tests/fixed_coupon_bond/__init__.py b/src/d_asa/py.typed similarity index 100% rename from tests/fixed_coupon_bond/__init__.py rename to src/d_asa/py.typed diff --git a/src/d_asa/registry.py b/src/d_asa/registry.py new file mode 100644 index 00000000..84574ffc --- /dev/null +++ b/src/d_asa/registry.py @@ -0,0 +1,85 @@ +"""ACTUS Contract Registry, defines the valid contract types, event types, and composition.""" + +from __future__ import annotations + +from . import enums + +SUPPORTED_CONTRACT_TYPES: frozenset[str] = frozenset( + {"PAM", "LAM", "NAM", "ANN", "LAX", "CLM"} +) + +REJECTED_EVENT_TYPES: frozenset[str] = frozenset( + {"PP", "PY", "SC", "CE", "PRD", "TD", "FP"} +) + +# Business Day Conventions that are not supported +REJECTED_BDC = frozenset( + { + enums.BDC_CSF, + enums.BDC_CSMF, + enums.BDC_CSP, + enums.BDC_CSMP, + } +) + +ALLOWED_EVENT_TYPES: dict[str, frozenset[str]] = { + "PAM": frozenset({"IED", "IP", "MD", "RR", "RRF"}), + "ANN": frozenset({"IED", "IP", "PR", "MD", "RR", "RRF", "IPCB", "PRF"}), + "NAM": frozenset({"IED", "IP", "PR", "MD", "RR", "RRF", "IPCB"}), + "LAM": frozenset({"IED", "IP", "PR", "MD", "RR", "RRF", "IPCB"}), + "LAX": frozenset({"IED", "IP", "PR", "PI", "MD", "RR", "RRF", "IPCB", "PRF"}), + "CLM": frozenset({"IED", "IP", "PR", "MD", "RR", "RRF"}), +} + +CASH_EVENT_TYPES: frozenset[str] = frozenset({"IP", "PR", "MD"}) +NON_CASH_EVENT_TYPES: frozenset[str] = frozenset( + {"IED", "PI", "RR", "RRF", "IPCB", "PRF"} +) + +CONTRACT_TYPE_IDS: dict[str, int] = { + "PAM": enums.CT_PAM, + "ANN": enums.CT_ANN, + "NAM": enums.CT_NAM, + "LAM": enums.CT_LAM, + "LAX": enums.CT_LAX, + "CLM": enums.CT_CLM, +} + +EVENT_TYPE_IDS: dict[str, int] = { + "IED": enums.EVT_IED, + "PI": enums.EVT_PI, + "PR": enums.EVT_PR, + "PRF": enums.EVT_PRF, + "IP": enums.EVT_IP, + "RRF": enums.EVT_RRF, + "RR": enums.EVT_RR, + "IPCB": enums.EVT_IPCB, + "MD": enums.EVT_MD, +} + +DAY_COUNT_CONVENTION_IDS: dict[str, int] = { + "AA": enums.DCC_AA, + "A360": enums.DCC_A360, + "A365": enums.DCC_A365, + "30E360ISDA": enums.DCC_30E360ISDA, + "30E360": enums.DCC_30E360, +} + +EVENT_SCHEDULE_PRIORITY: dict[str, int] = { + "AD": 0, + "IED": 1, + "PR": 4, + "PI": 5, + "PP": 6, + "PY": 7, + "IP": 8, + "RR": 10, + "RRF": 11, + "IPCB": 12, + "PRF": 14, + "FP": 15, + "PRD": 16, + "TD": 17, + "MD": 18, + "CE": 23, +} diff --git a/src/d_asa/schedule.py b/src/d_asa/schedule.py new file mode 100644 index 00000000..2e87e155 --- /dev/null +++ b/src/d_asa/schedule.py @@ -0,0 +1,542 @@ +from __future__ import annotations + +from calendar import monthrange +from collections.abc import Sequence +from dataclasses import dataclass +from typing import Literal, cast + +from .constants import DAY_2_SEC +from .day_count import ( + BusinessDayConvention, + Calendar, + EndOfMonthConvention, + is_end_of_month, +) +from .errors import UnsupportedActusFeatureError +from .unix_time import UTCTimeStamp, datetime_to_timestamp, timestamp_to_datetime + +CycleUnit = Literal["D", "W", "M", "Q", "H", "Y"] + + +@dataclass(frozen=True, slots=True) +class Cycle: + """ + ACTUS cycle object representing a time period for schedule generation. + + Attributes: + count: The number of units in the cycle (e.g., 3 for "3M") + unit: The time unit - D (days), W (weeks), M (months), Q (quarters), + H (half-years), Y (years) + stub: Optional stub period marker ("+" or "-") for short/long stubs + + ACTUS string notation examples: + - "90D" = 90 days + - "12W" = 12 weeks + - "3M" = 3 months + - "1Q" = 1 quarter (3 months) + - "1H" = 1 half-year (6 months) + - "2Y" = 2 years + - "3M+" = 3 months with long stub marker + - "1Q-" = 1 quarter with short stub marker + """ + + count: int + unit: CycleUnit + stub: str = "" + + @classmethod + def parse_cycle(cls, raw_cycle: str | Cycle) -> Cycle: + """ + Parse an ACTUS cycle string into a Cycle object. + + Args: + raw_cycle: String representation of the cycle (e.g., "3M", "1Q+") + + Returns: + Cycle object with parsed count, unit, and optional stub marker + + Raises: + TypeError: If raw_cycle is not convertible to string + ValueError: If cycle format is invalid or unit is not recognized + + Examples: + >>> Cycle.parse_cycle("3M") + Cycle(count=3, unit='M', stub='') + >>> Cycle.parse_cycle("1Q+") + Cycle(count=1, unit='Q', stub='+') + """ + + # If already a Cycle object, return it as-is + if isinstance(raw_cycle, Cycle): + return raw_cycle + + try: + cycle_str = str(raw_cycle).strip().upper() + except Exception as exc: + raise TypeError( + f"Cannot convert cycle to string: {type(raw_cycle).__name__}" + ) from exc + + if not cycle_str: + raise ValueError("Cycle string cannot be empty") + + stub = "" + if cycle_str.endswith(("+", "-")): + # Sanitize cycle removing markers. Example: "3M+" -> cycle="3M", stub="+" + stub = cycle_str[-1] + cycle_str = cycle_str[:-1] + + if len(cycle_str) < 2 or not cycle_str[:-1].isdigit(): + raise ValueError( + f"Unsupported ACTUS cycle: {raw_cycle!r} (expected format: [+|-])" + ) + + count_str = cycle_str[:-1] + unit = cycle_str[-1] + + if unit not in ("D", "W", "M", "Q", "H", "Y"): + raise ValueError( + f"Invalid cycle unit '{unit}'. Must be one of: D, W, M, Q, H, Y" + ) + + count = int(count_str) + if count <= 0: + raise ValueError(f"Cycle count must be positive, got: {count}") + + return Cycle(count=count, unit=cast(CycleUnit, unit), stub=stub) + + +def _add_month_cycle_from_anchor( + anchor_timestamp: UTCTimeStamp, + *, + cycle: Cycle, + occurrence_index: int, + end_of_month_convention: EndOfMonthConvention, +) -> UTCTimeStamp: + """ + Advance a month-based cycle from a fixed anchor UTC UNIX timestamp. + + This function calculates the timestamp for a specific occurrence of a + month-based cycle (M, Q, H, Y) by adding the appropriate number of months + to the anchor date. It handles month-end dates according to the specified + end-of-month convention. + + Args: + anchor_timestamp: The starting point (UTC UNIX timestamp) from which to calculate + cycle: Cycle object with unit in {"M", "Q", "H", "Y"} + occurrence_index: Which occurrence to calculate (0 = anchor, 1 = first, etc.) + end_of_month_convention: How to handle month-end dates: + - SD (Same Day): Always use the same day of month (capped to valid days) + - EOM (End of Month): If anchor is month-end, result is also month-end + + Returns: + UTC UNIX timestamp for the specified occurrence + + Raises: + ValueError: If cycle.unit is not a month-based unit (M, Q, H, Y) + ValueError: If occurrence_index is negative + + Examples: + For anchor = Jan 31 2024 (month-end), cycle = "1M": + - With SD: Feb 29, Mar 31, Apr 30, May 31, ... + - With EOM: Feb 29, Mar 31, Apr 30, May 31, ... + (Both produce month-ends since Jan 31 is a month-end) + + For anchor = Feb 29 2024 (month-end in leap year), cycle = "1M": + - With SD: Mar 29, Apr 29, May 29, Jun 29, ... + - With EOM: Mar 31, Apr 30, May 31, Jun 30, ... + (EOM sticks to month-ends; SD uses day 29) + """ + + if occurrence_index < 0: + raise ValueError( + f"occurrence_index must be non-negative, got: {occurrence_index}" + ) + + month_delta_map = {"M": 1, "Q": 3, "H": 6, "Y": 12} + if cycle.unit not in month_delta_map: + raise ValueError( + f"Unsupported cycle unit for month-based calculation: {cycle.unit}" + ) + + current = timestamp_to_datetime(anchor_timestamp) + total_months = occurrence_index * cycle.count * month_delta_map[cycle.unit] + month_index = (current.month - 1) + total_months + year = current.year + month_index // 12 + month = (month_index % 12) + 1 + day = min(current.day, monthrange(year, month)[1]) + + if end_of_month_convention == EndOfMonthConvention.EOM and is_end_of_month(current): + day = monthrange(year, month)[1] + + return datetime_to_timestamp(current.replace(year=year, month=month, day=day)) + + +def _add_cycle_chained( + timestamp: UTCTimeStamp, + cycle: Cycle, + *, + end_of_month_convention: EndOfMonthConvention, +) -> UTCTimeStamp: + """ + Advance one chained cycle from the current UTC UNIX timestamp. + + This function adds exactly one cycle period to the given timestamp. + For day and week cycles, it performs simple arithmetic addition. + For month-based cycles, it delegates to _add_month_cycle_from_anchor + with occurrence_index=1. + + Args: + timestamp: Current UTC UNIX timestamp to advance from + cycle: Cycle object defining the period to add + end_of_month_convention: How to handle month-end dates (used for month-based cycles) + + Returns: + UTC UNIX timestamp advanced by one cycle period + + Raises: + ValueError: If cycle.unit is not a recognized unit + + Note: + This is used for iterative schedule generation where each date is + calculated from the previous one, rather than from a fixed anchor. + """ + + if cycle.unit == "D": + return timestamp + cycle.count * DAY_2_SEC + if cycle.unit == "W": + return timestamp + cycle.count * 7 * DAY_2_SEC + if cycle.unit in {"M", "Q", "H", "Y"}: + return _add_month_cycle_from_anchor( + timestamp, + cycle=cycle, + occurrence_index=1, + end_of_month_convention=end_of_month_convention, + ) + + raise ValueError(f"Unsupported cycle unit: {cycle.unit}") + + +def add_cycle( + timestamp: UTCTimeStamp, + cycle: str | Cycle, + *, + end_of_month_convention: EndOfMonthConvention, + anchor_timestamp: UTCTimeStamp | None = None, + occurrence_index: int | None = None, +) -> UTCTimeStamp: + """ + Advance a UTC UNIX timestamp by one ACTUS cycle occurrence. + + This function supports two calculation modes: + 1. Anchor-based: When both anchor_timestamp and occurrence_index are provided, + calculates the Nth occurrence from the anchor (more accurate for long schedules) + 2. Chained: When anchor parameters are None, adds one cycle to timestamp + (simple iteration from previous date) + + Args: + timestamp: UTC UNIX timestamp to advance (used in chained mode) + cycle: ACTUS cycle (e.g., "3M", "1Q", "90D") or Cycle object + end_of_month_convention: How to handle month-end dates for month-based cycles + anchor_timestamp: Optional fixed starting point for anchor-based calculation + occurrence_index: Optional occurrence number (0 = anchor, 1 = first, etc.) + + Returns: + UTC UNIX timestamp advanced by the cycle + + Note: + Anchor-based mode is preferred for generating full schedules as it prevents + error accumulation. Chained mode is simpler but can accumulate rounding errors + over many iterations. + """ + + # Parse cycle if string + cycle = Cycle.parse_cycle(cycle) + + # Anchor-based mode: calculate from fixed anchor + if anchor_timestamp is not None and occurrence_index is not None: + if cycle.unit in {"M", "Q", "H", "Y"}: + return _add_month_cycle_from_anchor( + anchor_timestamp, + cycle=cycle, + occurrence_index=occurrence_index, + end_of_month_convention=end_of_month_convention, + ) + if cycle.unit == "D": + return anchor_timestamp + occurrence_index * cycle.count * DAY_2_SEC + if cycle.unit == "W": + return anchor_timestamp + occurrence_index * cycle.count * 7 * DAY_2_SEC + + # Chained mode: calculate from previous timestamp + return _add_cycle_chained( + timestamp, cycle, end_of_month_convention=end_of_month_convention + ) + + +def generate_schedule( + start: UTCTimeStamp, + cycle: str | Cycle, + end: UTCTimeStamp, + *, + end_of_month_convention: EndOfMonthConvention, +) -> tuple[UTCTimeStamp, ...]: + """ + Generate raw cycle dates from a start anchor up to an inclusive end date. + + This function creates a sequence of timestamps by repeatedly applying + the cycle from the start anchor. The start date is always included as + the first element. All dates are calculated from the anchor to prevent + error accumulation. + + Args: + start: UTC UNIX timestamp anchor (first date in schedule) + cycle: ACTUS cycle (e.g., "3M", "1Q", "90D") or Cycle object + end: UTC UNIX timestamp upper bound (inclusive) + end_of_month_convention: How to handle month-end dates for month-based cycles + + Returns: + Tuple of UTC UNIX timestamps from start up to (but not exceeding) end. + Returns empty tuple if start <= 0, end <= 0, or start > end. + + Examples: + >>> # For timestamps representing 2024-01-15, 2024-04-15 + >>> generate_schedule( + ... start=1705276800, # 2024-01-15 00:00:00 UTC + ... cycle="1M", + ... end=1713139200 # 2024-04-15 00:00:00 UTC + ... ) + (1705276800, 1707955200, 1710547200, 1713139200) + """ + + if start <= 0 or end <= 0 or start > end: + return () + + # Parse cycle if string + cycle = Cycle.parse_cycle(cycle) + + schedule: list[int] = [] + occurrence_index = 0 + + # Safety check: prevent infinite loops (max 100 years worth of daily cycles) + max_iterations = 100 * 365 + 25 # ~36,525 iterations + + while occurrence_index < max_iterations: + current = add_cycle( + start, + cycle, + end_of_month_convention=end_of_month_convention, + anchor_timestamp=start, + occurrence_index=occurrence_index, + ) + if current > end: + break + schedule.append(current) + occurrence_index += 1 + + # Check if we hit max_iterations without completing the schedule + if occurrence_index >= max_iterations: + # Verify if we actually reached the end + last_date = schedule[-1] if schedule else start + if last_date <= end: + raise ValueError( + f"Schedule generation exceeded maximum iterations ({max_iterations}). " + f"Last generated date: {last_date}, target end: {end}. " + "This may indicate an invalid cycle or an extremely long schedule." + ) + + return tuple(schedule) + + +def generate_array_schedule( + anchors: Sequence[UTCTimeStamp], + cycles: Sequence[str | Cycle], + end: UTCTimeStamp, + *, + end_of_month_convention: EndOfMonthConvention, +) -> tuple[UTCTimeStamp, ...]: + """ + Generate a flattened schedule from parallel anchor and cycle arrays. + + This function supports piecewise schedule generation where different + cycles apply to different time periods. Each anchor/cycle pair defines + a sub-schedule, and all sub-schedules are merged, sorted, and deduplicated. + + The algorithm: + 1. For each (anchor, cycle) pair, generate dates up to the next anchor + (or the final end date for the last pair) + 2. Exclude dates that equal or exceed the next anchor (except for last segment) + 3. Merge all dates, add the final end date, sort, and remove duplicates + + Args: + anchors: Sequence of UTC UNIX timestamps marking schedule segment starts + cycles: Sequence of ACTUS cycle strings or Cycle objects, parallel to anchors + end: UTC UNIX timestamp upper bound (inclusive, always included in result) + end_of_month_convention: How to handle month-end dates for month-based cycles + + Returns: + Tuple of sorted, unique UTC UNIX timestamps covering all segments. + Returns empty tuple if anchors is empty, end <= 0, or any anchor <= 0 or > end. + + Raises: + ValueError: If anchors and cycles have different lengths + ValueError: If anchors are not in strictly ascending order + + Examples: + >>> # Generate piecewise schedule with different cycles per segment + >>> generate_array_schedule( + ... anchors=[1704067200, 1711929600], # 2024-01-01, 2024-04-01 UTC + ... cycles=["1M", "3M"], + ... end=1735603200 # 2024-12-31 UTC + ... ) + # Returns monthly timestamps for Jan-Mar, quarterly for Apr-Dec, plus Dec 31 + """ + + if len(anchors) != len(cycles): + raise ValueError("anchors and cycles must have same length") + if not anchors: + return () + + # Validate end and anchors to align with generate_schedule behavior + if end <= 0: + return () + if any(anchor <= 0 or anchor > end for anchor in anchors): + return () + + # Validate that anchors are in strictly ascending order + for i in range(len(anchors) - 1): + if anchors[i] >= anchors[i + 1]: + raise ValueError( + f"anchors must be in strictly ascending order: " + f"anchors[{i}]={anchors[i]} >= anchors[{i + 1}]={anchors[i + 1]}" + ) + + # Use a set for efficient deduplication + all_dates_set: set[int] = set() + + for index, (anchor, cycle) in enumerate(zip(anchors, cycles, strict=True)): + sub_end = end if index + 1 == len(anchors) else anchors[index + 1] + sub_schedule = generate_schedule( + anchor, + cycle, + sub_end, + end_of_month_convention=end_of_month_convention, + ) + + if index + 1 < len(anchors): + # Exclude dates that equal or exceed the next anchor + all_dates_set.update(date for date in sub_schedule if date < sub_end) + else: + all_dates_set.update(sub_schedule) + + # Always include the end date + all_dates_set.add(end) + + return tuple(sorted(all_dates_set)) + + +def resolve_cycle_schedule( + start: UTCTimeStamp, + cycle: str | Cycle, + end: UTCTimeStamp, + *, + end_of_month_convention: EndOfMonthConvention, + business_day_convention: BusinessDayConvention, + calendar: Calendar, +) -> tuple[UTCTimeStamp, ...]: + """ + Generate and business-day-adjust a cycle-based ACTUS schedule. + + This is the high-level function for creating a complete schedule from + a single anchor and cycle. It generates the base schedule and applies + business day adjustments according to the specified convention and calendar. + + Args: + start: UTC UNIX timestamp anchor (first date in schedule) + cycle: ACTUS cycle string or Cycle object + end: UTC UNIX timestamp upper bound (inclusive) + end_of_month_convention: How to handle month-end dates for month-based cycles + business_day_convention: How to adjust dates that fall on non-business days + calendar: Which calendar defines business days vs. holidays + + Returns: + Tuple of UTC UNIX timestamps with business day adjustments applied + + Raises: + UnsupportedActusFeatureError: If business_day_convention is not NO_SHIFT + UnsupportedActusFeatureError: If calendar is not NO_CALENDAR + + Note: + V1 implementation only supports: + - BusinessDayConvention: NO_SHIFT (no adjustments) + - Calendar: NO_CALENDAR (all days are business days) + """ + + if business_day_convention != BusinessDayConvention.NOS: + raise UnsupportedActusFeatureError( + "Supported Business Day Convention: NO_SHIFT" + ) + if calendar != Calendar.NC: + raise UnsupportedActusFeatureError("Supported Calendar: NO_CALENDAR") + + base_dates = generate_schedule( + start, + cycle, + end, + end_of_month_convention=end_of_month_convention, + ) + return tuple(base_date for base_date in base_dates) + + +def resolve_array_schedule( + anchors: Sequence[UTCTimeStamp], + cycles: Sequence[str | Cycle], + end: UTCTimeStamp, + *, + end_of_month_convention: EndOfMonthConvention, + business_day_convention: BusinessDayConvention, + calendar: Calendar, +) -> tuple[UTCTimeStamp, ...]: + """ + Generate and business-day-adjust an array-based ACTUS schedule. + + This is the high-level function for creating a piecewise schedule from + multiple anchors and cycles. It generates the base schedule using array + logic and applies business day adjustments according to the specified + convention and calendar. + + Args: + anchors: Sequence of UTC UNIX timestamps marking schedule segment starts + cycles: Sequence of ACTUS cycle strings or Cycle objects, parallel to anchors + end: UTC UNIX timestamp upper bound (inclusive) + end_of_month_convention: How to handle month-end dates for month-based cycles + business_day_convention: How to adjust dates that fall on non-business days + calendar: Which calendar defines business days vs. holidays + + Returns: + Tuple of UTC UNIX timestamps with business day adjustments applied + + Raises: + UnsupportedActusFeatureError: If business_day_convention is not NO_SHIFT + UnsupportedActusFeatureError: If calendar is not NO_CALENDAR + ValueError: If anchors and cycles have different lengths + + Note: + V1 implementation only supports: + - BusinessDayConvention: NO_SHIFT (no adjustments) + - Calendar: NO_CALENDAR (all days are business days) + """ + + if business_day_convention != BusinessDayConvention.NOS: + raise UnsupportedActusFeatureError( + "Supported Business Day Convention: NO_SHIFT" + ) + if calendar != Calendar.NC: + raise UnsupportedActusFeatureError("Supported Calendar: NO_CALENDAR") + + base_dates = generate_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=end_of_month_convention, + ) + return tuple(base_date for base_date in base_dates) diff --git a/src/d_asa/showcase.py b/src/d_asa/showcase.py new file mode 100644 index 00000000..b6132d30 --- /dev/null +++ b/src/d_asa/showcase.py @@ -0,0 +1,532 @@ +from __future__ import annotations + +import argparse +from collections.abc import Callable +from dataclasses import dataclass + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + AssetCreateParams, + CommonAppCallParams, + SendParams, + SigningAccount, +) + +from . import constants as cst +from . import enums +from .artifacts.dasa_client import ( + ClaimDueCashflowsArgs, + ContractCreateArgs, + DasaClient, + DasaFactory, + FundDueCashflowsArgs, + RbacAssignRoleArgs, + RoleValidity, +) +from .contracts import make_pam_fixed_coupon_bond_profile, make_pam_zero_coupon_bond +from .localnet import ( + Currency, + DAsaAccountManager, + DAsaPrimaryDealer, + LocalNetConfig, + algorand_client_from_localnet, + decode_actus_execution_event, + get_event_from_call_result, + get_latest_timestamp, + get_primary_tx_id, + load_localnet_config, + time_warp, +) +from .models import NormalizationResult +from .normalization import normalize_contract_attributes +from .pam_lifecycle import ( + ISSUANCE_DELAY_CYCLE, + MINIMUM_DENOMINATION, + PRINCIPAL, + PamLifecycleTrace, + PamLifecycleTraceStep, + cycle_duration_seconds, + format_lifecycle_trace, + make_claim_trace, + setup_pam_lifecycle, +) +from .registry import EVENT_TYPE_IDS +from .schedule import Cycle + +INITIAL_ALGO_FUNDS = AlgoAmount.from_algo(10_000) +DENOMINATION_ASA_NAME = "Euro" +DENOMINATION_ASA_UNIT = "EUR" +DENOMINATION_ASA_DECIMALS = 2 +DENOMINATION_ASA_SCALE = 10**DENOMINATION_ASA_DECIMALS +DENOMINATION_ASA_TOTAL = 10_000_000 * DENOMINATION_ASA_SCALE + +NOMINAL_RATE = 0.02 +INTEREST_PAYMENT_CYCLE = Cycle.parse_cycle("90D") +MATURITY_OFFSET_CYCLE = Cycle.parse_cycle("1800D") +ZERO_COUPON_MATURITY_CYCLE = Cycle.parse_cycle("360D") +ZERO_COUPON_DISCOUNT_BPS = 200 + + +@dataclass(frozen=True, slots=True) +class PamShowcaseScenario: + title: str + contract_variant: str + description: str + normalized: NormalizationResult + bank_funding_amount: int + investor_payment_amount: int + expected_total_interest_amount: int + + +def _derive_total_interest_amount(result: NormalizationResult) -> int: + outstanding_principal = result.schedule[0].next_outstanding_principal + nominal_interest_rate = ( + result.schedule[0].next_nominal_interest_rate or result.terms.rate_reset_next + ) + accrued_interest = 0 + total_interest = 0 + + for entry in result.schedule[1:]: + interest_segment = ( + outstanding_principal + * nominal_interest_rate + // result.terms.fixed_point_scale + * entry.accrual_factor + // result.terms.fixed_point_scale + ) + + if entry.event_type in {"IP", "MD"}: + total_interest += accrued_interest + interest_segment + accrued_interest = 0 + elif entry.event_type == "PR": + accrued_interest += interest_segment + + if entry.event_type in {"PR", "MD"}: + outstanding_principal = entry.next_outstanding_principal + + if entry.next_nominal_interest_rate: + nominal_interest_rate = entry.next_nominal_interest_rate + + return total_interest + + +def _build_fixed_coupon_showcase( + algorand: AlgorandClient, + currency: Currency, +) -> PamShowcaseScenario: + current_ts = get_latest_timestamp(algorand.client.algod) + issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) + coupon_period = cycle_duration_seconds(INTEREST_PAYMENT_CYCLE) + maturity_offset = cycle_duration_seconds(MATURITY_OFFSET_CYCLE) + if maturity_offset % coupon_period != 0: + raise ValueError("Maturity offset must be an exact multiple of coupon period") + total_coupons = maturity_offset // coupon_period + + issuance_date = current_ts + issuance_delay + first_coupon_date = issuance_date + coupon_period + maturity_date = issuance_date + maturity_offset + + attrs = make_pam_fixed_coupon_bond_profile( + contract_id=1, + status_date=current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=PRINCIPAL, + nominal_interest_rate=NOMINAL_RATE, + interest_payment_cycle=INTEREST_PAYMENT_CYCLE, + interest_payment_anchor=first_coupon_date, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=currency.id, + denomination_asset_decimals=currency.decimals, + notional_unit_value=MINIMUM_DENOMINATION, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + if [entry.event_type for entry in normalized.schedule] != [ + "IED", + *(["IP"] * total_coupons), + "MD", + ]: + raise ValueError("Unexpected normalized schedule for fixed coupon showcase") + total_interest_amount = _derive_total_interest_amount(normalized) + + return PamShowcaseScenario( + title="D-ASA lifecycle showcase: PAM fixed coupon bond", + contract_variant="PAM:FCB", + description=f"{total_coupons} coupon periods at {NOMINAL_RATE:.2%} nominal rate", + normalized=normalized, + bank_funding_amount=total_interest_amount, + investor_payment_amount=normalized.terms.initial_exchange_amount, + expected_total_interest_amount=total_interest_amount, + ) + + +def _build_zero_coupon_showcase( + algorand: AlgorandClient, + currency: Currency, +) -> PamShowcaseScenario: + current_ts = get_latest_timestamp(algorand.client.algod) + issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) + maturity_offset = cycle_duration_seconds(ZERO_COUPON_MATURITY_CYCLE) + + issuance_date = current_ts + issuance_delay + maturity_date = issuance_date + maturity_offset + discount_amount = PRINCIPAL * ZERO_COUPON_DISCOUNT_BPS // cst.BPS + + attrs = make_pam_zero_coupon_bond( + contract_id=2, + status_date=current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=PRINCIPAL, + premium_discount_at_ied=discount_amount, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=currency.id, + denomination_asset_decimals=currency.decimals, + notional_unit_value=MINIMUM_DENOMINATION, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + if [entry.event_type for entry in normalized.schedule] != ["IED", "MD"]: + raise ValueError("Unexpected normalized schedule for zero coupon showcase") + + return PamShowcaseScenario( + title="D-ASA lifecycle showcase: PAM zero coupon bond", + contract_variant="PAM:ZCB", + description=f"{ZERO_COUPON_DISCOUNT_BPS / cst.BPS:.2%} discount at issuance, single maturity redemption", + normalized=normalized, + bank_funding_amount=normalized.terms.notional_principal + - normalized.terms.initial_exchange_amount, + investor_payment_amount=normalized.terms.initial_exchange_amount, + expected_total_interest_amount=0, + ) + + +SHOWCASE_BUILDERS: tuple[ + Callable[[AlgorandClient, Currency], PamShowcaseScenario], + ..., +] = ( + _build_fixed_coupon_showcase, + _build_zero_coupon_showcase, +) + + +def run_showcase_scenario( + *, + algorand: AlgorandClient, + bank: SigningAccount, + currency: Currency, + d_asa_client: DasaClient, + pam_primary_dealer: DAsaPrimaryDealer, + pam_account_manager: DAsaAccountManager, + build_scenario: Callable[[AlgorandClient, Currency], PamShowcaseScenario], +) -> PamLifecycleTrace: + scenario = build_scenario(algorand, currency) + participants = setup_pam_lifecycle( + client=d_asa_client, + primary_dealer=pam_primary_dealer, + account_manager=pam_account_manager, + algorand=algorand, + bank=bank, + currency=currency, + normalized=scenario.normalized, + bank_funding_amount=scenario.bank_funding_amount, + investor_payment_amount=scenario.investor_payment_amount, + prospectus_url=scenario.title, + ) + investor = participants.investor + client = d_asa_client + + initial_state = client.send.contract_get_state().abi_return + if initial_state.status != enums.STATUS_PENDING_IED: + raise ValueError("Contract must start in PENDING_IED") + if initial_state.schedule_entry_count != len(scenario.normalized.schedule): + raise ValueError("Unexpected schedule length in showcase contract state") + + ied_entry = scenario.normalized.schedule[0] + time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC, algorand=algorand) + ied_result = client.send.contract_execute_ied() + ied_event = decode_actus_execution_event(get_event_from_call_result(ied_result)) + if ied_event["event_id"] != ied_entry.event_id: + raise ValueError("Unexpected IED event id") + if ied_event["event_type"] != EVENT_TYPE_IDS["IED"]: + raise ValueError("Unexpected IED event type") + if ied_event["scheduled_time"] != ied_entry.scheduled_time: + raise ValueError("Unexpected IED scheduled time") + if ied_event["payoff"] != scenario.investor_payment_amount: + raise ValueError("Unexpected IED payoff") + if ied_event["payoff_sign"] != enums.PAYOFF_SIGN_POSITIVE: + raise ValueError("Unexpected IED payoff sign") + if ied_event["settled_amount"] != 0: + raise ValueError("IED should not settle holder cashflows") + if ied_event["sequence"] != ied_entry.event_id + 1: + raise ValueError("Unexpected IED sequence") + + steps: list[PamLifecycleTraceStep] = [ + PamLifecycleTraceStep( + schedule_entry=ied_entry, + execution_event=ied_event, + funded_amount=0, + execution_tx_id=get_primary_tx_id(ied_result), + ) + ] + + active_state = client.send.contract_get_state().abi_return + if active_state.status != enums.STATUS_ACTIVE: + raise ValueError("Contract must become ACTIVE after IED") + if active_state.event_cursor != 1: + raise ValueError("Unexpected event cursor after IED") + total_interest_claimed = 0 + total_principal_claimed = 0 + + for entry in scenario.normalized.schedule[1:]: + time_warp(entry.scheduled_time, algorand=algorand) + + funding_result = client.send.fund_due_cashflows( + FundDueCashflowsArgs(max_event_count=1) + ) + funding = funding_result.abi_return + event = decode_actus_execution_event(get_event_from_call_result(funding_result)) + if funding.processed_events != 1: + raise ValueError("Showcase funding should process exactly one event") + if funding.total_funded <= 0: + raise ValueError("Showcase funding must reserve a positive amount") + if event["event_id"] != entry.event_id: + raise ValueError("Unexpected funding event id") + if event["event_type"] != EVENT_TYPE_IDS[entry.event_type]: + raise ValueError("Unexpected funding event type") + if event["scheduled_time"] != entry.scheduled_time: + raise ValueError("Unexpected funding scheduled time") + if event["payoff"] != funding.total_funded: + raise ValueError("Unexpected funding payoff") + if event["payoff_sign"] != enums.PAYOFF_SIGN_NEGATIVE: + raise ValueError("Unexpected funding payoff sign") + if event["settled_amount"] != funding.total_funded: + raise ValueError("Unexpected settled amount") + if event["sequence"] != entry.event_id + 1: + raise ValueError("Unexpected funding sequence") + + balance_before = algorand.asset.get_account_information( + investor.address, + currency.id, + ).balance + claim_result = client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=investor.address, + payment_info=b"", + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + max_fee=AlgoAmount.from_micro_algo(3_000), + ), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + claim = claim_result.abi_return + balance_after = algorand.asset.get_account_information( + investor.address, + currency.id, + ).balance + + if claim.total_amount != funding.total_funded: + raise ValueError("Claimed amount does not match funded amount") + if balance_after - balance_before != claim.total_amount: + raise ValueError("Investor settlement balance does not match claim amount") + + steps.append( + PamLifecycleTraceStep( + schedule_entry=entry, + execution_event=event, + funded_amount=funding.total_funded, + execution_tx_id=get_primary_tx_id(funding_result), + claim=make_claim_trace( + interest_amount=claim.interest_amount, + principal_amount=claim.principal_amount, + total_amount=claim.total_amount, + timestamp=claim.timestamp, + ), + claim_tx_id=get_primary_tx_id(claim_result), + ) + ) + total_interest_claimed += claim.interest_amount + total_principal_claimed += claim.principal_amount + + final_state = client.send.contract_get_state().abi_return + if final_state.status != enums.STATUS_ENDED: + raise ValueError("Showcase contract did not end cleanly") + if final_state.event_cursor != len(scenario.normalized.schedule): + raise ValueError("Unexpected final event cursor") + if total_interest_claimed != scenario.expected_total_interest_amount: + raise ValueError("Unexpected total claimed interest") + if total_principal_claimed != scenario.normalized.terms.notional_principal: + raise ValueError("Unexpected total claimed principal") + + return PamLifecycleTrace( + title=scenario.title, + contract_variant=scenario.contract_variant, + description=scenario.description, + normalized=scenario.normalized, + currency_decimals=currency.decimals, + currency_unit_name=currency.unit_name, + investor_payment_amount=scenario.investor_payment_amount, + total_interest_claimed=total_interest_claimed, + total_principal_claimed=total_principal_claimed, + status_before_ied=initial_state.status, + status_after_ied=active_state.status, + final_status=final_state.status, + steps=tuple(steps), + ) + + +def _create_funded_account(algorand: AlgorandClient) -> SigningAccount: + account = algorand.account.random() + algorand.account.ensure_funded_from_environment( + account_to_fund=account.address, + min_spending_balance=INITIAL_ALGO_FUNDS, + ) + return account + + +def _create_currency(algorand: AlgorandClient, bank: SigningAccount) -> Currency: + currency_id = algorand.send.asset_create( + AssetCreateParams( + sender=bank.address, + signer=bank.signer, + total=DENOMINATION_ASA_TOTAL, + decimals=DENOMINATION_ASA_DECIMALS, + asset_name=DENOMINATION_ASA_NAME, + unit_name=DENOMINATION_ASA_UNIT, + ) + ).asset_id + + return Currency( + id=currency_id, + total=DENOMINATION_ASA_TOTAL, + decimals=DENOMINATION_ASA_DECIMALS, + name=DENOMINATION_ASA_NAME, + unit_name=DENOMINATION_ASA_UNIT, + asa_to_unit=1 / 10**DENOMINATION_ASA_DECIMALS, + ) + + +def _create_dasa_client( + algorand: AlgorandClient, + arranger: SigningAccount, +) -> DasaClient: + factory = algorand.client.get_typed_app_factory( + DasaFactory, + default_sender=arranger.address, + default_signer=arranger.signer, + ) + client, _ = factory.send.create.contract_create( + ContractCreateArgs(arranger=arranger.address) + ) + algorand.account.ensure_funded_from_environment( + account_to_fund=client.app_address, + min_spending_balance=INITIAL_ALGO_FUNDS, + ) + return client + + +def _create_role_account[RoleAccountType: SigningAccount]( + algorand: AlgorandClient, + role_account_class: type[RoleAccountType], + client: DasaClient, +) -> RoleAccountType: + account = _create_funded_account(algorand) + role_account = role_account_class(private_key=account.private_key) + client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=role_account.role_id(), + role_address=role_account.address, + validity=RoleValidity( + role_validity_start=0, + role_validity_end=2**64 - 1, + ), + ) + ) + return role_account + + +def run_showcase_suite( + localnet_config: LocalNetConfig | None = None, +) -> tuple[PamLifecycleTrace, ...]: + algorand = algorand_client_from_localnet( + localnet_config or load_localnet_config(default_host="host.docker.internal") + ) + arranger = _create_funded_account(algorand) + bank = _create_funded_account(algorand) + traces: list[PamLifecycleTrace] = [] + + for build_scenario in SHOWCASE_BUILDERS: + currency = _create_currency(algorand, bank) + d_asa_client = _create_dasa_client(algorand, arranger) + pam_primary_dealer = _create_role_account( + algorand, + DAsaPrimaryDealer, + d_asa_client, + ) + pam_account_manager = _create_role_account( + algorand, + DAsaAccountManager, + d_asa_client, + ) + traces.append( + run_showcase_scenario( + algorand=algorand, + bank=bank, + currency=currency, + d_asa_client=d_asa_client, + pam_primary_dealer=pam_primary_dealer, + pam_account_manager=pam_account_manager, + build_scenario=build_scenario, + ) + ) + + return tuple(traces) + + +def _build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description="Run the D-ASA LocalNet showcase scenarios.", + ) + parser.add_argument("--localnet-host", help="Override the LocalNet host.") + parser.add_argument("--localnet-token", help="Override the LocalNet API token.") + parser.add_argument("--algod-port", type=int, help="Override the algod port.") + parser.add_argument("--kmd-port", type=int, help="Override the kmd port.") + parser.add_argument("--indexer-port", type=int, help="Override the indexer port.") + return parser + + +def _config_from_args(args: argparse.Namespace) -> LocalNetConfig: + base = load_localnet_config(default_host="host.docker.internal") + override_host = args.localnet_host + return LocalNetConfig( + host=override_host or base.host, + token=args.localnet_token or base.token, + algod_port=args.algod_port or base.algod_port, + kmd_port=args.kmd_port or base.kmd_port, + indexer_port=args.indexer_port or base.indexer_port, + algod_host=override_host or base.algod_host, + kmd_host=override_host or base.kmd_host, + indexer_host=override_host or base.indexer_host, + ) + + +def main() -> None: + parser = _build_parser() + args = parser.parse_args() + traces = run_showcase_suite(_config_from_args(args)) + for index, trace in enumerate(traces): + if index: + print() + print(format_lifecycle_trace(trace)) + + +if __name__ == "__main__": + main() diff --git a/src/d_asa/unix_time.py b/src/d_asa/unix_time.py new file mode 100644 index 00000000..2f5832ad --- /dev/null +++ b/src/d_asa/unix_time.py @@ -0,0 +1,17 @@ +from datetime import UTC, datetime + +type UTCTimeStamp = int + + +def timestamp_to_datetime(timestamp: UTCTimeStamp) -> datetime: + """Convert a UTC UNIX timestamp into a timezone-aware datetime.""" + + return datetime.fromtimestamp(timestamp, tz=UTC) + + +def datetime_to_timestamp(value: datetime) -> UTCTimeStamp: + """Convert a datetime into a UTC UNIX timestamp.""" + + if value.tzinfo is None: + value = value.replace(tzinfo=UTC) + return int(value.timestamp()) diff --git a/tests/conftest.py b/tests/conftest.py index 8dbec768..2c78d288 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,31 +9,21 @@ ) from algokit_utils.config import config -from smart_contracts import constants as sc_cst +from d_asa.artifacts.dasa_client import ( + ContractCreateArgs, + DasaClient, + DasaFactory, +) from tests import utils INITIAL_ALGO_FUNDS: Final[AlgoAmount] = AlgoAmount.from_algo(10_000) DENOMINATION_ASA_NAME: Final[str] = "Euro" -DENOMINATION_ASA_UNIT: Final[str] = "EUR" +DENOMINATION_ASA_UNIT: Final[str] = "€" DENOMINATION_ASA_DECIMALS: Final[int] = 2 DENOMINATION_ASA_SCALE: Final[int] = 10**DENOMINATION_ASA_DECIMALS DENOMINATION_ASA_TOTAL: Final[int] = 10_000_000 * DENOMINATION_ASA_SCALE # 10M Euro -PRINCIPAL: Final[int] = 1_000_000 * DENOMINATION_ASA_SCALE # 1M Euro -MINIMUM_DENOMINATION: Final[int] = 1_000 * DENOMINATION_ASA_SCALE # 1k Euro -DAY_COUNT_CONVENTION: Final[list[int]] = [sc_cst.DCC_CONT, sc_cst.DCC_A_A] - -PRIMARY_DISTRIBUTION_DELAY: Final[int] = 1 * sc_cst.DAY_2_SEC -PRIMARY_DISTRIBUTION_DURATION: Final[int] = 15 * sc_cst.DAY_2_SEC -ISSUANCE_DELAY: Final[int] = 1 * sc_cst.DAY_2_SEC -MATURITY_DELAY: Final[int] = 1 * sc_cst.DAY_2_SEC - -APR: Final[int] = 300 # BPS equal to 3% - -TOTAL_UNITS: Final[int] = PRINCIPAL // MINIMUM_DENOMINATION -INITIAL_D_ASA_UNITS: Final[int] = 100 - @pytest.fixture(scope="session") def algorand() -> AlgorandClient: @@ -100,6 +90,21 @@ def currency(algorand: AlgorandClient, bank: SigningAccount) -> utils.Currency: ) -@pytest.fixture(scope="function", params=DAY_COUNT_CONVENTION) -def day_count_convention(request) -> int: - return request.param +@pytest.fixture(scope="function") +def d_asa_client( + algorand: AlgorandClient, + arranger: SigningAccount, +) -> DasaClient: + factory = algorand.client.get_typed_app_factory( + DasaFactory, + default_sender=arranger.address, + default_signer=arranger.signer, + ) + client, _ = factory.send.create.contract_create( + ContractCreateArgs(arranger=arranger.address) + ) + algorand.account.ensure_funded_from_environment( + account_to_fund=client.app_address, + min_spending_balance=INITIAL_ALGO_FUNDS, + ) + return client diff --git a/tests/conftest_helpers.py b/tests/conftest_helpers.py index 2debfbab..877aa918 100644 --- a/tests/conftest_helpers.py +++ b/tests/conftest_helpers.py @@ -1,88 +1,21 @@ -from collections.abc import Callable -from typing import Any, TypeVar +from typing import Any from algokit_utils import ( AlgorandClient, - AssetOptInParams, - AssetTransferParams, - CommonAppCallParams, SigningAccount, ) -from tests import utils +from d_asa.artifacts.dasa_client import ( + RbacAssignRoleArgs, + RoleValidity, +) from tests.conftest import INITIAL_ALGO_FUNDS -# Type variable for client types -ClientType = TypeVar("ClientType") -RoleAccountType = TypeVar("RoleAccountType", bound=SigningAccount) - - -def create_and_fund_client( - algorand: AlgorandClient, - factory_class: Any, - arranger: SigningAccount, - create_method_args: Any, -) -> Any: - """ - Creates a typed app client using a factory and funds it. - - Args: - algorand: AlgorandClient instance - factory_class: Factory class for the client - arranger: Account that will create the app - create_method_args: Arguments to pass to the create method - - Returns: - Created and funded client - """ - factory = algorand.client.get_typed_app_factory( - factory_class, - default_sender=arranger.address, - default_signer=arranger.signer, - ) - client, _ = factory.send.create.asset_create(create_method_args) - algorand.account.ensure_funded_from_environment( - account_to_fund=client.app_address, - min_spending_balance=INITIAL_ALGO_FUNDS, - ) - return client - - -def create_bare_client_and_fund( - algorand: AlgorandClient, - factory_class: Any, - arranger: SigningAccount, -) -> Any: - """ - Creates a bare typed app client using a factory and funds it. - - Args: - algorand: AlgorandClient instance - factory_class: Factory class for the client - arranger: Account that will create the app - - Returns: - Created and funded client - """ - factory = algorand.client.get_typed_app_factory( - factory_class, - default_sender=arranger.address, - default_signer=arranger.signer, - ) - client, _ = factory.send.create.bare() - algorand.account.ensure_funded_from_environment( - account_to_fund=client.app_address, - min_spending_balance=INITIAL_ALGO_FUNDS, - ) - return client - -def create_role_account( +def create_role_account[RoleAccountType: SigningAccount]( algorand: AlgorandClient, role_account_class: type[RoleAccountType], client: Any, - role_config: bytes | None = None, - rbac_assign_role_args_class: Any = None, ) -> RoleAccountType: """ Creates and configures a role account (account_manager, authority, trustee, etc.). @@ -91,8 +24,6 @@ def create_role_account( algorand: AlgorandClient instance role_account_class: The role account class (DAsaAccountManager, DAsaAuthority, etc.) client: The client to assign the role on - role_config: Optional role configuration bytes (defaults to basic config if None) - rbac_assign_role_args_class: The RbacAssignRoleArgs class for the specific client Returns: Configured role account @@ -105,209 +36,14 @@ def create_role_account( min_spending_balance=INITIAL_ALGO_FUNDS, ) - if role_config is None: - role_config = utils.set_role_config() - client.send.rbac_assign_role( - rbac_assign_role_args_class( + RbacAssignRoleArgs( role_id=role_account.role_id(), role_address=role_account.address, - config=role_config, - ) - ) - return role_account - - -def activate_client_with_config_and_funding( - algorand: AlgorandClient, - client: Any, - bank: SigningAccount, - d_asa_config: utils.DAsaConfig, - total_asa_funds: int, - asset_config_args_class: Any, -) -> Any: - """ - Activates a client by configuring it and transferring denomination assets. - - Args: - algorand: AlgorandClient instance - client: The client to activate - bank: Account that will transfer assets - d_asa_config: D-ASA configuration - total_asa_funds: Total amount of assets to transfer - asset_config_args_class: The AssetConfigArgs class for the specific client - - Returns: - The activated client - """ - client.send.asset_config(asset_config_args_class(**d_asa_config.dictify())) - - algorand.send.asset_transfer( - AssetTransferParams( - asset_id=d_asa_config.denomination_asset_id, - amount=total_asa_funds, - receiver=client.app_address, - sender=bank.address, - signer=bank.signer, - ) - ) - - return client - - -def build_account_factory( - algorand: AlgorandClient, - currency: utils.Currency, - account_manager: utils.DAsaAccountManager, - account_open_args_class: Any, -) -> Callable[[Any], utils.DAsaAccount]: - """ - Builds a factory function for creating D-ASA accounts. - - Args: - algorand: AlgorandClient instance - currency: Currency configuration - account_manager: Account manager for opening accounts - account_open_args_class: The AccountOpenArgs class for the specific client - - Returns: - Factory function that creates D-ASA accounts - """ - - def _factory(client: Any) -> utils.DAsaAccount: - account = algorand.account.random() - - algorand.account.ensure_funded_from_environment( - account_to_fund=account.address, - min_spending_balance=INITIAL_ALGO_FUNDS, - ) - - algorand.send.asset_opt_in( - AssetOptInParams( - asset_id=currency.id, - sender=account.address, - signer=account.signer, - ) - ) - - client.send.account_open( - account_open_args_class( - holding_address=account.address, - payment_address=account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - return utils.DAsaAccount( - d_asa_client=client, - holding_address=account.address, - private_key=account.private_key, - ) - - return _factory - - -def build_account_with_units_factory( - account_factory: Callable[[Any], utils.DAsaAccount], - primary_dealer: utils.DAsaPrimaryDealer, - client: Any, - primary_distribution_args_class: Any, - initial_units: int, -) -> Callable[..., utils.DAsaAccount]: - """ - Builds a factory function for creating D-ASA accounts with units. - - Args: - account_factory: Factory for creating basic accounts - primary_dealer: Primary dealer for distributing units - client: The client to use for distribution - primary_distribution_args_class: The PrimaryDistributionArgs class - initial_units: Default number of units to distribute - - Returns: - Factory function that creates accounts with units - """ - - def _factory(*, units: int = initial_units) -> utils.DAsaAccount: - account = account_factory(client) - client.send.primary_distribution( - primary_distribution_args_class( - holding_address=account.holding_address, - units=units, + validity=RoleValidity( + role_validity_start=0, + role_validity_end=2**64 - 1, ), - params=CommonAppCallParams(sender=primary_dealer.address), - ) - return account - - return _factory - - -def set_client_to_primary_phase( - client: Any, - set_secondary_time_events_args_class: Any, - secondary_market_time_events: list[int], -) -> Any: - """ - Sets a client to primary distribution phase. - - Args: - client: The client to update - set_secondary_time_events_args_class: The SetSecondaryTimeEventsArgs class - secondary_market_time_events: List of secondary market time events - - Returns: - The updated client - """ - client.send.set_secondary_time_events( - set_secondary_time_events_args_class( - secondary_market_time_events=secondary_market_time_events ) ) - state = client.state.global_state - utils.time_warp(state.primary_distribution_opening_date) - return client - - -def suspend_client( - client: Any, - authority: utils.DAsaAuthority, - rbac_gov_asset_suspension_args_class: Any, -) -> Any: - """ - Suspends a client. - - Args: - client: The client to suspend - authority: Authority account - rbac_gov_asset_suspension_args_class: The RbacGovAssetSuspensionArgs class - - Returns: - The suspended client - """ - client.send.rbac_gov_asset_suspension( - rbac_gov_asset_suspension_args_class(suspended=True), - params=CommonAppCallParams(sender=authority.address), - ) - return client - - -def set_client_to_default( - client: Any, - trustee: utils.DAsaTrustee, - set_default_status_args_class: Any, -) -> Any: - """ - Sets a client to defaulted status. - - Args: - client: The client to default - trustee: Trustee account - set_default_status_args_class: The SetDefaultStatusArgs class - - Returns: - The defaulted client - """ - client.send.set_default_status( - set_default_status_args_class(defaulted=True), - params=CommonAppCallParams(sender=trustee.address), - ) - return client + return role_account diff --git a/tests/fixed_coupon_bond/conftest.py b/tests/fixed_coupon_bond/conftest.py deleted file mode 100644 index c0d00789..00000000 --- a/tests/fixed_coupon_bond/conftest.py +++ /dev/null @@ -1,321 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import ( - AlgorandClient, - CommonAppCallParams, - SendParams, - SigningAccount, -) - -from smart_contracts import config as sc_cfg -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AccountOpenArgs, - AssetConfigArgs, - AssetCreateArgs, - AssetMetadata, - FixedCouponBondClient, - FixedCouponBondFactory, - PayCouponArgs, - PrimaryDistributionArgs, - RbacAssignRoleArgs, - RbacGovAssetSuspensionArgs, - SetDefaultStatusArgs, - SetSecondaryTimeEventsArgs, -) -from tests import conftest_helpers as helpers -from tests import utils -from tests.conftest import ( - APR, - INITIAL_D_ASA_UNITS, - ISSUANCE_DELAY, - MATURITY_DELAY, - MINIMUM_DENOMINATION, - PRIMARY_DISTRIBUTION_DELAY, - PRIMARY_DISTRIBUTION_DURATION, - PRINCIPAL, -) - -TOTAL_COUPONS: Final[int] = 2 # Max 120 -COUPON_RATE: Final[int] = APR // TOTAL_COUPONS -COUPON_RATE_INCREASE: Final[int] = 5 # BPS equal to 0.05% -COUPON_RATES: Final[list[int]] = [ - COUPON_RATE + i * COUPON_RATE_INCREASE for i in range(TOTAL_COUPONS) -] -INTEREST_RATE = sum(COUPON_RATES) -COUPON_PERIOD: Final[int] = 30 * sc_cst.DAY_2_SEC - -TOTAL_ASA_FUNDS: Final[int] = PRINCIPAL * (sc_cst.BPS + INTEREST_RATE) // sc_cst.BPS - -PROSPECTUS_URL: Final[str] = "Fixed Coupon Bond Prospectus" - - -@pytest.fixture(scope="session") -def asset_metadata() -> AssetMetadata: - return AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url=PROSPECTUS_URL, - ) - - -@pytest.fixture(scope="session") -def coupon_rates() -> utils.CouponRates: - return COUPON_RATES - - -@pytest.fixture(scope="function") -def time_events(algorand: AlgorandClient) -> utils.TimeEvents: - current_ts = utils.get_latest_timestamp(algorand.client.algod) - primary_distribution_opening = current_ts + PRIMARY_DISTRIBUTION_DELAY - primary_distribution_closure = ( - primary_distribution_opening + PRIMARY_DISTRIBUTION_DURATION - ) - issuance_date = primary_distribution_closure + ISSUANCE_DELAY - coupon_dates = [ - issuance_date + i * COUPON_PERIOD for i in range(1, TOTAL_COUPONS + 1) - ] - maturity_date = coupon_dates[-1] + MATURITY_DELAY - return [ - primary_distribution_opening, - primary_distribution_closure, - issuance_date, - *coupon_dates, - maturity_date, - ] - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_cfg( - currency: utils.Currency, - coupon_rates: utils.CouponRates, - time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return utils.DAsaConfig( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=0, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=day_count_convention, - interest_rate=INTEREST_RATE, - coupon_rates=coupon_rates, - time_events=time_events, - time_periods=[], - ) - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_empty( - algorand: AlgorandClient, - arranger: SigningAccount, - asset_metadata: AssetMetadata, -) -> FixedCouponBondClient: - return helpers.create_and_fund_client( - algorand, - FixedCouponBondFactory, - arranger, - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata), - ) - - -@pytest.fixture(scope="function") -def account_manager( - algorand: AlgorandClient, - fixed_coupon_bond_cfg: utils.DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> utils.DAsaAccountManager: - return helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - fixed_coupon_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def trustee( - algorand: AlgorandClient, - fixed_coupon_bond_cfg: utils.DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> utils.DAsaTrustee: - return helpers.create_role_account( - algorand, - utils.DAsaTrustee, - fixed_coupon_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def authority( - algorand: AlgorandClient, - fixed_coupon_bond_cfg: utils.DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> utils.DAsaAuthority: - return helpers.create_role_account( - algorand, - utils.DAsaAuthority, - fixed_coupon_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_active( - algorand: AlgorandClient, - bank: SigningAccount, - fixed_coupon_bond_cfg: utils.DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> FixedCouponBondClient: - return helpers.activate_client_with_config_and_funding( - algorand, - fixed_coupon_bond_client_empty, - bank, - fixed_coupon_bond_cfg, - TOTAL_ASA_FUNDS, - AssetConfigArgs, - ) - - -@pytest.fixture(scope="function") -def primary_dealer( - algorand: AlgorandClient, - fixed_coupon_bond_client_active: FixedCouponBondClient, -) -> utils.DAsaPrimaryDealer: - state = fixed_coupon_bond_client_active.state.global_state - role_config = utils.set_role_config( - state.primary_distribution_opening_date, state.primary_distribution_closure_date - ) - return helpers.create_role_account( - algorand, - utils.DAsaPrimaryDealer, - fixed_coupon_bond_client_active, - role_config, - RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def account_factory( - algorand: AlgorandClient, - bank: SigningAccount, - currency: utils.Currency, - account_manager: utils.DAsaAccountManager, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_factory( - algorand, currency, account_manager, AccountOpenArgs - ) - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_primary( - fixed_coupon_bond_client_active: FixedCouponBondClient, -) -> FixedCouponBondClient: - state = fixed_coupon_bond_client_active.state.global_state - return helpers.set_client_to_primary_phase( - fixed_coupon_bond_client_active, - SetSecondaryTimeEventsArgs, - [state.issuance_date, state.maturity_date], - ) - - -@pytest.fixture(scope="function") -def account_with_units_factory( - account_factory: Callable[..., utils.DAsaAccount], - primary_dealer: utils.DAsaPrimaryDealer, - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_with_units_factory( - account_factory, - primary_dealer, - fixed_coupon_bond_client_primary, - PrimaryDistributionArgs, - INITIAL_D_ASA_UNITS, - ) - - -@pytest.fixture(scope="function") -def account_a( - account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return account_with_units_factory() - - -@pytest.fixture(scope="function") -def account_b( - account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return account_with_units_factory(units=2 * INITIAL_D_ASA_UNITS) - - -@pytest.fixture(scope="function") -def account_with_coupons_factory( - account_with_units_factory: Callable[..., utils.DAsaAccount], - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> Callable[..., utils.DAsaAccount]: - state = fixed_coupon_bond_client_primary.state.global_state - - def _factory( - *, units: int = INITIAL_D_ASA_UNITS, coupons: int = state.total_coupons - ) -> utils.DAsaAccount: - account = account_with_units_factory(units=units) - time_events = fixed_coupon_bond_client_primary.send.get_time_events().abi_return - utils.time_warp(time_events[sc_cfg.FIRST_COUPON_DATE_IDX + coupons - 1]) - for _ in range(1, coupons + 1): - fixed_coupon_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ), - params=CommonAppCallParams(max_fee=utils.max_fee_per_coupon(coupons)), - send_params=SendParams(cover_app_call_inner_transaction_fees=True), - ) - return account - - return _factory - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_ongoing( - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> FixedCouponBondClient: - state = fixed_coupon_bond_client_primary.state.global_state - utils.time_warp(state.issuance_date) - return fixed_coupon_bond_client_primary - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_at_maturity( - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> FixedCouponBondClient: - state = fixed_coupon_bond_client_ongoing.state.global_state - utils.time_warp(state.maturity_date) - return fixed_coupon_bond_client_ongoing - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_suspended( - authority: utils.DAsaAuthority, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> FixedCouponBondClient: - return helpers.suspend_client( - fixed_coupon_bond_client_ongoing, authority, RbacGovAssetSuspensionArgs - ) - - -@pytest.fixture(scope="function") -def fixed_coupon_bond_client_defaulted( - trustee: utils.DAsaTrustee, fixed_coupon_bond_client_ongoing: FixedCouponBondClient -) -> FixedCouponBondClient: - return helpers.set_client_to_default( - fixed_coupon_bond_client_ongoing, trustee, SetDefaultStatusArgs - ) diff --git a/tests/fixed_coupon_bond/test_actus_events.py b/tests/fixed_coupon_bond/test_actus_events.py deleted file mode 100644 index f0ce5cc6..00000000 --- a/tests/fixed_coupon_bond/test_actus_events.py +++ /dev/null @@ -1,288 +0,0 @@ -from datetime import datetime, timezone - -from algokit_utils import ( - AlgorandClient, - AssetOptInParams, - AssetTransferParams, - CommonAppCallParams, - SendParams, - SigningAccount, -) - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetConfigArgs, - AssetCreateArgs, - AssetMetadata, - FixedCouponBondFactory, - PayCouponArgs, - PayPrincipalArgs, - PrimaryDistributionArgs, - RbacAssignRoleArgs, -) -from tests import conftest_helpers as helpers -from tests import utils - -# Configuration -PRINCIPAL = 10_000_00 # 10,000 EUR with 2 decimals -MINIMUM_DENOMINATION = 100_00 # 100 EUR with 2 decimals -TOTAL_COUPONS = 20 -COUPON_PER_YEAR = 4 -NOMINAL_RATE = 200 # 2% in BPS -COUPON_RATE = NOMINAL_RATE // COUPON_PER_YEAR # 0.5% per coupon = 50 BPS -INTEREST_RATE = TOTAL_COUPONS * COUPON_RATE -COUPON_PERIOD = 90 * sc_cst.DAY_2_SEC # 3 months = 90 days -ISSUANCE_DATE = 1893369600 # Mon Dec 31 2029 00:00:00 GMT+0000 - - -def test_actus_events( - algorand: AlgorandClient, - bank: SigningAccount, - currency: utils.Currency, - arranger: SigningAccount, -) -> None: - """ - Test ACTUS events (IP, PR) for a fixed coupon bond. - - All dates are calculated relative to the LocalNet time. - """ - - # Time schedule (all dates relative to current time) - current_ts = utils.get_latest_timestamp(algorand.client.algod) - - # Primary distribution (before issuance date) - primary_opening = current_ts + 1 * sc_cst.DAY_2_SEC - primary_closure = primary_opening + 7 * sc_cst.DAY_2_SEC - - # Generate coupon dates (every 3 months starting from issuance) - coupon_dates = [ - ISSUANCE_DATE + i * COUPON_PERIOD for i in range(1, TOTAL_COUPONS + 1) - ] - - # Maturity: 1 second after the last coupon - maturity_date = coupon_dates[-1] + 1 - - time_events = [ - primary_opening, - primary_closure, - ISSUANCE_DATE, - *coupon_dates, - maturity_date, - ] - - # Create and configure D-ASA - asset_metadata = AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url="Fixed Coupon Bond Test", - ) - - client = helpers.create_and_fund_client( - algorand, - FixedCouponBondFactory, - arranger, - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata), - ) - - # Configure asset (this also opts the contract into the settlement asset) - coupon_rates = [COUPON_RATE] * TOTAL_COUPONS - - client.send.asset_config( - AssetConfigArgs( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=0, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=sc_cst.DCC_CONT, - interest_rate=INTEREST_RATE, - coupon_rates=coupon_rates, - time_events=time_events, - time_periods=[], - ) - ) - - # Fund the D-ASA contract with settlement asset - total_funds = PRINCIPAL * (sc_cst.BPS + INTEREST_RATE) // sc_cst.BPS - - # Transfer denomination assets to the contract - algorand.send.asset_transfer( - AssetTransferParams( - asset_id=currency.id, - amount=total_funds, - receiver=client.app_address, - sender=bank.address, - signer=bank.signer, - ) - ) - - # Create primary dealer - primary_dealer = helpers.create_role_account( - algorand, - utils.DAsaPrimaryDealer, - client, - utils.set_role_config(primary_opening, primary_closure), - RbacAssignRoleArgs, - ) - - # Create an account to receive units - account_manager = helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - client, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - # Time warp to primary distribution - utils.time_warp(primary_opening) - - # Create account - investor = algorand.account.random() - algorand.account.ensure_funded_from_environment( - account_to_fund=investor.address, - min_spending_balance=utils.AlgoAmount.from_algo(10), - ) - - # Opt-in to currency - algorand.send.asset_opt_in( - AssetOptInParams( - asset_id=currency.id, - sender=investor.address, - signer=investor.signer, - ) - ) - - # Open account on D-ASA - from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AccountOpenArgs, - ) - - client.send.account_open( - AccountOpenArgs( - holding_address=investor.address, - payment_address=investor.address, - ), - params=CommonAppCallParams( - sender=account_manager.address, signer=account_manager.signer - ), - ) - - # Create DAsaAccount wrapper - investor_account = utils.DAsaAccount( - holding_address=investor.address, - d_asa_client=client, - private_key=investor.private_key, - ) - - # Primary distribution - this will emit IED event - units_to_distribute = PRINCIPAL // MINIMUM_DENOMINATION # All units - - print("\n" + "=" * 80) - print("ACTUS EVENTS FOR FIXED COUPON BOND") - print("=" * 80) - print("\nBond Configuration:") - print(f" Principal: {PRINCIPAL * currency.asa_to_unit:.2f} EUR") - print(f" Total Coupons: {TOTAL_COUPONS}") - print(f" Interest Rate per Coupon: {COUPON_RATE / 100:.2f}%") - print(f" Total Interest Rate: {INTEREST_RATE / 100:.2f}%") - print(f" Coupon Period: {COUPON_PERIOD // sc_cst.DAY_2_SEC} days") - print( - f" Issuance Date: {datetime.fromtimestamp(ISSUANCE_DATE, tz=timezone.utc).strftime('%Y-%m-%d %H:%M:%S')} UTC" - ) - print( - f" Maturity Date: {datetime.fromtimestamp(maturity_date, tz=timezone.utc).strftime('%Y-%m-%d %H:%M:%S')} UTC" - ) - print("\n" + "=" * 80) - - client.send.primary_distribution( - PrimaryDistributionArgs( - holding_address=investor_account.holding_address, - units=units_to_distribute, - ), - params=CommonAppCallParams( - sender=primary_dealer.address, signer=primary_dealer.signer - ), - ) - - # Time warp to issuance - utils.time_warp(ISSUANCE_DATE) - - # Pay all coupons - print("\n2. IP (Interest Payment) Events:") - total_interest_paid = 0 - for coupon_idx in range(1, TOTAL_COUPONS + 1): - # Time warp to coupon date - coupon_date = coupon_dates[coupon_idx - 1] - utils.time_warp(coupon_date) - - # Pay coupon - this will emit IP event - result_ip = client.send.pay_coupon( - PayCouponArgs( - holding_address=investor_account.holding_address, - payment_info=b"", - ), - params=CommonAppCallParams(max_fee=utils.max_fee_per_coupon(TOTAL_COUPONS)), - send_params=SendParams(cover_app_call_inner_transaction_fees=True), - ) - - # Extract and print IP event - ip_event_bytes = utils.get_event_from_call_result(result_ip) - ip_event = utils.decode_actus_event(ip_event_bytes) - - # Accumulate total interest - total_interest_paid += ip_event["payoff"] - - print(f"\n Coupon {coupon_idx}/{TOTAL_COUPONS}:") - print(f" Type: {ip_event['type_name']}") - print( - f" Time: {datetime.fromtimestamp(ip_event['time'], tz=timezone.utc).strftime('%Y-%m-%d %H:%M:%S')} UTC ({ip_event['time']})" - ) - print( - f" Payoff: {ip_event['payoff'] * currency.asa_to_unit:.2f} {ip_event['currency_unit']}" - ) - print( - f" Nominal Value: {ip_event['nominal_value'] * currency.asa_to_unit:.2f} {ip_event['currency_unit']}" - ) - - # Time warp to maturity - utils.time_warp(maturity_date) - - # Pay principal - this will emit PR event - result_pr = client.send.pay_principal( - PayPrincipalArgs( - holding_address=investor_account.holding_address, - payment_info=b"", - ), - ) - - # Extract and print PR event - pr_event_bytes = utils.get_event_from_call_result(result_pr) - pr_event = utils.decode_actus_event(pr_event_bytes) - - print("\n3. PR (Principal Redemption) Event:") - print(f" Type: {pr_event['type_name']}") - print( - f" Time: {datetime.fromtimestamp(pr_event['time'], tz=timezone.utc).strftime('%Y-%m-%d %H:%M:%S')} UTC ({pr_event['time']})" - ) - print( - f" Payoff: {pr_event['payoff'] * currency.asa_to_unit:.2f} {pr_event['currency_unit']}" - ) - print( - f" Nominal Value: {pr_event['nominal_value'] * currency.asa_to_unit:.2f} {pr_event['currency_unit']}" - ) - - print("\n" + "=" * 80) - print("SUMMARY") - print("=" * 80) - print(f"Total Events: {TOTAL_COUPONS + 1} ({TOTAL_COUPONS} IP + 1 PR)") - print(f"Total Interest Paid: {total_interest_paid * currency.asa_to_unit:.2f} EUR") - print(f"Principal Redeemed: {pr_event['payoff'] * currency.asa_to_unit:.2f} EUR") - print( - f"Total Cashflow: {(total_interest_paid + pr_event['payoff']) * currency.asa_to_unit:.2f} EUR" - ) - print("=" * 80 + "\n") diff --git a/tests/fixed_coupon_bond/test_asset_config.py b/tests/fixed_coupon_bond/test_asset_config.py deleted file mode 100644 index 3356cff9..00000000 --- a/tests/fixed_coupon_bond/test_asset_config.py +++ /dev/null @@ -1,173 +0,0 @@ -from copy import deepcopy - -import pytest -from algokit_utils import LogicError - -from smart_contracts import config as sc_cfg -from smart_contracts import enums -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetConfigArgs, - FixedCouponBondClient, -) -from tests.utils import Currency, DAsaConfig - - -def test_pass_asset_config( - day_count_convention: int, - currency: Currency, - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> None: - fixed_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**fixed_coupon_bond_cfg.dictify()) - ) - - state = fixed_coupon_bond_client_empty.state.global_state - expected_coupon_rates = ( - fixed_coupon_bond_client_empty.send.get_coupon_rates().abi_return - ) - expected_time_events = ( - fixed_coupon_bond_client_empty.send.get_time_events().abi_return - ) - - # Asset Configuration - assert state.denomination_asset_id == currency.id - assert state.settlement_asset_id == state.denomination_asset_id - assert state.unit_value == fixed_coupon_bond_cfg.minimum_denomination - assert state.day_count_convention == fixed_coupon_bond_cfg.day_count_convention - - # Principal and Supply - assert ( - state.total_units - == fixed_coupon_bond_cfg.principal // fixed_coupon_bond_cfg.minimum_denomination - ) - assert not state.circulating_units - assert not state.principal_discount - - # Interest Rate - assert state.interest_rate == fixed_coupon_bond_cfg.interest_rate - - # Coupons - assert expected_coupon_rates == fixed_coupon_bond_cfg.coupon_rates - assert state.total_coupons == fixed_coupon_bond_cfg.total_coupons - assert not state.paid_coupon_units - - # Time Schedule - assert expected_time_events == fixed_coupon_bond_cfg.time_events - assert ( - state.primary_distribution_opening_date - == fixed_coupon_bond_cfg.time_events[ - sc_cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - ] - # == time_schedule_limits.primary_distribution_opening_date - ) - assert ( - state.primary_distribution_closure_date - == fixed_coupon_bond_cfg.time_events[ - sc_cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - ] - # == time_schedule_limits.primary_distribution_closure_date - ) - assert ( - state.issuance_date - == fixed_coupon_bond_cfg.time_events[sc_cfg.ISSUANCE_DATE_IDX] - # == time_schedule_limits.issuance_date - ) - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert ( - state.maturity_date - == fixed_coupon_bond_cfg.time_events[sc_cfg.MATURITY_DATE_IDX] - # == time_schedule_limits.maturity_date - ) - - # Status - assert state.status == enums.STATUS_ACTIVE - assert not state.asset_suspended - - -def test_fail_unauthorized() -> None: - pass # TODO - - -def test_fail_already_configured() -> None: - pass # TODO - - -def test_fail_invalid_denomination() -> None: - pass # TODO - - -def test_fail_invalid_minimum_denomination() -> None: - pass # TODO - - -def test_fail_invalid_interest_rate() -> None: - pass # TODO - - -def test_fail_invalid_time_events_length( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(fixed_coupon_bond_cfg) - wrong_d_asa_cfg.time_events = [*fixed_coupon_bond_cfg.time_events, 0] - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): - fixed_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(fixed_coupon_bond_cfg) - wrong_d_asa_cfg.time_events[0] = 0 - with pytest.raises(LogicError, match=err.INVALID_TIME): - fixed_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_sorting( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(fixed_coupon_bond_cfg) - wrong_d_asa_cfg.time_events[-1] = fixed_coupon_bond_cfg.time_events[-2] - with pytest.raises(LogicError, match=err.INVALID_SORTING): - fixed_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - wrong_d_asa_cfg = deepcopy(fixed_coupon_bond_cfg) - wrong_d_asa_cfg.time_events[0] = fixed_coupon_bond_cfg.time_events[-1] - with pytest.raises(LogicError, match=err.INVALID_SORTING): - fixed_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_duration() -> None: - pass # TODO - - -def test_fail_invalid_settlement_asset() -> None: - pass # TODO - - -def test_fail_invalid_time_periods() -> None: - pass # TODO - - -def test_fail_invalid_time_period_representations() -> None: - pass # TODO - - -def test_fail_invalid_coupon_rates() -> None: - pass # TODO - - -# TODO: Test INVALID_TIME_PERIOD for Actual/Actual convention diff --git a/tests/fixed_coupon_bond/test_asset_create.py b/tests/fixed_coupon_bond/test_asset_create.py deleted file mode 100644 index 00b9266e..00000000 --- a/tests/fixed_coupon_bond/test_asset_create.py +++ /dev/null @@ -1,89 +0,0 @@ -from algokit_utils import AlgorandClient, SigningAccount -from algosdk.abi import ArrayStaticType, ByteType, StringType, TupleType, UintType - -from smart_contracts import constants as sc_cst -from smart_contracts import enums -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetCreateArgs, - AssetMetadata, - FixedCouponBondFactory, -) - -from .conftest import PROSPECTUS_URL - - -def test_pass_asset_create( - algorand: AlgorandClient, - asset_metadata: AssetMetadata, - day_count_convention: int, - arranger: SigningAccount, -) -> None: - factory = algorand.client.get_typed_app_factory( - FixedCouponBondFactory, - default_sender=arranger.address, - default_signer=arranger.signer, - ) - fixed_coupon_bond_client, _ = factory.send.create.asset_create( - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata) - ) - - state = fixed_coupon_bond_client.state.global_state - - # Roles - assert state.arranger == arranger.address - - # Asset Configuration - assert not state.denomination_asset_id - assert not state.settlement_asset_id - assert not state.unit_value - assert not state.day_count_convention - - # Metadata - assert state.metadata == TupleType( - [ - UintType(8), # Contract Type - UintType(8), # Calendar - UintType(8), # Business Day Convention - UintType(8), # End of Month Convention - UintType(8), # Prepayment Effect - UintType(8), # Penalty Type - ArrayStaticType(ByteType(), 32), # Prospectus Hash - StringType(), # Prospectus URL - ] - ).encode( - [ - sc_cst.CT_PAM, - sc_cst.CLDR_NC, - sc_cst.BDC_NOS, - sc_cst.EOMC_SD, - sc_cst.PPEF_N, - sc_cst.PYTP_N, - bytes(32), - PROSPECTUS_URL, - ] - ) - - # Principal and Supply - assert not state.total_units - assert not state.circulating_units - assert not state.principal_discount - - # Coupons - assert not state.total_coupons - assert not state.paid_coupon_units - - # Time Schedule - assert not state.primary_distribution_opening_date - assert not state.primary_distribution_closure_date - assert not state.issuance_date - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert not state.maturity_date - - # Status - assert state.status == enums.STATUS_INACTIVE - assert not state.asset_suspended - - -def test_fail_invalid_state_schema() -> None: - pass # TODO diff --git a/tests/fixed_coupon_bond/test_asset_transfer.py b/tests/fixed_coupon_bond/test_asset_transfer.py deleted file mode 100644 index 093a71b2..00000000 --- a/tests/fixed_coupon_bond/test_asset_transfer.py +++ /dev/null @@ -1,306 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import ( - CommonAppCallParams, - LogicError, - SigningAccount, -) - -from smart_contracts import config as sc_cfg -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetTransferArgs, - FixedCouponBondClient, - GetAccountUnitsCurrentValueArgs, - PayCouponArgs, -) -from tests.utils import DAsaAccount, DAsaConfig, time_warp - - -def test_pass_asset_transfer( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_factory: Callable[..., DAsaAccount], - account_with_coupons_factory: Callable[..., DAsaAccount], -) -> None: - paid_coupons = 1 - account_a = account_with_coupons_factory(units=3, coupons=paid_coupons) - account_b = account_factory(fixed_coupon_bond_client_primary) - - coupon_1_date = fixed_coupon_bond_cfg.time_events[ - sc_cfg.ISSUANCE_DATE_IDX + paid_coupons - ] - coupon_2_date = fixed_coupon_bond_cfg.time_events[ - sc_cfg.ISSUANCE_DATE_IDX + paid_coupons + 1 - ] - coupon_period = coupon_2_date - coupon_1_date - - pre_transfer_units_a = account_a.units - pre_transfer_units_b = account_b.units - pre_transfer_unit_value_a = account_a.unit_value - pre_transfer_unit_value_b = account_b.unit_value - - assert pre_transfer_unit_value_a != pre_transfer_unit_value_b - assert pre_transfer_unit_value_b == 0 - assert account_a.paid_coupons != account_b.paid_coupons - - time_warp(coupon_1_date + coupon_period // 10) - - transfer_1_units = 1 - accrued_interest_1 = ( - fixed_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_1_units, - ) - ).abi_return.accrued_interest - ) - transferred_value_1 = fixed_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_1_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_1_units_a = account_a.units - post_transfer_1_units_b = account_b.units - post_transfer_1_unit_value_a = account_a.unit_value - post_transfer_1_unit_value_b = account_b.unit_value - - assert ( - transferred_value_1 - == fixed_coupon_bond_cfg.minimum_denomination * transfer_1_units - + accrued_interest_1 - ) - assert post_transfer_1_units_a == pre_transfer_units_a - transfer_1_units - assert post_transfer_1_units_b == pre_transfer_units_b + transfer_1_units - assert post_transfer_1_unit_value_a == post_transfer_1_unit_value_b - assert account_a.paid_coupons == account_b.paid_coupons - - time_warp(coupon_1_date + coupon_period // 5) - - transfer_2_units = 1 - accrued_interest_2 = ( - fixed_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_2_units, - ), - ).abi_return.accrued_interest - ) - transferred_value_2 = fixed_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_2_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_2_units_a = account_a.units - post_transfer_2_units_b = account_b.units - post_transfer_2_unit_value_a = account_a.unit_value - post_transfer_2_unit_value_b = account_b.unit_value - - assert ( - transferred_value_2 - == fixed_coupon_bond_cfg.minimum_denomination * transfer_2_units - + accrued_interest_2 - ) - assert post_transfer_2_units_a == post_transfer_1_units_a - transfer_2_units - assert post_transfer_2_units_b == post_transfer_1_units_b + transfer_2_units - assert post_transfer_2_unit_value_a == post_transfer_2_unit_value_b - assert account_a.paid_coupons == account_b.paid_coupons - - time_warp(coupon_1_date + coupon_period // 2) - - transfer_3_units = 1 - accrued_interest_3 = ( - fixed_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_3_units, - ) - ).abi_return.accrued_interest - ) - transferred_value_3 = fixed_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_3_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_3_units_a = account_a.units - post_transfer_3_units_b = account_b.units - post_transfer_3_unit_value_a = account_a.unit_value - - assert ( - transferred_value_3 - == fixed_coupon_bond_cfg.minimum_denomination * transfer_3_units - + accrued_interest_3 - ) - assert post_transfer_3_units_a == 0 - assert ( - post_transfer_3_units_b - == transfer_1_units + transfer_2_units + transfer_3_units - ) - assert post_transfer_3_unit_value_a == 0 - assert account_a.paid_coupons == 0 - - -def test_fail_secondary_market_not_open_yet( - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_a: DAsaAccount, - account_b: DAsaAccount, -) -> None: - with pytest.raises(LogicError, match=err.SECONDARY_MARKET_CLOSED): - fixed_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -# TODO: test_fail_secondary_market_closed - - -def test_fail_unauthorized( - no_role_account: SigningAccount, - account_a: DAsaAccount, - account_b: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - fixed_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_suspended( - account_a: DAsaAccount, - account_b: DAsaAccount, - fixed_coupon_bond_client_suspended: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.SUSPENDED): - fixed_coupon_bond_client_suspended.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_invalid_sender( - no_role_account: SigningAccount, - account_a: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - fixed_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=no_role_account.address, - receiver_holding_address=account_a.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_receiver( - no_role_account: SigningAccount, - account_a: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - fixed_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=no_role_account.address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended_sender() -> None: - pass # TODO - - -def test_fail_suspended_receiver() -> None: - pass # TODO - - -def test_fail_self_transfer() -> None: - pass # TODO - - -def test_fail_null_transfer() -> None: - pass # TODO - - -def test_fail_over_transfer( - account_a: DAsaAccount, - account_b: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.OVER_TRANSFER): - fixed_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=account_a.units + 1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_pending_coupon_payment() -> None: - pass # TODO - - -def test_fail_not_fungible( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account_a = account_with_units_factory() - account_b = account_with_units_factory() - - coupon_1_date = fixed_coupon_bond_cfg.time_events[sc_cfg.ISSUANCE_DATE_IDX + 1] - time_warp(coupon_1_date) - - fixed_coupon_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - with pytest.raises(LogicError, match=err.NON_FUNGIBLE_UNITS): - fixed_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) diff --git a/tests/fixed_coupon_bond/test_get_account_units_current_value.py b/tests/fixed_coupon_bond/test_get_account_units_current_value.py deleted file mode 100644 index 1cde8e07..00000000 --- a/tests/fixed_coupon_bond/test_get_account_units_current_value.py +++ /dev/null @@ -1,96 +0,0 @@ -from collections.abc import Callable -from typing import Final - -from smart_contracts import config as sc_cfg -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, - GetAccountUnitsCurrentValueArgs, - PayCouponArgs, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - -D_ASA_TEST_UNITS: Final[int] = 3 - -# TODO: Add Actual/Actual DDC tests - - -def test_pass_get_account_units_current_value( - currency: Currency, - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - value = fixed_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ), - ).abi_return - print("Initial units' value:") - print(value.__dict__) - assert ( - value.units_value - == D_ASA_TEST_UNITS * fixed_coupon_bond_cfg.minimum_denomination - ) - assert not value.accrued_interest - - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - next_due_date_idx = sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon - next_due_date = fixed_coupon_bond_cfg.time_events[next_due_date_idx] - coupon_period = ( - fixed_coupon_bond_cfg.time_events[next_due_date_idx + 1] - next_due_date - ) - coupon_period_fraction = 10 - time_warp(next_due_date + coupon_period // coupon_period_fraction) - if coupon <= fixed_coupon_bond_cfg.total_coupons: - fixed_coupon_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - units_value = ( - fixed_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ), - ).abi_return - ) - print(f"Units' value after {coupon} coupon due date:") - print(units_value.__dict__) - assert ( - value.units_value - == D_ASA_TEST_UNITS * fixed_coupon_bond_cfg.minimum_denomination - ) - if coupon < fixed_coupon_bond_cfg.total_coupons: - assert ( - value.accrued_interest - == value.units_value - * fixed_coupon_bond_cfg.coupon_rates[coupon] - * coupon_period_fraction - // (sc_cst.BPS * coupon_period) - ) - else: - assert not value.accrued_interest - # TODO: validate day count factor - - -def test_fail_no_primary_distribution() -> None: - pass # TODO - - -def test_fail_invalid_holding_address() -> None: - pass # TODO - - -def test_fail_invalid_units() -> None: - pass # TODO - - -def test_fail_pending_coupon_payment() -> None: - pass # TODO diff --git a/tests/fixed_coupon_bond/test_get_coupon_rates.py b/tests/fixed_coupon_bond/test_get_coupon_rates.py deleted file mode 100644 index 3b23bd15..00000000 --- a/tests/fixed_coupon_bond/test_get_coupon_rates.py +++ /dev/null @@ -1,19 +0,0 @@ -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, -) -from tests.utils import DAsaConfig - - -def test_pass_get_coupon_rates( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_active: FixedCouponBondClient, -) -> None: - coupon_rates = fixed_coupon_bond_client_active.send.get_coupon_rates().abi_return - assert coupon_rates == fixed_coupon_bond_cfg.coupon_rates - - -def test_pass_not_configured( - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> None: - coupon_rates = fixed_coupon_bond_client_empty.send.get_coupon_rates().abi_return - assert not coupon_rates diff --git a/tests/fixed_coupon_bond/test_get_coupon_status.py b/tests/fixed_coupon_bond/test_get_coupon_status.py deleted file mode 100644 index 5d4f9727..00000000 --- a/tests/fixed_coupon_bond/test_get_coupon_status.py +++ /dev/null @@ -1,92 +0,0 @@ -from collections.abc import Callable -from typing import Final - -from smart_contracts import config as sc_cfg -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, - PayCouponArgs, -) -from tests.utils import DAsaAccount, DAsaConfig, time_warp - -D_ASA_TEST_UNITS: Final[int] = 3 - - -def test_pass_get_coupon_status( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - coupon_status = ( - fixed_coupon_bond_client_primary.send.get_coupons_status().abi_return - ) - print("Initial coupon status:") - print(coupon_status.__dict__) - assert coupon_status.total_coupons == fixed_coupon_bond_cfg.total_coupons - assert not coupon_status.due_coupons - assert ( - coupon_status.next_coupon_due_date - == fixed_coupon_bond_cfg.time_events[sc_cfg.FIRST_COUPON_DATE_IDX] - ) - assert coupon_status.all_due_coupons_paid - assert coupon_status.day_count_factor.numerator == 0 - assert coupon_status.day_count_factor.denominator == 0 - - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - next_coupon_date_idx = sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon - next_coupon_due_date = fixed_coupon_bond_cfg.time_events[next_coupon_date_idx] - coupon_period = ( - fixed_coupon_bond_cfg.time_events[next_coupon_date_idx + 1] - - next_coupon_due_date - ) - coupon_period_fraction = 10 - time_warp(next_coupon_due_date + coupon_period // coupon_period_fraction) - - coupon_status = ( - fixed_coupon_bond_client_primary.send.get_coupons_status().abi_return - ) - print(f"Coupon status after {coupon} coupon due date:") - print(coupon_status.__dict__) - assert coupon_status.due_coupons == coupon - if coupon < fixed_coupon_bond_cfg.total_coupons: - assert ( - coupon_status.next_coupon_due_date - == fixed_coupon_bond_cfg.time_events[next_coupon_date_idx + 1] - ) - else: - assert not coupon_status.next_coupon_due_date - assert not coupon_status.all_due_coupons_paid - assert ( - coupon_status.day_count_factor.numerator - == coupon_status.day_count_factor.denominator // coupon_period_fraction - ) - - fixed_coupon_bond_client_primary.send.pay_coupon( - PayCouponArgs(holding_address=account.holding_address, payment_info=b""), - ) - coupon_status = ( - fixed_coupon_bond_client_primary.send.get_coupons_status().abi_return - ) - print(f"Coupon status after {coupon} coupon payment:") - print(coupon_status.__dict__) - assert coupon_status.due_coupons == coupon - if coupon < fixed_coupon_bond_cfg.total_coupons: - assert ( - coupon_status.next_coupon_due_date - == fixed_coupon_bond_cfg.time_events[next_coupon_date_idx + 1] - ) - else: - assert not coupon_status.next_coupon_due_date - assert coupon_status.all_due_coupons_paid - assert ( - coupon_status.day_count_factor.numerator - == coupon_status.day_count_factor.denominator // coupon_period_fraction - ) - - -def test_pass_not_configured( - fixed_coupon_bond_client_empty: FixedCouponBondClient, -) -> None: - coupon_status = fixed_coupon_bond_client_empty.send.get_coupons_status().abi_return - print(coupon_status.__dict__) diff --git a/tests/fixed_coupon_bond/test_get_payment_amount.py b/tests/fixed_coupon_bond/test_get_payment_amount.py deleted file mode 100644 index 110b5909..00000000 --- a/tests/fixed_coupon_bond/test_get_payment_amount.py +++ /dev/null @@ -1,94 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import LogicError, SigningAccount - -from smart_contracts import config as sc_cfg -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, - GetPaymentAmountArgs, - PayCouponArgs, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - -D_ASA_TEST_UNITS: Final[int] = 3 - - -def test_pass_get_coupon_payment_amount( - currency: Currency, - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - time_events = fixed_coupon_bond_client_primary.send.get_time_events().abi_return - - coupon_rates = fixed_coupon_bond_client_primary.send.get_coupon_rates().abi_return - - print(f"Principal: {account.principal * currency.asa_to_unit:.2f} EUR") - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - payment_amount = fixed_coupon_bond_client_primary.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address), - ).abi_return - coupon_rate_bps = coupon_rates[coupon - 1] - print(f"Coupon rate {coupon}:\t\t{coupon_rate_bps / 100:.2f}%") - print( - f"Coupon amount {coupon}:\t{payment_amount.interest * currency.asa_to_unit:.2f} EUR\n" - ) - assert ( - payment_amount.interest == account.principal * coupon_rate_bps // sc_cst.BPS - ) - assert payment_amount.principal == 0 - - # Coupon reaches due date - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - time_warp(coupon_due_date) - fixed_coupon_bond_client_primary.send.pay_coupon( - PayCouponArgs(holding_address=account.holding_address, payment_info=b"") - ) - - -def test_pass_get_principal_payment_amount( - currency: Currency, - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_primary: FixedCouponBondClient, - account_with_coupons_factory: Callable[..., DAsaAccount], -) -> None: - # Account with all coupons paid and principal repayment left - account = account_with_coupons_factory() - - payment_amount = fixed_coupon_bond_client_primary.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address), - ).abi_return - - print(f"Interest rate:\t\t{fixed_coupon_bond_cfg.interest_rate / 100:.2f}%") - print(f"Principal amount:\t{account.principal * currency.asa_to_unit:.2f} EUR") - print(f"Interest amount with principal:\t{0:.2f} EUR\n") - assert payment_amount.principal == account.principal - assert payment_amount.interest == 0 - - -def test_pass_not_configured( - fixed_coupon_bond_client_empty: FixedCouponBondClient, - account_factory: Callable[..., DAsaAccount], -) -> None: - account = account_factory(fixed_coupon_bond_client_empty) - payment_amount = fixed_coupon_bond_client_empty.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address), - ).abi_return - assert payment_amount.interest == 0 - assert payment_amount.principal == 0 - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - fixed_coupon_bond_client_at_maturity.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=no_role_account.address), - ) diff --git a/tests/fixed_coupon_bond/test_pay_coupon.py b/tests/fixed_coupon_bond/test_pay_coupon.py deleted file mode 100644 index 03480f6b..00000000 --- a/tests/fixed_coupon_bond/test_pay_coupon.py +++ /dev/null @@ -1,279 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import LogicError, SigningAccount - -from smart_contracts import config as sc_cfg -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, - GetPaymentAmountArgs, - PayCouponArgs, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - - -def test_pass_pay_coupon( - currency: Currency, - fixed_coupon_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - account_a_units = account_a.units - account_b_units = account_b.units - - time_events = fixed_coupon_bond_client_ongoing.send.get_time_events().abi_return - - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - print(f"Coupon {coupon} of {fixed_coupon_bond_cfg.total_coupons}") - due_coupons = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == coupon - 1 - - # Pre payment sate - pre_payment_account_a_paid_coupons = account_a.paid_coupons - pre_payment_account_b_paid_coupons = account_a.paid_coupons - pre_payment_state = fixed_coupon_bond_client_ongoing.state.global_state - assert pre_payment_account_a_paid_coupons == due_coupons - assert pre_payment_account_b_paid_coupons == due_coupons - assert ( - pre_payment_state.paid_coupon_units - == account_a_units * pre_payment_account_a_paid_coupons - + account_b_units * pre_payment_account_b_paid_coupons - ) - - account_a_coupon_amount = ( - fixed_coupon_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address), - ).abi_return.interest - ) - - account_b_coupon_amount = ( - fixed_coupon_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_b.holding_address), - ).abi_return.interest - ) - - # Coupon reaches due date - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - time_warp(coupon_due_date) - due_coupons = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == coupon - - # Coupon payment - payment_a = fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ), - ).abi_return - assert payment_a.amount == account_a_coupon_amount - print("Account A:") - print( - f"Paid amount: {payment_a.amount * currency.asa_to_unit:.2f} EUR, Due date: {coupon_due_date}, " - f"Payment timestamp: {payment_a.timestamp}" - ) - - payment_b = fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_b.holding_address, - payment_info=b"", - ), - ).abi_return - assert payment_b.amount == account_b_coupon_amount - print("Account B:") - print( - f"Paid amount: {payment_b.amount * currency.asa_to_unit:.2f} EUR, Due date: {coupon_due_date}, " - f"Payment timestamp: {payment_b.timestamp}\n" - ) - - # Post payment state - post_payment_account_a_paid_coupons = account_a.paid_coupons - post_payment_account_b_paid_coupons = account_b.paid_coupons - post_payment_state = fixed_coupon_bond_client_ongoing.state.global_state - assert ( - post_payment_account_a_paid_coupons - == pre_payment_account_a_paid_coupons + 1 - ) - assert ( - post_payment_account_b_paid_coupons - == pre_payment_account_b_paid_coupons + 1 - ) - assert ( - post_payment_state.paid_coupon_units - == account_a_units * post_payment_account_a_paid_coupons - + account_b_units * post_payment_account_b_paid_coupons - ) - # TODO: assert balance updates - - -def test_pass_pay_multiple_coupons( - currency: Currency, - fixed_coupon_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - account_units = account_a.units - - time_events = fixed_coupon_bond_client_at_maturity.send.get_time_events().abi_return - - due_coupons = ( - fixed_coupon_bond_client_at_maturity.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == fixed_coupon_bond_cfg.total_coupons - - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - print(f"Coupon {coupon} of {fixed_coupon_bond_cfg.total_coupons}") - coupon_amount = fixed_coupon_bond_client_at_maturity.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address), - ).abi_return.interest - - # Pre payment sate - pre_payment_account_paid_coupons = account_a.paid_coupons - pre_payment_state = fixed_coupon_bond_client_at_maturity.state.global_state - assert ( - pre_payment_state.paid_coupon_units - == account_units * pre_payment_account_paid_coupons - ) - - # Coupon payment - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - payment = fixed_coupon_bond_client_at_maturity.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ), - ).abi_return - assert payment.amount == coupon_amount - print( - f"Paid amount: {payment.amount * currency.asa_to_unit:.2f} EUR, Due date: {coupon_due_date}, " - f"Payment timestamp: {payment.timestamp}" - ) - - # Post payment state - post_payment_account_paid_coupons = account_a.paid_coupons - post_payment_state = fixed_coupon_bond_client_at_maturity.state.global_state - assert post_payment_account_paid_coupons == pre_payment_account_paid_coupons + 1 - assert ( - post_payment_state.paid_coupon_units - == account_units * post_payment_account_paid_coupons - ) - # TODO: assert balance updates - - -def test_pass_skip_suspended_account() -> None: - pass # TODO - - -def test_pass_skip_not_opted_in_account() -> None: - pass # TODO - - -def test_fail_unauthorized() -> None: - pass # TODO - - -def test_fail_unauthorized_status() -> None: - pass # TODO - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended() -> None: - pass # TODO - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - fixed_coupon_bond_client_at_maturity.send.pay_coupon( - PayCouponArgs( - holding_address=no_role_account.address, - payment_info=b"", - ) - ) - - -def test_fail_no_units( - account_factory: Callable[..., DAsaAccount], - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - account = account_factory(fixed_coupon_bond_client_primary) - - with pytest.raises(LogicError, match=err.NO_UNITS): - fixed_coupon_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_no_due_coupon( - fixed_coupon_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - time_events = fixed_coupon_bond_client_ongoing.send.get_time_events().abi_return - - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - with pytest.raises(LogicError, match=err.NO_DUE_COUPON): - fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - time_warp(coupon_due_date) - fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_pending_coupon_payment( - fixed_coupon_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - for coupon in range(fixed_coupon_bond_cfg.total_coupons - 1): - if coupon % 2: - first_payee = account_a - second_payee = account_b - else: - first_payee = account_b - second_payee = account_a - - fixed_coupon_bond_client_at_maturity.send.pay_coupon( - PayCouponArgs( - holding_address=first_payee.holding_address, - payment_info=b"", - ) - ) - - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): - fixed_coupon_bond_client_at_maturity.send.pay_coupon( - PayCouponArgs( - holding_address=first_payee.holding_address, - payment_info=b"", - ) - ) - - fixed_coupon_bond_client_at_maturity.send.pay_coupon( - PayCouponArgs( - holding_address=second_payee.holding_address, - payment_info=b"", - ) - ) diff --git a/tests/fixed_coupon_bond/test_pay_principal.py b/tests/fixed_coupon_bond/test_pay_principal.py deleted file mode 100644 index 463edc8e..00000000 --- a/tests/fixed_coupon_bond/test_pay_principal.py +++ /dev/null @@ -1,162 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AccountGetInfoArgs, - FixedCouponBondClient, - PayPrincipalArgs, -) -from tests.utils import ( - Currency, - DAsaAccount, - DAsaConfig, - get_latest_timestamp, - time_warp, -) - - -def test_pass_pay_principal( - currency: Currency, - account_with_coupons_factory: Callable[..., DAsaAccount], - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - account_all_coupons = account_with_coupons_factory( - units=fixed_coupon_bond_client_primary.state.global_state.total_units - ) - # Pre payment state - pre_payment_state = fixed_coupon_bond_client_primary.state.global_state - time_warp(pre_payment_state.maturity_date) - - pre_payment_account_info = fixed_coupon_bond_client_primary.send.account_get_info( - AccountGetInfoArgs(holding_address=account_all_coupons.holding_address), - ).abi_return - - pre_payment_account_principal = account_all_coupons.principal - - maturity_date = pre_payment_state.maturity_date - pre_payment_account_units = pre_payment_account_info.units - pre_payment_circulating_units = pre_payment_state.circulating_units - assert ( - get_latest_timestamp(fixed_coupon_bond_client_primary.algorand.client.algod) - >= maturity_date - ) - - # Principal payment - payment = fixed_coupon_bond_client_primary.send.pay_principal( - PayPrincipalArgs( - holding_address=account_all_coupons.holding_address, - payment_info=b"", - ), - ).abi_return - - assert payment.amount == pre_payment_account_principal - print( - f"Paid amount: {payment.amount * currency.asa_to_unit:.2f} EUR, Maturity date: {maturity_date}, " - f"Payment timestamp: {payment.timestamp}" - ) - - # Post payment state - post_payment_state = fixed_coupon_bond_client_primary.state.global_state - - post_payment_account_info = fixed_coupon_bond_client_primary.send.account_get_info( - AccountGetInfoArgs(holding_address=account_all_coupons.holding_address), - ).abi_return - - assert ( - post_payment_state.circulating_units - == pre_payment_circulating_units - pre_payment_account_units - ) - assert post_payment_account_info.units == 0 - # TODO: assert balance updates - # TODO: assert STATUS_ENDED - - -def test_pass_skip_suspended_account() -> None: - pass # TODO - - -def test_pass_skip_not_opted_in_account() -> None: - pass # TODO - - -def test_fail_unauthorized() -> None: - pass # TODO - - -def test_fail_unauthorized_status() -> None: - pass # TODO - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended() -> None: - pass # TODO - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - fixed_coupon_bond_client_at_maturity.send.pay_principal( - PayPrincipalArgs( - holding_address=no_role_account.address, - payment_info=b"", - ) - ) - - -def test_fail_no_units( - account_factory: Callable[..., DAsaAccount], - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - account = account_factory(fixed_coupon_bond_client_primary) - - with pytest.raises(LogicError, match=err.NO_UNITS): - fixed_coupon_bond_client_primary.send.pay_principal( - PayPrincipalArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_not_mature( - account_with_coupons_factory: Callable[..., DAsaAccount], - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - account_all_coupons = account_with_coupons_factory() - with pytest.raises(LogicError, match=err.NOT_MATURE): - fixed_coupon_bond_client_primary.send.pay_principal( - PayPrincipalArgs( - holding_address=account_all_coupons.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_pending_coupon_payment( - fixed_coupon_bond_cfg: DAsaConfig, - account_with_coupons_factory: Callable[..., DAsaAccount], - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - account = account_with_coupons_factory( - coupons=fixed_coupon_bond_cfg.total_coupons - 1 - ) - state = fixed_coupon_bond_client_primary.state.global_state - time_warp(state.maturity_date) - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): - fixed_coupon_bond_client_primary.send.pay_principal( - PayPrincipalArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - -# TODO: Test the scenario where maturity is reached, an account has a coupon pending but that account is closed diff --git a/tests/fixed_coupon_bond/test_sub_accrued_interest_amount.py b/tests/fixed_coupon_bond/test_sub_accrued_interest_amount.py deleted file mode 100644 index 8e519ca6..00000000 --- a/tests/fixed_coupon_bond/test_sub_accrued_interest_amount.py +++ /dev/null @@ -1,104 +0,0 @@ -from typing import Final - -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, - GetAccountUnitsCurrentValueArgs, - GetPaymentAmountArgs, - PayCouponArgs, -) -from tests.utils import Currency, DAsaAccount, get_latest_timestamp, time_warp - -TEST_UNITS: Final[int] = 3 - -# TODO: Add Actual/Actual DDC tests - - -def test_from_issuance( - account_a: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - current_date = get_latest_timestamp( - fixed_coupon_bond_client_ongoing.algorand.client.algod - ) - next_coupon_due_date = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - state = fixed_coupon_bond_client_ongoing.state.global_state - assert current_date == state.issuance_date - - # Coupon accrued half period - half_coupon_period = (next_coupon_due_date - current_date) // 2 - time_warp(current_date + half_coupon_period) - due_coupons = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == 0 - - accrued_interest = ( - fixed_coupon_bond_client_ongoing.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ) - ).abi_return.accrued_interest - ) - - coupon_amount = fixed_coupon_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address) - ).abi_return.interest - assert accrued_interest == coupon_amount // 2 - - -def test_from_latest_coupon_due_date( - currency: Currency, - account_a: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - first_coupon_due_date = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - time_warp(first_coupon_due_date) - current_date = get_latest_timestamp( - fixed_coupon_bond_client_ongoing.algorand.client.algod - ) - assert current_date == first_coupon_due_date - fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - next_coupon_due_date = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - - # Coupon accrued a tenth of period - tenth_coupon_period = (next_coupon_due_date - current_date) // 10 - time_warp(current_date + tenth_coupon_period) - due_coupons = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == 1 - - accrued_interest = ( - fixed_coupon_bond_client_ongoing.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ), - ).abi_return.accrued_interest - ) - - coupon_amount = fixed_coupon_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address), - ).abi_return.interest - assert accrued_interest == coupon_amount // 10 - - -def test_on_coupon_due_date() -> None: - pass # TODO: Must be tested directly at subroutine level, not through get_payment_amount - - -def test_fail_pending_coupon_payment() -> None: - pass # TODO diff --git a/tests/fixed_coupon_bond/test_sub_all_due_coupons_paid.py b/tests/fixed_coupon_bond/test_sub_all_due_coupons_paid.py deleted file mode 100644 index 2a70630a..00000000 --- a/tests/fixed_coupon_bond/test_sub_all_due_coupons_paid.py +++ /dev/null @@ -1,56 +0,0 @@ -from algokit_utils import AlgorandClient - -from smart_contracts import config as sc_cfg -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, - PayCouponArgs, -) -from tests.utils import DAsaAccount, DAsaConfig, time_warp - - -def test_all_due_coupons_paid( - algorand: AlgorandClient, - fixed_coupon_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - time_events = fixed_coupon_bond_client_ongoing.send.get_time_events().abi_return - - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - all_paid = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert all_paid - - # Coupon reaches due date - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - time_warp(coupon_due_date) - all_paid = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert not all_paid - - # Coupon payment - fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - all_paid = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert not all_paid - - fixed_coupon_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_b.holding_address, - payment_info=b"", - ), - ) - all_paid = ( - fixed_coupon_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert all_paid diff --git a/tests/fixed_coupon_bond/test_sub_count_due_coupons.py b/tests/fixed_coupon_bond/test_sub_count_due_coupons.py deleted file mode 100644 index 706ad194..00000000 --- a/tests/fixed_coupon_bond/test_sub_count_due_coupons.py +++ /dev/null @@ -1,45 +0,0 @@ -from algokit_utils import CommonAppCallParams, SendParams, SigningAccount - -from smart_contracts import config as sc_cfg -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, -) -from tests.utils import DAsaConfig, max_fee_per_coupon, time_warp - - -def test_count_due_coupons_before_issuance( - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - due_coupons = ( - fixed_coupon_bond_client_primary.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == 0 - - -def test_count_due_coupons_ongoing( - arranger: SigningAccount, - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - time_events = fixed_coupon_bond_client_ongoing.send.get_time_events().abi_return - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - time_warp(coupon_due_date) - due_coupons = fixed_coupon_bond_client_ongoing.send.get_coupons_status( - params=CommonAppCallParams( - max_fee=max_fee_per_coupon(fixed_coupon_bond_cfg.total_coupons) - ), - send_params=SendParams(cover_app_call_inner_transaction_fees=True), - ).abi_return.due_coupons - print("Due coupons: ", due_coupons) - assert due_coupons == coupon - - -def test_count_due_coupons_at_maturity( - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - due_coupons = ( - fixed_coupon_bond_client_at_maturity.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == fixed_coupon_bond_cfg.total_coupons diff --git a/tests/fixed_coupon_bond/test_sub_latest_coupon_date.py b/tests/fixed_coupon_bond/test_sub_latest_coupon_date.py deleted file mode 100644 index 46409041..00000000 --- a/tests/fixed_coupon_bond/test_sub_latest_coupon_date.py +++ /dev/null @@ -1 +0,0 @@ -# TODO diff --git a/tests/fixed_coupon_bond/test_sub_next_coupon_due_date.py b/tests/fixed_coupon_bond/test_sub_next_coupon_due_date.py deleted file mode 100644 index b42ac9fb..00000000 --- a/tests/fixed_coupon_bond/test_sub_next_coupon_due_date.py +++ /dev/null @@ -1,53 +0,0 @@ -from algokit_utils import ( - AlgorandClient, - CommonAppCallParams, - SendParams, - SigningAccount, -) - -from smart_contracts import config as sc_cfg -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, -) -from tests.utils import DAsaConfig, max_fee_per_coupon, time_warp - -TIME_LEFT_TO_DUE_DATE = 100 # Seconds - - -def test_next_coupon_due_date_before_issuance( - fixed_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - time_events = fixed_coupon_bond_client_primary.send.get_time_events().abi_return - next_coupon_due_date = ( - fixed_coupon_bond_client_primary.send.get_coupons_status().abi_return.next_coupon_due_date - ) - assert next_coupon_due_date == time_events[sc_cfg.FIRST_COUPON_DATE_IDX] - - -def test_next_coupon_due_date_ongoing( - algorand: AlgorandClient, - arranger: SigningAccount, - fixed_coupon_bond_cfg: DAsaConfig, - fixed_coupon_bond_client_ongoing: FixedCouponBondClient, -) -> None: - time_events = fixed_coupon_bond_client_ongoing.send.get_time_events().abi_return - for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - coupon_due_date = time_events[sc_cfg.FIRST_COUPON_DATE_IDX - 1 + coupon] - time_warp(coupon_due_date - TIME_LEFT_TO_DUE_DATE) - next_coupon_due_date = fixed_coupon_bond_client_ongoing.send.get_coupons_status( - params=CommonAppCallParams( - max_fee=max_fee_per_coupon(fixed_coupon_bond_cfg.total_coupons) - ), - send_params=SendParams(cover_app_call_inner_transaction_fees=True), - ).abi_return.next_coupon_due_date - print("Next coupon due date: ", next_coupon_due_date) - assert next_coupon_due_date == coupon_due_date - - -def test_next_coupon_due_date_at_maturity( - fixed_coupon_bond_client_at_maturity: FixedCouponBondClient, -) -> None: - next_coupon_due_date = ( - fixed_coupon_bond_client_at_maturity.send.get_coupons_status().abi_return.next_coupon_due_date - ) - assert next_coupon_due_date == 0 diff --git a/tests/mock_module_accounting/__init__.py b/tests/mock_module_accounting/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/mock_module_accounting/conftest.py b/tests/mock_module_accounting/conftest.py deleted file mode 100644 index c6c1eceb..00000000 --- a/tests/mock_module_accounting/conftest.py +++ /dev/null @@ -1,81 +0,0 @@ -import pytest -from algokit_utils import ( - AlgorandClient, - SigningAccount, -) - -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - MockAccountingModuleClient, - MockAccountingModuleFactory, - RbacAssignRoleArgs, -) -from tests import conftest_helpers as helpers -from tests import utils -from tests.shared import conftest as shared_fixtures - -contract_case = shared_fixtures.contract_case -shared_asset_metadata = shared_fixtures.shared_asset_metadata -shared_time_events = shared_fixtures.shared_time_events -shared_cfg = shared_fixtures.shared_cfg -shared_client_empty = shared_fixtures.shared_client_empty -shared_account_manager = shared_fixtures.shared_account_manager -shared_authority = shared_fixtures.shared_authority -shared_trustee = shared_fixtures.shared_trustee -shared_interest_oracle = shared_fixtures.shared_interest_oracle -shared_client_active = shared_fixtures.shared_client_active -shared_primary_dealer = shared_fixtures.shared_primary_dealer -shared_account_factory = shared_fixtures.shared_account_factory -shared_client_primary = shared_fixtures.shared_client_primary -shared_account_with_units_factory = shared_fixtures.shared_account_with_units_factory -shared_account_a = shared_fixtures.shared_account_a -shared_account_b = shared_fixtures.shared_account_b -shared_client_ongoing = shared_fixtures.shared_client_ongoing - - -@pytest.fixture(scope="function") -def accounting_client( - algorand: AlgorandClient, - arranger: SigningAccount, -) -> MockAccountingModuleClient: - return helpers.create_bare_client_and_fund( - algorand, MockAccountingModuleFactory, arranger - ) - - -@pytest.fixture(scope="function") -def account_manager( - algorand: AlgorandClient, - accounting_client: MockAccountingModuleClient, -) -> utils.DAsaAccountManager: - return helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - accounting_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def authority( - algorand: AlgorandClient, - accounting_client: MockAccountingModuleClient, -) -> utils.DAsaAuthority: - return helpers.create_role_account( - algorand, - utils.DAsaAuthority, - accounting_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def trustee( - algorand: AlgorandClient, - accounting_client: MockAccountingModuleClient, -) -> utils.DAsaTrustee: - return helpers.create_role_account( - algorand, - utils.DAsaTrustee, - accounting_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) diff --git a/tests/mock_module_accounting/test_account_close.py b/tests/mock_module_accounting/test_account_close.py deleted file mode 100644 index f0ab1945..00000000 --- a/tests/mock_module_accounting/test_account_close.py +++ /dev/null @@ -1,141 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - AccountCloseArgs, - AccountOpenArgs, - MockAccountingModuleClient, -) -from tests.utils import DAsaAccountManager - - -def test_pass_close_account( - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - - close_result = accounting_client.send.account_close( - AccountCloseArgs(holding_address=no_role_account.address), - params=CommonAppCallParams(sender=account_manager.address), - ).abi_return - assert close_result[0] == 0 - - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - accounting_client.send.account_close( - AccountCloseArgs(holding_address=no_role_account.address), - params=CommonAppCallParams(sender=account_manager.address), - ) - - -def test_fail_unauthorized_caller( - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - accounting_client.send.account_close( - AccountCloseArgs(holding_address=no_role_account.address), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_unauthorized_status( - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - accounting_client.send.account_close( - AccountCloseArgs(holding_address=no_role_account.address), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - accounting_client.send.account_close( - AccountCloseArgs(holding_address=no_role_account.address), - params=CommonAppCallParams(sender=account_manager.address), - ) - - -def test_concrete_pass_close_account( - shared_account_manager, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - close_result = shared_client_active.send.account_close( - (account.holding_address,), - params=CommonAppCallParams(sender=shared_account_manager.address), - ).abi_return - assert close_result[0] == 0 - - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_active.send.account_close( - (account.holding_address,), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) - - -def test_concrete_fail_unauthorized_caller( - no_role_account: SigningAccount, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.account_close( - (account.holding_address,), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_fail_defaulted_status( - shared_trustee, - shared_account_manager, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - shared_client_active.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_active.send.account_close( - (account.holding_address,), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) - - -def test_concrete_fail_invalid_holding_address( - no_role_account: SigningAccount, - shared_account_manager, - shared_client_active, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_active.send.account_close( - (no_role_account.address,), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) diff --git a/tests/mock_module_accounting/test_account_get_info.py b/tests/mock_module_accounting/test_account_get_info.py deleted file mode 100644 index 82246218..00000000 --- a/tests/mock_module_accounting/test_account_get_info.py +++ /dev/null @@ -1,66 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - AccountGetInfoArgs, - AccountOpenArgs, - MockAccountingModuleClient, -) -from tests.utils import DAsaAccountManager - - -def test_pass_account_get_info( - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - - account_info = accounting_client.send.account_get_info( - AccountGetInfoArgs(holding_address=no_role_account.address) - ).abi_return - assert account_info.payment_address == no_role_account.address - assert account_info.units == 0 - assert account_info.unit_value == 0 - assert account_info.paid_coupons == 0 - assert not account_info.suspended - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - accounting_client.send.account_get_info( - AccountGetInfoArgs(holding_address=no_role_account.address) - ) - - -def test_concrete_pass_account_get_info( - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - account_info = shared_client_active.send.account_get_info( - (account.holding_address,) - ).abi_return - assert account_info.payment_address == account.holding_address - assert account_info.units == 0 - assert account_info.unit_value == 0 - assert account_info.paid_coupons == 0 - assert not account_info.suspended - - -def test_concrete_fail_invalid_holding_address( - no_role_account: SigningAccount, - shared_client_active, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_active.send.account_get_info((no_role_account.address,)) diff --git a/tests/mock_module_accounting/test_account_gov_suspension.py b/tests/mock_module_accounting/test_account_gov_suspension.py deleted file mode 100644 index 32ede387..00000000 --- a/tests/mock_module_accounting/test_account_gov_suspension.py +++ /dev/null @@ -1,118 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - AccountGetInfoArgs, - AccountGovSuspensionArgs, - AccountOpenArgs, - MockAccountingModuleClient, -) -from tests.utils import DAsaAccountManager, DAsaAuthority - - -def test_pass_account_gov_suspension( - authority: DAsaAuthority, - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - - accounting_client.send.account_gov_suspension( - AccountGovSuspensionArgs( - holding_address=no_role_account.address, - suspended=True, - ), - params=CommonAppCallParams(sender=authority.address), - ) - - account_info = accounting_client.send.account_get_info( - AccountGetInfoArgs(holding_address=no_role_account.address) - ).abi_return - assert account_info.suspended - - -def test_fail_unauthorized( - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - accounting_client.send.account_gov_suspension( - AccountGovSuspensionArgs( - holding_address=no_role_account.address, - suspended=True, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_holding_address( - authority: DAsaAuthority, - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - accounting_client.send.account_gov_suspension( - AccountGovSuspensionArgs( - holding_address=no_role_account.address, - suspended=True, - ), - params=CommonAppCallParams(sender=authority.address), - ) - - -def test_concrete_pass_account_gov_suspension( - shared_authority, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - shared_client_active.send.account_gov_suspension( - (account.holding_address, True), - params=CommonAppCallParams(sender=shared_authority.address), - ) - account_info = shared_client_active.send.account_get_info( - (account.holding_address,) - ).abi_return - assert account_info.suspended - - shared_client_active.send.account_gov_suspension( - (account.holding_address, False), - params=CommonAppCallParams(sender=shared_authority.address), - ) - account_info = shared_client_active.send.account_get_info( - (account.holding_address,) - ).abi_return - assert not account_info.suspended - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.account_gov_suspension( - (account.holding_address, True), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_fail_invalid_holding_address( - no_role_account: SigningAccount, - shared_authority, - shared_client_active, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_active.send.account_gov_suspension( - (no_role_account.address, True), - params=CommonAppCallParams(sender=shared_authority.address), - ) diff --git a/tests/mock_module_accounting/test_account_open.py b/tests/mock_module_accounting/test_account_open.py deleted file mode 100644 index 252847bd..00000000 --- a/tests/mock_module_accounting/test_account_open.py +++ /dev/null @@ -1,228 +0,0 @@ -from typing import Any, Final - -import pytest -from algokit_utils import ( - AlgorandClient, - CommonAppCallParams, - LogicError, - SigningAccount, -) - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - AccountCloseArgs, - AccountGetInfoArgs, - AccountOpenArgs, - MockAccountingModuleClient, - RbacGovAssetSuspensionArgs, -) -from tests.utils import DAsaAccountManager, DAsaAuthority - -ACCOUNT_TEST_UNITS: Final[int] = 7 - - -def test_pass_account_open( - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, - account_manager: DAsaAccountManager, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams( - sender=account_manager.address, - ), - ) - - d_asa_account_info = accounting_client.send.account_get_info( - AccountGetInfoArgs( - holding_address=no_role_account.address, - ), - params=CommonAppCallParams( - sender=account_manager.address, - ), - ).abi_return - - assert d_asa_account_info.payment_address == no_role_account.address - assert d_asa_account_info.units == 0 - assert d_asa_account_info.unit_value == 0 - assert d_asa_account_info.paid_coupons == 0 - assert not d_asa_account_info.suspended - - -def test_fail_unauthorized_caller( - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams( - sender=no_role_account.address, - ), - ) - - -def test_fail_unauthorized_status( - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - accounting_client.send.account_close( - AccountCloseArgs(holding_address=no_role_account.address), - params=CommonAppCallParams(sender=account_manager.address), - ) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - - -def test_fail_suspended( - arranger: SigningAccount, - no_role_account: SigningAccount, - authority: DAsaAuthority, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.rbac_gov_asset_suspension( - RbacGovAssetSuspensionArgs(suspended=True), - params=CommonAppCallParams( - sender=authority.address, - ), - ) - with pytest.raises(LogicError, match=err.SUSPENDED): - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams( - sender=account_manager.address, - ), - ) - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams( - sender=account_manager.address, - ), - ) - - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams( - sender=account_manager.address, - ), - ) - - -def test_concrete_pass_account_open( - algorand: AlgorandClient, - shared_account_manager, - shared_client_active: Any, -) -> None: - account = algorand.account.random() - shared_client_active.send.account_open( - (account.address, account.address), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) - account_info = shared_client_active.send.account_get_info( - (account.address,) - ).abi_return - assert account_info.payment_address == account.address - assert account_info.units == 0 - assert account_info.unit_value == 0 - assert account_info.paid_coupons == 0 - assert not account_info.suspended - - -def test_concrete_fail_unauthorized( - algorand: AlgorandClient, - no_role_account: SigningAccount, - shared_client_active: Any, -) -> None: - account = algorand.account.random() - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.account_open( - (account.address, account.address), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_fail_defaulted_status( - algorand: AlgorandClient, - shared_account_manager, - shared_trustee, - shared_client_active: Any, -) -> None: - account = algorand.account.random() - shared_client_active.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_active.send.account_open( - (account.address, account.address), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) - - -def test_concrete_fail_suspended( - algorand: AlgorandClient, - shared_authority, - shared_account_manager, - shared_client_active: Any, -) -> None: - account = algorand.account.random() - shared_client_active.send.rbac_gov_asset_suspension( - (True,), - params=CommonAppCallParams(sender=shared_authority.address), - ) - with pytest.raises(LogicError, match=err.SUSPENDED): - shared_client_active.send.account_open( - (account.address, account.address), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) - - -def test_concrete_fail_invalid_holding_address( - shared_account_manager, - shared_account_factory, - shared_client_active: Any, -) -> None: - account = shared_account_factory(shared_client_active) - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_active.send.account_open( - (account.holding_address, account.holding_address), - params=CommonAppCallParams(sender=shared_account_manager.address), - ) diff --git a/tests/mock_module_accounting/test_account_update_payment_address.py b/tests/mock_module_accounting/test_account_update_payment_address.py deleted file mode 100644 index 4b09fdab..00000000 --- a/tests/mock_module_accounting/test_account_update_payment_address.py +++ /dev/null @@ -1,115 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - AccountOpenArgs, - AccountUpdatePaymentAddressArgs, - MockAccountingModuleClient, -) -from tests.utils import DAsaAccountManager - - -def test_pass_account_update_payment_address( - arranger: SigningAccount, - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - - accounting_client.send.account_update_payment_address( - AccountUpdatePaymentAddressArgs( - holding_address=no_role_account.address, - payment_address=arranger.address, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - account_info = accounting_client.send.account_get_info( - (no_role_account.address,) - ).abi_return - assert account_info.payment_address == arranger.address - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - accounting_client: MockAccountingModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - accounting_client.send.account_update_payment_address( - AccountUpdatePaymentAddressArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_unauthorized( - arranger: SigningAccount, - no_role_account: SigningAccount, - account_manager: DAsaAccountManager, - accounting_client: MockAccountingModuleClient, -) -> None: - accounting_client.send.account_open( - AccountOpenArgs( - holding_address=no_role_account.address, - payment_address=no_role_account.address, - ), - params=CommonAppCallParams(sender=account_manager.address), - ) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - accounting_client.send.account_update_payment_address( - AccountUpdatePaymentAddressArgs( - holding_address=no_role_account.address, - payment_address=arranger.address, - ), - params=CommonAppCallParams(sender=arranger.address), - ) - - -def test_concrete_pass_account_update_payment_address( - no_role_account: SigningAccount, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - shared_client_active.send.account_update_payment_address( - (account.holding_address, no_role_account.address), - params=CommonAppCallParams(sender=account.address), - ) - account_info = shared_client_active.send.account_get_info( - (account.holding_address,) - ).abi_return - assert account_info.payment_address == no_role_account.address - - -def test_concrete_fail_invalid_holding_address( - no_role_account: SigningAccount, - shared_client_active, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_active.send.account_update_payment_address( - (no_role_account.address, no_role_account.address), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_account_factory, - shared_client_active, -) -> None: - account = shared_account_factory(shared_client_active) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.account_update_payment_address( - (account.holding_address, no_role_account.address), - params=CommonAppCallParams(sender=no_role_account.address), - ) diff --git a/tests/mock_module_rbac/__init__.py b/tests/mock_module_rbac/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/mock_module_rbac/conftest.py b/tests/mock_module_rbac/conftest.py index 75070510..ed32e766 100644 --- a/tests/mock_module_rbac/conftest.py +++ b/tests/mock_module_rbac/conftest.py @@ -1,35 +1,13 @@ import pytest -from algokit_utils import ( - AlgorandClient, - SigningAccount, -) +from algokit_utils import AlgorandClient, SigningAccount from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( MockRbacModuleClient, MockRbacModuleFactory, - RbacAssignRoleArgs, ) from tests import conftest_helpers as helpers from tests import utils -from tests.shared import conftest as shared_fixtures - -contract_case = shared_fixtures.contract_case -shared_asset_metadata = shared_fixtures.shared_asset_metadata -shared_time_events = shared_fixtures.shared_time_events -shared_cfg = shared_fixtures.shared_cfg -shared_client_empty = shared_fixtures.shared_client_empty -shared_account_manager = shared_fixtures.shared_account_manager -shared_authority = shared_fixtures.shared_authority -shared_trustee = shared_fixtures.shared_trustee -shared_interest_oracle = shared_fixtures.shared_interest_oracle -shared_client_active = shared_fixtures.shared_client_active -shared_primary_dealer = shared_fixtures.shared_primary_dealer -shared_account_factory = shared_fixtures.shared_account_factory -shared_client_primary = shared_fixtures.shared_client_primary -shared_account_with_units_factory = shared_fixtures.shared_account_with_units_factory -shared_account_a = shared_fixtures.shared_account_a -shared_account_b = shared_fixtures.shared_account_b -shared_client_ongoing = shared_fixtures.shared_client_ongoing +from tests.conftest import INITIAL_ALGO_FUNDS @pytest.fixture(scope="function") @@ -37,9 +15,17 @@ def rbac_client( algorand: AlgorandClient, arranger: SigningAccount, ) -> MockRbacModuleClient: - return helpers.create_bare_client_and_fund( - algorand, MockRbacModuleFactory, arranger + factory = algorand.client.get_typed_app_factory( + MockRbacModuleFactory, + default_sender=arranger.address, + default_signer=arranger.signer, + ) + client, _ = factory.send.create.bare() + algorand.account.ensure_funded_from_environment( + account_to_fund=client.app_address, + min_spending_balance=INITIAL_ALGO_FUNDS, ) + return client @pytest.fixture(scope="function") @@ -51,7 +37,6 @@ def authority( algorand, utils.DAsaAuthority, rbac_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, ) @@ -64,7 +49,6 @@ def trustee( algorand, utils.DAsaTrustee, rbac_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, ) @@ -77,7 +61,6 @@ def account_manager( algorand, utils.DAsaAccountManager, rbac_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, ) @@ -90,7 +73,6 @@ def primary_dealer( algorand, utils.DAsaPrimaryDealer, rbac_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, ) @@ -103,5 +85,4 @@ def interest_oracle( algorand, utils.DAsaInterestOracle, rbac_client, - rbac_assign_role_args_class=RbacAssignRoleArgs, ) diff --git a/tests/mock_module_rbac/test_mock_rbac_module.py b/tests/mock_module_rbac/test_mock_rbac_module.py new file mode 100644 index 00000000..077e2919 --- /dev/null +++ b/tests/mock_module_rbac/test_mock_rbac_module.py @@ -0,0 +1,408 @@ +import pytest +from algokit_utils import ( + AlgorandClient, + CommonAppCallParams, + LogicError, + SigningAccount, +) + +from smart_contracts import enums +from smart_contracts import errors as err +from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( + MockRbacModuleClient, + MockRbacModuleSend, + RbacAssignRoleArgs, + RbacContractDefaultArgs, + RbacContractSuspensionArgs, + RbacGetAddressRolesArgs, + RbacGetRoleValidityArgs, + RbacRevokeRoleArgs, + RbacRotateArrangerArgs, + RbacSetOpDaemonArgs, + RoleValidity, +) +from tests import utils +from tests.utils import ( + DAsaAccountManager, + DAsaAuthority, + DAsaInterestOracle, + DAsaPrimaryDealer, + DAsaTrustee, +) + + +def assert_role_mask( + roles: tuple[bool, bool, bool, bool, bool] | list[bool], + *, + account_manager: bool = False, + primary_dealer: bool = False, + trustee: bool = False, + authority: bool = False, + observer: bool = False, +) -> None: + assert tuple(roles) == ( + account_manager, + primary_dealer, + trustee, + authority, + observer, + ) + + +def test_mock_rbac_send_surface_matches_current_abi() -> None: + assert {name for name in dir(MockRbacModuleSend) if not name.startswith("_")} == { + "clear_state", + "rbac_assign_role", + "rbac_get_address_roles", + "rbac_get_arranger", + "rbac_get_role_validity", + "rbac_contract_suspension", + "rbac_contract_default", + "rbac_revoke_role", + "rbac_rotate_arranger", + "rbac_set_op_daemon", + "update", + } + + +def test_contract_update_is_arranger_only( + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + result = rbac_client.send.update.contract_update() + assert result.confirmation + + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.update.contract_update( + params=CommonAppCallParams(sender=no_role_account.address) + ) + + +def test_rbac_get_arranger_reflects_global_state( + arranger: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + assert rbac_client.send.rbac_get_arranger().abi_return == arranger.address + assert rbac_client.state.global_state.arranger == arranger.address + + +def test_rbac_set_op_daemon_is_arranger_only( + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + result = rbac_client.send.rbac_set_op_daemon( + RbacSetOpDaemonArgs(address=no_role_account.address) + ) + assert result.abi_return > 0 + assert rbac_client.state.global_state.op_daemon == no_role_account.address + + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.rbac_set_op_daemon( + RbacSetOpDaemonArgs(address=rbac_client.app_address), + params=CommonAppCallParams(sender=no_role_account.address), + ) + + +def test_rbac_rotate_arranger_transfers_control( + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + rbac_client.send.rbac_rotate_arranger( + RbacRotateArrangerArgs(new_arranger=no_role_account.address) + ) + assert rbac_client.send.rbac_get_arranger().abi_return == no_role_account.address + + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.rbac_set_op_daemon( + RbacSetOpDaemonArgs(address=rbac_client.app_address) + ) + + rbac_client.send.rbac_set_op_daemon( + RbacSetOpDaemonArgs(address=rbac_client.app_address), + params=CommonAppCallParams(sender=no_role_account.address), + ) + assert rbac_client.state.global_state.op_daemon == rbac_client.app_address + + +def test_rbac_assign_role_updates_role_validity_and_masks( + algorand: AlgorandClient, + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + current_timestamp = utils.get_latest_timestamp(algorand.client.algod) + validity = RoleValidity( + role_validity_start=current_timestamp - 1, + role_validity_end=current_timestamp + 1_000, + ) + + result = rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + validity=validity, + ) + ) + assert result.abi_return > 0 + + roles = rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=no_role_account.address) + ).abi_return + assert_role_mask(roles, authority=True) + + stored_validity = rbac_client.send.rbac_get_role_validity( + RbacGetRoleValidityArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + ) + ).abi_return + assert stored_validity == validity + assert ( + rbac_client.state.box.authority.get_value(no_role_account.address) == validity + ) + + +def test_rbac_assign_role_rejects_invalid_calls( + authority: DAsaAuthority, + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + validity=RoleValidity(0, 2**64 - 1), + ), + params=CommonAppCallParams(sender=no_role_account.address), + ) + + with pytest.raises(LogicError, match=err.INVALID_ROLE): + rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=0, + role_address=no_role_account.address, + validity=RoleValidity(0, 2**64 - 1), + ) + ) + + with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): + rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=authority.address, + validity=RoleValidity(0, 2**64 - 1), + ) + ) + + +def test_rbac_revoke_role_removes_assignment( + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + validity=RoleValidity(0, 2**64 - 1), + ) + ) + + result = rbac_client.send.rbac_revoke_role( + RbacRevokeRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + ) + ) + assert result.abi_return > 0 + + roles = rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=no_role_account.address) + ).abi_return + assert_role_mask(roles) + with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): + rbac_client.send.rbac_get_role_validity( + RbacGetRoleValidityArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + ) + ) + + +def test_rbac_revoke_role_rejects_invalid_calls( + authority: DAsaAuthority, + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.rbac_revoke_role( + RbacRevokeRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=authority.address, + ), + params=CommonAppCallParams(sender=no_role_account.address), + ) + + with pytest.raises(LogicError, match=err.INVALID_ROLE): + rbac_client.send.rbac_revoke_role( + RbacRevokeRoleArgs( + role_id=0, + role_address=authority.address, + ) + ) + + with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): + rbac_client.send.rbac_revoke_role( + RbacRevokeRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + ) + ) + + +def test_rbac_gov_contract_suspension_is_authority_only( + authority: DAsaAuthority, + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + assert not rbac_client.state.global_state.contract_suspended + + result = rbac_client.send.rbac_contract_suspension( + RbacContractSuspensionArgs(suspended=True), + params=CommonAppCallParams(sender=authority.address), + ) + assert result.abi_return > 0 + assert rbac_client.state.global_state.contract_suspended + + rbac_client.send.rbac_contract_suspension( + RbacContractSuspensionArgs(suspended=False), + params=CommonAppCallParams(sender=authority.address), + ) + assert not rbac_client.state.global_state.contract_suspended + + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.rbac_contract_suspension( + RbacContractSuspensionArgs(suspended=True), + params=CommonAppCallParams(sender=no_role_account.address), + ) + + +def test_rbac_contract_default_is_trustee_only_and_gates_default_state( + trustee: DAsaTrustee, + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + assert not rbac_client.state.global_state.defaulted + + result = rbac_client.send.rbac_contract_default( + RbacContractDefaultArgs(defaulted=True), + params=CommonAppCallParams(sender=trustee.address), + ) + assert result.abi_return > 0 + assert rbac_client.state.global_state.defaulted + + with pytest.raises(LogicError, match=err.DEFAULTED): + rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + validity=RoleValidity(0, 2**64 - 1), + ) + ) + + result = rbac_client.send.rbac_contract_default( + RbacContractDefaultArgs(defaulted=False), + params=CommonAppCallParams(sender=trustee.address), + ) + assert result.abi_return > 0 + assert not rbac_client.state.global_state.defaulted + + result = rbac_client.send.rbac_assign_role( + RbacAssignRoleArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + validity=RoleValidity(0, 2**64 - 1), + ) + ) + assert result.abi_return > 0 + + with pytest.raises(LogicError, match=err.UNAUTHORIZED): + rbac_client.send.rbac_contract_default( + RbacContractDefaultArgs(defaulted=True), + params=CommonAppCallParams(sender=no_role_account.address), + ) + + +def test_rbac_get_address_roles_covers_every_role_fixture( + rbac_client: MockRbacModuleClient, + account_manager: DAsaAccountManager, + primary_dealer: DAsaPrimaryDealer, + trustee: DAsaTrustee, + authority: DAsaAuthority, + interest_oracle: DAsaInterestOracle, + no_role_account: SigningAccount, +) -> None: + assert_role_mask( + rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=account_manager.address) + ).abi_return, + account_manager=True, + ) + assert_role_mask( + rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=primary_dealer.address) + ).abi_return, + primary_dealer=True, + ) + assert_role_mask( + rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=trustee.address) + ).abi_return, + trustee=True, + ) + assert_role_mask( + rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=authority.address) + ).abi_return, + authority=True, + ) + assert_role_mask( + rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=interest_oracle.address) + ).abi_return, + observer=True, + ) + assert_role_mask( + rbac_client.send.rbac_get_address_roles( + RbacGetAddressRolesArgs(address=no_role_account.address) + ).abi_return + ) + + +def test_rbac_get_role_validity_reports_arranger_and_rejects_invalid_inputs( + arranger: SigningAccount, + no_role_account: SigningAccount, + rbac_client: MockRbacModuleClient, +) -> None: + arranger_validity = rbac_client.send.rbac_get_role_validity( + RbacGetRoleValidityArgs( + role_id=enums.ROLE_ARRANGER, + role_address=arranger.address, + ) + ).abi_return + assert arranger_validity == RoleValidity(0, 0) + + with pytest.raises(LogicError, match=err.INVALID_ROLE): + rbac_client.send.rbac_get_role_validity( + RbacGetRoleValidityArgs( + role_id=0, + role_address=no_role_account.address, + ) + ) + + with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): + rbac_client.send.rbac_get_role_validity( + RbacGetRoleValidityArgs( + role_id=enums.ROLE_AUTHORITY, + role_address=no_role_account.address, + ) + ) diff --git a/tests/mock_module_rbac/test_policy_set_asset_suspension.py b/tests/mock_module_rbac/test_policy_set_asset_suspension.py deleted file mode 100644 index e3cdf0c2..00000000 --- a/tests/mock_module_rbac/test_policy_set_asset_suspension.py +++ /dev/null @@ -1,66 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, - RbacGovAssetSuspensionArgs, -) -from tests.utils import DAsaAuthority - - -def test_pass_rbac_gov_asset_suspension( - authority: DAsaAuthority, rbac_client: MockRbacModuleClient -) -> None: - asset_suspended = rbac_client.state.global_state.asset_suspended - assert not asset_suspended - - rbac_client.send.rbac_gov_asset_suspension( - RbacGovAssetSuspensionArgs(suspended=True), - params=CommonAppCallParams( - sender=authority.address, - ), - ) - - asset_suspended = rbac_client.state.global_state.asset_suspended - assert asset_suspended - - -def test_fail_unauthorized( - no_role_account: SigningAccount, rbac_client: MockRbacModuleClient -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - rbac_client.send.rbac_gov_asset_suspension( - RbacGovAssetSuspensionArgs(suspended=True), - params=CommonAppCallParams( - sender=no_role_account.address, - ), - ) - - -def test_concrete_pass_rbac_gov_asset_suspension( - shared_authority, - shared_client_active, -) -> None: - shared_client_active.send.rbac_gov_asset_suspension( - (True,), - params=CommonAppCallParams(sender=shared_authority.address), - ) - assert shared_client_active.send.get_asset_info().abi_return.suspended - - shared_client_active.send.rbac_gov_asset_suspension( - (False,), - params=CommonAppCallParams(sender=shared_authority.address), - ) - assert not shared_client_active.send.get_asset_info().abi_return.suspended - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_client_active, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.rbac_gov_asset_suspension( - (True,), - params=CommonAppCallParams(sender=no_role_account.address), - ) diff --git a/tests/mock_module_rbac/test_rbac_assign_role.py b/tests/mock_module_rbac/test_rbac_assign_role.py deleted file mode 100644 index 6674c8c1..00000000 --- a/tests/mock_module_rbac/test_rbac_assign_role.py +++ /dev/null @@ -1,153 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, - RbacAssignRoleArgs, -) -from tests import utils - - -def test_pass_rbac_assign_role( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - rbac_client.send.rbac_assign_role( - RbacAssignRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=no_role_account.address, - config=b"", - ) - ) - - -def test_fail_unauthorized( - no_role_account: SigningAccount, rbac_client: MockRbacModuleClient -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - rbac_client.send.rbac_assign_role( - RbacAssignRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=no_role_account.address, - config=b"", - ), - params=CommonAppCallParams( - sender=no_role_account.address, - ), - ) - - -def test_fail_invalid_role( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE): - rbac_client.send.rbac_assign_role( - RbacAssignRoleArgs( - role_id=0, - role_address=no_role_account.address, - config=b"", - ) - ) - - -def test_fail_invalid_role_address( - authority: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): - rbac_client.send.rbac_assign_role( - RbacAssignRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=authority.address, - config=b"", - ) - ) - - -def test_concrete_pass_rbac_assign_role( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - shared_client_empty.send.rbac_assign_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - utils.set_role_config(), - ) - ) - roles = shared_client_empty.send.rbac_get_address_roles( - (no_role_account.address,) - ).abi_return - assert roles[0] - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_empty.send.rbac_assign_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - utils.set_role_config(), - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_fail_defaulted( - no_role_account: SigningAccount, - shared_trustee, - shared_client_empty, -) -> None: - shared_client_empty.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_empty.send.rbac_assign_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - utils.set_role_config(), - ) - ) - - -def test_concrete_fail_invalid_role( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE): - shared_client_empty.send.rbac_assign_role( - ( - 0, - no_role_account.address, - utils.set_role_config(), - ) - ) - - -def test_concrete_fail_invalid_role_address( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - shared_client_empty.send.rbac_assign_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - utils.set_role_config(), - ) - ) - with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): - shared_client_empty.send.rbac_assign_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - utils.set_role_config(), - ) - ) diff --git a/tests/mock_module_rbac/test_rbac_get_address_role.py b/tests/mock_module_rbac/test_rbac_get_address_role.py deleted file mode 100644 index 21772dab..00000000 --- a/tests/mock_module_rbac/test_rbac_get_address_role.py +++ /dev/null @@ -1,73 +0,0 @@ -from algokit_utils import SigningAccount - -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, - RbacGetAddressRolesArgs, -) -from tests.utils import ( - DAsaAccountManager, - DAsaAuthority, - DAsaInterestOracle, - DAsaPrimaryDealer, - DAsaTrustee, -) - - -def test_pass_rbac_get_address_roles_for_assigned_accounts( - rbac_client: MockRbacModuleClient, - account_manager: DAsaAccountManager, - primary_dealer: DAsaPrimaryDealer, - trustee: DAsaTrustee, - authority: DAsaAuthority, - interest_oracle: DAsaInterestOracle, -) -> None: - account_manager_roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=account_manager.address) - ).abi_return - assert account_manager_roles == [True, False, False, False, False] - - primary_dealer_roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=primary_dealer.address) - ).abi_return - assert primary_dealer_roles == [False, True, False, False, False] - - trustee_roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=trustee.address) - ).abi_return - assert trustee_roles == [False, False, True, False, False] - - authority_roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=authority.address) - ).abi_return - assert authority_roles == [False, False, False, True, False] - - interest_oracle_roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=interest_oracle.address) - ).abi_return - assert interest_oracle_roles == [False, False, False, False, True] - - -def test_pass_rbac_get_address_roles_for_unassigned_account( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=no_role_account.address) - ).abi_return - assert roles == [False, False, False, False, False] - - -def test_concrete_pass_rbac_get_address_roles( - no_role_account: SigningAccount, - shared_account_manager, - shared_client_empty, -) -> None: - manager_roles = shared_client_empty.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=shared_account_manager.address) - ).abi_return - assert manager_roles == [True, False, False, False, False] - - unassigned_roles = shared_client_empty.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=no_role_account.address) - ).abi_return - assert unassigned_roles == [False, False, False, False, False] diff --git a/tests/mock_module_rbac/test_rbac_get_arranger.py b/tests/mock_module_rbac/test_rbac_get_arranger.py deleted file mode 100644 index 6957fb46..00000000 --- a/tests/mock_module_rbac/test_rbac_get_arranger.py +++ /dev/null @@ -1,19 +0,0 @@ -from algokit_utils import SigningAccount - -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, -) - - -def test_pass_rbac_get_arranger( - arranger: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - assert rbac_client.send.rbac_get_arranger().abi_return == arranger.address - - -def test_concrete_pass_rbac_get_arranger(shared_client_empty) -> None: - assert ( - shared_client_empty.send.rbac_get_arranger().abi_return - == shared_client_empty.state.global_state.arranger - ) diff --git a/tests/mock_module_rbac/test_rbac_get_role_config.py b/tests/mock_module_rbac/test_rbac_get_role_config.py deleted file mode 100644 index a8bc5e45..00000000 --- a/tests/mock_module_rbac/test_rbac_get_role_config.py +++ /dev/null @@ -1,104 +0,0 @@ -import pytest -from algokit_utils import LogicError - -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, - RbacGetRoleConfigArgs, -) -from tests import utils -from tests.utils import DAsaAuthority - - -def test_pass_rbac_get_role_config( - authority: DAsaAuthority, - rbac_client: MockRbacModuleClient, -) -> None: - config = rbac_client.send.rbac_get_role_config( - RbacGetRoleConfigArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=authority.address, - ) - ).abi_return - - expected = utils.set_role_config() - # Decode the expected bytes manually (2 uint64 values = 16 bytes total, big-endian) - import struct - - expected_start, expected_end = struct.unpack(">QQ", expected) - - assert config.role_validity_start == expected_start - assert config.role_validity_end == expected_end - - -def test_pass_rbac_get_arranger_role_config( - arranger, - rbac_client: MockRbacModuleClient, -) -> None: - config = rbac_client.send.rbac_get_role_config( - RbacGetRoleConfigArgs( - role_id=sc_cst.ROLE_ARRANGER, - role_address=arranger.address, - ) - ).abi_return - assert config.role_validity_start == 0 - assert config.role_validity_end == 0 - - -def test_fail_invalid_role(rbac_client: MockRbacModuleClient) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE): - rbac_client.send.rbac_get_role_config( - RbacGetRoleConfigArgs(role_id=0, role_address=rbac_client.app_address) - ) - - -def test_fail_invalid_role_address( - no_role_account, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): - rbac_client.send.rbac_get_role_config( - RbacGetRoleConfigArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=no_role_account.address, - ) - ) - - -def test_concrete_pass_rbac_get_role_config( - shared_account_manager, - shared_client_empty, -) -> None: - config = shared_client_empty.send.rbac_get_role_config( - (sc_cst.ROLE_ACCOUNT_MANAGER, shared_account_manager.address) - ).abi_return - assert config.role_validity_start == 0 - assert config.role_validity_end == 2**64 - 1 - - -def test_concrete_pass_rbac_get_arranger_role_config(shared_client_empty) -> None: - arranger = shared_client_empty.state.global_state.arranger - config = shared_client_empty.send.rbac_get_role_config( - (sc_cst.ROLE_ARRANGER, arranger) - ).abi_return - assert config.role_validity_start == 0 - assert config.role_validity_end == 0 - - -def test_concrete_fail_invalid_role( - no_role_account, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE): - shared_client_empty.send.rbac_get_role_config((0, no_role_account.address)) - - -def test_concrete_fail_invalid_role_address( - no_role_account, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): - shared_client_empty.send.rbac_get_role_config( - (sc_cst.ROLE_ACCOUNT_MANAGER, no_role_account.address) - ) diff --git a/tests/mock_module_rbac/test_rbac_revoke_role.py b/tests/mock_module_rbac/test_rbac_revoke_role.py deleted file mode 100644 index 0b3f3d3d..00000000 --- a/tests/mock_module_rbac/test_rbac_revoke_role.py +++ /dev/null @@ -1,155 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, - RbacAssignRoleArgs, - RbacGetAddressRolesArgs, - RbacRevokeRoleArgs, -) -from tests import utils -from tests.utils import DAsaAuthority - - -def test_pass_rbac_revoke_role( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - rbac_client.send.rbac_assign_role( - RbacAssignRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=no_role_account.address, - config=b"", - ) - ) - - rbac_client.send.rbac_revoke_role( - RbacRevokeRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=no_role_account.address, - ) - ) - - roles = rbac_client.send.rbac_get_address_roles( - RbacGetAddressRolesArgs(address=no_role_account.address), - ).abi_return - assert not roles[3] - - -def test_fail_unauthorized( - no_role_account: SigningAccount, - authority: DAsaAuthority, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - rbac_client.send.rbac_revoke_role( - RbacRevokeRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=authority.address, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_role( - authority: DAsaAuthority, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE): - rbac_client.send.rbac_revoke_role( - RbacRevokeRoleArgs( - role_id=0, - role_address=authority.address, - ) - ) - - -def test_fail_invalid_role_address( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): - rbac_client.send.rbac_revoke_role( - RbacRevokeRoleArgs( - role_id=sc_cst.ROLE_AUTHORITY, - role_address=no_role_account.address, - ) - ) - - -def test_concrete_pass_rbac_revoke_role( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - shared_client_empty.send.rbac_assign_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - utils.set_role_config(), - ) - ) - shared_client_empty.send.rbac_revoke_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - ) - ) - roles = shared_client_empty.send.rbac_get_address_roles( - (no_role_account.address,) - ).abi_return - assert not roles[0] - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_empty.send.rbac_revoke_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_fail_defaulted( - no_role_account: SigningAccount, - shared_trustee, - shared_client_empty, -) -> None: - shared_client_empty.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_empty.send.rbac_revoke_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - ) - ) - - -def test_concrete_fail_invalid_role( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE): - shared_client_empty.send.rbac_revoke_role((0, no_role_account.address)) - - -def test_concrete_fail_invalid_role_address( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_ROLE_ADDRESS): - shared_client_empty.send.rbac_revoke_role( - ( - sc_cst.ROLE_ACCOUNT_MANAGER, - no_role_account.address, - ) - ) diff --git a/tests/mock_module_rbac/test_rbac_rotate_arranger.py b/tests/mock_module_rbac/test_rbac_rotate_arranger.py deleted file mode 100644 index 9766b2ef..00000000 --- a/tests/mock_module_rbac/test_rbac_rotate_arranger.py +++ /dev/null @@ -1,51 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.mock_module_rbac.mock_rbac_module_client import ( - MockRbacModuleClient, - RbacRotateArrangerArgs, -) - - -def test_pass_rbac_rotate_arranger( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - rbac_client.send.rbac_rotate_arranger( - RbacRotateArrangerArgs(new_arranger=no_role_account.address) - ) - assert rbac_client.send.rbac_get_arranger().abi_return == no_role_account.address - - -def test_fail_unauthorized( - no_role_account: SigningAccount, - rbac_client: MockRbacModuleClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - rbac_client.send.rbac_rotate_arranger( - RbacRotateArrangerArgs(new_arranger=no_role_account.address), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_concrete_pass_rbac_rotate_arranger( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - shared_client_empty.send.rbac_rotate_arranger((no_role_account.address,)) - assert ( - shared_client_empty.send.rbac_get_arranger().abi_return - == no_role_account.address - ) - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_client_empty, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_empty.send.rbac_rotate_arranger( - (no_role_account.address,), - params=CommonAppCallParams(sender=no_role_account.address), - ) diff --git a/tests/pam/__init__.py b/tests/pam/__init__.py new file mode 100644 index 00000000..d0e46685 --- /dev/null +++ b/tests/pam/__init__.py @@ -0,0 +1 @@ +"""PAM integration tests.""" diff --git a/tests/pam/conftest.py b/tests/pam/conftest.py new file mode 100644 index 00000000..db1cfaf7 --- /dev/null +++ b/tests/pam/conftest.py @@ -0,0 +1,32 @@ +import pytest +from algokit_utils import AlgorandClient + +from d_asa.artifacts.dasa_client import ( + DasaClient, +) +from tests import conftest_helpers as helpers +from tests import utils + + +@pytest.fixture(scope="function") +def pam_primary_dealer( + algorand: AlgorandClient, + d_asa_client: DasaClient, +) -> utils.DAsaPrimaryDealer: + return helpers.create_role_account( + algorand, + utils.DAsaPrimaryDealer, + d_asa_client, + ) + + +@pytest.fixture(scope="function") +def pam_account_manager( + algorand: AlgorandClient, + d_asa_client: DasaClient, +) -> utils.DAsaAccountManager: + return helpers.create_role_account( + algorand, + utils.DAsaAccountManager, + d_asa_client, + ) diff --git a/tests/pam/fcb/test_pam_fixed_coupon_bond.py b/tests/pam/fcb/test_pam_fixed_coupon_bond.py new file mode 100644 index 00000000..292b0bfe --- /dev/null +++ b/tests/pam/fcb/test_pam_fixed_coupon_bond.py @@ -0,0 +1,264 @@ +from __future__ import annotations + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + CommonAppCallParams, + SendParams, + SigningAccount, +) + +from d_asa import NormalizationResult, normalize_contract_attributes +from d_asa.artifacts.dasa_client import ( + AccountGetPositionArgs, + ClaimDueCashflowsArgs, + DasaClient, + FundDueCashflowsArgs, +) +from d_asa.contracts import make_pam_fixed_coupon_bond_profile +from d_asa.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS +from d_asa.schedule import Cycle +from smart_contracts import constants as cst +from smart_contracts import enums +from tests import utils +from tests.pam.pam_test_support import ( + ISSUANCE_DELAY_CYCLE, + MINIMUM_DENOMINATION, + PRINCIPAL, + assert_pending_ied_guards, + cycle_duration_seconds, + scale_currency_amount, + setup_pam_lifecycle, +) + +NOMINAL_RATE = 0.02 +INTEREST_PAYMENT_CYCLE = Cycle.parse_cycle("90D") +MATURITY_OFFSET_CYCLE = Cycle.parse_cycle("1800D") + + +def _derive_total_interest_amount(result: NormalizationResult) -> int: + outstanding_principal = result.schedule[0].next_outstanding_principal + nominal_interest_rate = ( + result.schedule[0].next_nominal_interest_rate or result.terms.rate_reset_next + ) + accrued_interest = 0 + total_interest = 0 + + for entry in result.schedule[1:]: + interest_segment = ( + outstanding_principal + * nominal_interest_rate + // result.terms.fixed_point_scale + * entry.accrual_factor + // result.terms.fixed_point_scale + ) + + if entry.event_type in {"IP", "MD"}: + total_interest += accrued_interest + interest_segment + accrued_interest = 0 + elif entry.event_type == "PR": + accrued_interest += interest_segment + + if entry.event_type in {"PR", "MD"}: + outstanding_principal = entry.next_outstanding_principal + + if entry.next_nominal_interest_rate: + nominal_interest_rate = entry.next_nominal_interest_rate + + return total_interest + + +def test_fixed_coupon_pam_full_lifecycle( + algorand: AlgorandClient, + bank: SigningAccount, + currency: utils.Currency, + d_asa_client: DasaClient, + pam_primary_dealer: utils.DAsaPrimaryDealer, + pam_account_manager: utils.DAsaAccountManager, +) -> None: + current_ts = utils.get_latest_timestamp(algorand.client.algod) + issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) + coupon_period = cycle_duration_seconds(INTEREST_PAYMENT_CYCLE) + maturity_offset = cycle_duration_seconds(MATURITY_OFFSET_CYCLE) + assert maturity_offset % coupon_period == 0 + total_coupons = maturity_offset // coupon_period + + issuance_date = current_ts + issuance_delay + first_coupon_date = issuance_date + coupon_period + maturity_date = issuance_date + maturity_offset + currency_scale = 10**currency.decimals + scaled_principal = scale_currency_amount(PRINCIPAL, currency_scale) + + attrs = make_pam_fixed_coupon_bond_profile( + contract_id=1, + status_date=current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=PRINCIPAL, + nominal_interest_rate=NOMINAL_RATE, + interest_payment_cycle=INTEREST_PAYMENT_CYCLE, + interest_payment_anchor=first_coupon_date, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=currency.id, + denomination_asset_decimals=currency.decimals, + notional_unit_value=MINIMUM_DENOMINATION, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + + expected_event_types = ["IED"] + ["IP"] * total_coupons + ["MD"] + assert [entry.event_type for entry in normalized.schedule] == expected_event_types + total_interest_amount = _derive_total_interest_amount(normalized) + + participants = setup_pam_lifecycle( + client=d_asa_client, + primary_dealer=pam_primary_dealer, + account_manager=pam_account_manager, + algorand=algorand, + bank=bank, + currency=currency, + normalized=normalized, + bank_funding_amount=total_interest_amount, + investor_payment_amount=normalized.terms.initial_exchange_amount, + prospectus_url="ACTUS fixed coupon PAM lifecycle", + ) + client = d_asa_client + investor = participants.investor + receiver = participants.receiver + + account_position = client.send.account_get_position( + AccountGetPositionArgs(holding_address=investor.address) + ).abi_return + assert account_position.units == 0 + assert account_position.reserved_units == normalized.terms.total_units + + contract_state = client.send.contract_get_state().abi_return + assert contract_state.contract_type == CONTRACT_TYPE_IDS["PAM"] + assert contract_state.status == enums.STATUS_PENDING_IED + assert contract_state.total_units == normalized.terms.total_units + assert contract_state.initial_exchange_amount == scaled_principal + assert contract_state.reserved_units_total == normalized.terms.total_units + assert contract_state.event_cursor == 0 + assert contract_state.schedule_entry_count == len(normalized.schedule) + + assert_pending_ied_guards( + client=client, + investor=investor, + receiver=receiver, + ) + + ied_entry = normalized.schedule[0] + utils.time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC) + ied_result = client.send.contract_execute_ied() + ied_event = utils.decode_actus_execution_event( + utils.get_event_from_call_result(ied_result) + ) + assert ied_event["event_id"] == ied_entry.event_id + assert ied_event["event_type"] == EVENT_TYPE_IDS["IED"] + assert ied_event["scheduled_time"] == ied_entry.scheduled_time + assert ied_event["applied_at"] > ied_event["scheduled_time"] + assert ied_event["payoff"] == normalized.terms.initial_exchange_amount + assert ied_event["payoff_sign"] == enums.PAYOFF_SIGN_POSITIVE + assert ied_event["settled_amount"] == 0 + + contract_state = client.send.contract_get_state().abi_return + assert contract_state.status == enums.STATUS_ACTIVE + assert contract_state.event_cursor == 1 + assert contract_state.initial_exchange_amount == scaled_principal + assert contract_state.outstanding_principal == scaled_principal + assert contract_state.interest_calculation_base == scaled_principal + assert contract_state.nominal_interest_rate == normalized.terms.rate_reset_next + assert contract_state.reserved_units_total == normalized.terms.total_units + + total_interest_claimed = 0 + total_principal_claimed = 0 + + first_coupon_expected_interest = ( + scaled_principal + * normalized.terms.rate_reset_next + // cst.FIXED_POINT_SCALE + * normalized.schedule[1].accrual_factor + // cst.FIXED_POINT_SCALE + ) + + for schedule_index, entry in enumerate(normalized.schedule[1:], start=1): + utils.time_warp(entry.scheduled_time) + + funding_result = client.send.fund_due_cashflows( + FundDueCashflowsArgs(max_event_count=1) + ) + funding = funding_result.abi_return + assert funding.processed_events == 1 + assert funding.total_funded > 0 + + event = utils.decode_actus_execution_event( + utils.get_event_from_call_result(funding_result) + ) + assert event["event_id"] == entry.event_id + assert event["event_type"] == EVENT_TYPE_IDS[entry.event_type] + assert event["scheduled_time"] == entry.scheduled_time + assert event["applied_at"] >= event["scheduled_time"] + assert event["payoff"] == funding.total_funded + assert event["payoff_sign"] == enums.PAYOFF_SIGN_NEGATIVE + assert event["settled_amount"] == funding.total_funded + assert event["sequence"] == schedule_index + 1 + + balance_before = algorand.asset.get_account_information( + investor.address, currency.id + ).balance + claim_result = client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=investor.address, + payment_info=b"", + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + max_fee=AlgoAmount.from_micro_algo(3_000), + ), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + claim = claim_result.abi_return + balance_after = algorand.asset.get_account_information( + investor.address, currency.id + ).balance + + assert claim.total_amount == funding.total_funded + assert balance_after - balance_before == claim.total_amount + + if schedule_index == 1: + assert claim.interest_amount == first_coupon_expected_interest + + if entry.event_type == "IP": + assert claim.interest_amount == claim.total_amount + assert claim.principal_amount == 0 + else: + assert entry.event_type == "MD" + assert claim.principal_amount == scaled_principal + assert claim.total_amount == scaled_principal + + total_interest_claimed += claim.interest_amount + total_principal_claimed += claim.principal_amount + + contract_state = client.send.contract_get_state().abi_return + final_position = client.send.account_get_position( + AccountGetPositionArgs(holding_address=investor.address) + ).abi_return + + assert total_principal_claimed == scaled_principal + assert total_interest_claimed > 0 + assert contract_state.status == enums.STATUS_ENDED + assert contract_state.event_cursor == len(normalized.schedule) + assert contract_state.schedule_entry_count == len(normalized.schedule) + assert contract_state.total_units == normalized.terms.total_units + assert contract_state.reserved_units_total == 0 + assert contract_state.outstanding_principal == 0 + assert contract_state.reserved_interest == 0 + assert contract_state.reserved_principal == 0 + assert final_position.units == normalized.terms.total_units + assert final_position.reserved_units == 0 + assert final_position.claimable_interest == 0 + assert final_position.claimable_principal == 0 + assert final_position.settled_cursor == len(normalized.schedule) diff --git a/tests/pam/pam_test_support.py b/tests/pam/pam_test_support.py new file mode 100644 index 00000000..25dc1bad --- /dev/null +++ b/tests/pam/pam_test_support.py @@ -0,0 +1,91 @@ +import pytest +from algokit_utils import ( + CommonAppCallParams, + LogicError, + SigningAccount, +) + +from d_asa.artifacts.dasa_client import ( + ClaimDueCashflowsArgs, + DasaClient, + FundDueCashflowsArgs, + TransferArgs, +) +from d_asa.pam_lifecycle import ( + EVENT_TYPE_NAMES, + ISSUANCE_DELAY_CYCLE, + LOCALNET_EXPLORER_TX_BASE_URL, + MINIMUM_DENOMINATION, + PRINCIPAL, + STATUS_NAMES, + PamLifecycleClaimTrace, + PamLifecycleParticipants, + PamLifecycleTrace, + PamLifecycleTraceStep, + client_initial_state, + client_schedule_page, + client_terms, + cycle_duration_seconds, + format_lifecycle_trace, + make_claim_trace, + scale_currency_amount, + setup_pam_lifecycle, +) +from smart_contracts import errors as err + +__all__ = [ + "EVENT_TYPE_NAMES", + "ISSUANCE_DELAY_CYCLE", + "LOCALNET_EXPLORER_TX_BASE_URL", + "MINIMUM_DENOMINATION", + "PRINCIPAL", + "STATUS_NAMES", + "PamLifecycleClaimTrace", + "PamLifecycleParticipants", + "PamLifecycleTrace", + "PamLifecycleTraceStep", + "assert_pending_ied_guards", + "client_initial_state", + "client_schedule_page", + "client_terms", + "cycle_duration_seconds", + "format_lifecycle_trace", + "make_claim_trace", + "scale_currency_amount", + "setup_pam_lifecycle", +] + + +def assert_pending_ied_guards( + *, + client: DasaClient, + investor: SigningAccount, + receiver: SigningAccount, +) -> None: + with pytest.raises(LogicError, match=err.PENDING_IED): + client.send.fund_due_cashflows(FundDueCashflowsArgs(max_event_count=1)) + + with pytest.raises(LogicError, match=err.PENDING_IED): + client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=investor.address, + payment_info=b"", + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + ), + ) + + with pytest.raises(LogicError, match=err.PENDING_IED): + client.send.transfer( + TransferArgs( + sender_holding_address=investor.address, + receiver_holding_address=receiver.address, + units=1, + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + ), + ) diff --git a/tests/pam/test_pam_lifecycle_showcase.py b/tests/pam/test_pam_lifecycle_showcase.py new file mode 100644 index 00000000..8bc1a650 --- /dev/null +++ b/tests/pam/test_pam_lifecycle_showcase.py @@ -0,0 +1,44 @@ +from __future__ import annotations + +from collections.abc import Callable + +import pytest +from algokit_utils import AlgorandClient, SigningAccount + +from d_asa.artifacts.dasa_client import DasaClient +from d_asa.localnet import Currency, DAsaAccountManager, DAsaPrimaryDealer +from d_asa.showcase import ( + SHOWCASE_BUILDERS, + PamShowcaseScenario, + run_showcase_scenario, +) +from tests.pam.pam_test_support import format_lifecycle_trace + + +@pytest.mark.parametrize( + "build_scenario", + SHOWCASE_BUILDERS, + ids=("fcb", "zcb"), +) +@pytest.mark.showcase +def test_pam_lifecycle_showcase( + algorand: AlgorandClient, + bank: SigningAccount, + currency: Currency, + d_asa_client: DasaClient, + pam_primary_dealer: DAsaPrimaryDealer, + pam_account_manager: DAsaAccountManager, + build_scenario: Callable[[AlgorandClient, Currency], PamShowcaseScenario], +) -> None: + trace = run_showcase_scenario( + algorand=algorand, + bank=bank, + currency=currency, + d_asa_client=d_asa_client, + pam_primary_dealer=pam_primary_dealer, + pam_account_manager=pam_account_manager, + build_scenario=build_scenario, + ) + + print() + print(format_lifecycle_trace(trace)) diff --git a/tests/pam/zcb/test_pam_zero_coupon_bond.py b/tests/pam/zcb/test_pam_zero_coupon_bond.py new file mode 100644 index 00000000..e6fc09f2 --- /dev/null +++ b/tests/pam/zcb/test_pam_zero_coupon_bond.py @@ -0,0 +1,204 @@ +from __future__ import annotations + +from algokit_utils import ( + AlgoAmount, + AlgorandClient, + CommonAppCallParams, + SendParams, + SigningAccount, +) + +from d_asa import normalize_contract_attributes +from d_asa.artifacts.dasa_client import ( + AccountGetPositionArgs, + ClaimDueCashflowsArgs, + DasaClient, + FundDueCashflowsArgs, +) +from d_asa.contracts import make_pam_zero_coupon_bond +from d_asa.registry import CONTRACT_TYPE_IDS, EVENT_TYPE_IDS +from d_asa.schedule import Cycle +from smart_contracts import constants as cst +from smart_contracts import enums +from tests import utils +from tests.pam.pam_test_support import ( + ISSUANCE_DELAY_CYCLE, + MINIMUM_DENOMINATION, + PRINCIPAL, + assert_pending_ied_guards, + cycle_duration_seconds, + scale_currency_amount, + setup_pam_lifecycle, +) + +ZERO_COUPON_MATURITY_CYCLE = Cycle.parse_cycle("360D") +ZERO_COUPON_DISCOUNT_BPS = 200 + + +def test_zero_coupon_pam_discounted_full_lifecycle( + algorand: AlgorandClient, + bank: SigningAccount, + currency: utils.Currency, + d_asa_client: DasaClient, + pam_primary_dealer: utils.DAsaPrimaryDealer, + pam_account_manager: utils.DAsaAccountManager, +) -> None: + current_ts = utils.get_latest_timestamp(algorand.client.algod) + issuance_delay = cycle_duration_seconds(ISSUANCE_DELAY_CYCLE) + maturity_offset = cycle_duration_seconds(ZERO_COUPON_MATURITY_CYCLE) + + issuance_date = current_ts + issuance_delay + maturity_date = issuance_date + maturity_offset + discount_amount = PRINCIPAL * ZERO_COUPON_DISCOUNT_BPS // cst.BPS + issue_price = PRINCIPAL - discount_amount + currency_scale = 10**currency.decimals + scaled_principal = scale_currency_amount(PRINCIPAL, currency_scale) + scaled_issue_price = scale_currency_amount(issue_price, currency_scale) + + attrs = make_pam_zero_coupon_bond( + contract_id=2, + status_date=current_ts, + initial_exchange_date=issuance_date, + maturity_date=maturity_date, + notional_principal=PRINCIPAL, + premium_discount_at_ied=discount_amount, + ) + normalized = normalize_contract_attributes( + attrs, + denomination_asset_id=currency.id, + denomination_asset_decimals=currency.decimals, + notional_unit_value=MINIMUM_DENOMINATION, + secondary_market_opening_date=issuance_date, + secondary_market_closure_date=maturity_date + cst.DAY_2_SEC, + ) + + assert [entry.event_type for entry in normalized.schedule] == ["IED", "MD"] + assert normalized.terms.initial_exchange_amount == scaled_issue_price + assert normalized.terms.rate_reset_next == 0 + bank_funding_amount = scaled_principal - scaled_issue_price + + participants = setup_pam_lifecycle( + client=d_asa_client, + primary_dealer=pam_primary_dealer, + account_manager=pam_account_manager, + algorand=algorand, + bank=bank, + currency=currency, + normalized=normalized, + bank_funding_amount=bank_funding_amount, + investor_payment_amount=normalized.terms.initial_exchange_amount, + prospectus_url="ACTUS zero coupon PAM lifecycle", + ) + client = d_asa_client + investor = participants.investor + receiver = participants.receiver + + account_position = client.send.account_get_position( + AccountGetPositionArgs(holding_address=investor.address) + ).abi_return + assert account_position.units == 0 + assert account_position.reserved_units == normalized.terms.total_units + + contract_state = client.send.contract_get_state().abi_return + assert contract_state.contract_type == CONTRACT_TYPE_IDS["PAM"] + assert contract_state.status == enums.STATUS_PENDING_IED + assert contract_state.total_units == normalized.terms.total_units + assert contract_state.initial_exchange_amount == scaled_issue_price + assert contract_state.reserved_units_total == normalized.terms.total_units + assert contract_state.event_cursor == 0 + assert contract_state.schedule_entry_count == len(normalized.schedule) + + assert_pending_ied_guards( + client=client, + investor=investor, + receiver=receiver, + ) + + ied_entry = normalized.schedule[0] + utils.time_warp(ied_entry.scheduled_time + cst.DAY_2_SEC) + ied_result = client.send.contract_execute_ied() + ied_event = utils.decode_actus_execution_event( + utils.get_event_from_call_result(ied_result) + ) + assert ied_event["event_id"] == ied_entry.event_id + assert ied_event["event_type"] == EVENT_TYPE_IDS["IED"] + assert ied_event["scheduled_time"] == ied_entry.scheduled_time + assert ied_event["applied_at"] > ied_event["scheduled_time"] + assert ied_event["payoff"] == scaled_issue_price + assert ied_event["payoff_sign"] == enums.PAYOFF_SIGN_POSITIVE + assert ied_event["settled_amount"] == 0 + + contract_state = client.send.contract_get_state().abi_return + assert contract_state.status == enums.STATUS_ACTIVE + assert contract_state.event_cursor == 1 + assert contract_state.initial_exchange_amount == scaled_issue_price + assert contract_state.outstanding_principal == scaled_principal + assert contract_state.interest_calculation_base == scaled_principal + assert contract_state.nominal_interest_rate == 0 + assert contract_state.reserved_units_total == normalized.terms.total_units + + md_entry = normalized.schedule[1] + utils.time_warp(md_entry.scheduled_time) + + funding_result = client.send.fund_due_cashflows( + FundDueCashflowsArgs(max_event_count=1) + ) + funding = funding_result.abi_return + assert funding.processed_events == 1 + assert funding.total_funded == scaled_principal + + event = utils.decode_actus_execution_event( + utils.get_event_from_call_result(funding_result) + ) + assert event["event_id"] == md_entry.event_id + assert event["event_type"] == EVENT_TYPE_IDS["MD"] + assert event["scheduled_time"] == md_entry.scheduled_time + assert event["applied_at"] >= event["scheduled_time"] + assert event["payoff"] == scaled_principal + assert event["payoff_sign"] == enums.PAYOFF_SIGN_NEGATIVE + assert event["settled_amount"] == scaled_principal + assert event["sequence"] == 2 + + balance_before = algorand.asset.get_account_information( + investor.address, currency.id + ).balance + claim_result = client.send.claim_due_cashflows( + ClaimDueCashflowsArgs( + holding_address=investor.address, + payment_info=b"", + ), + params=CommonAppCallParams( + sender=investor.address, + signer=investor.signer, + max_fee=AlgoAmount.from_micro_algo(3_000), + ), + send_params=SendParams(cover_app_call_inner_transaction_fees=True), + ) + claim = claim_result.abi_return + balance_after = algorand.asset.get_account_information( + investor.address, currency.id + ).balance + + assert claim.total_amount == scaled_principal + assert claim.interest_amount == 0 + assert claim.principal_amount == scaled_principal + assert balance_after - balance_before == scaled_principal + + contract_state = client.send.contract_get_state().abi_return + final_position = client.send.account_get_position( + AccountGetPositionArgs(holding_address=investor.address) + ).abi_return + + assert contract_state.status == enums.STATUS_ENDED + assert contract_state.event_cursor == len(normalized.schedule) + assert contract_state.schedule_entry_count == len(normalized.schedule) + assert contract_state.total_units == normalized.terms.total_units + assert contract_state.reserved_units_total == 0 + assert contract_state.outstanding_principal == 0 + assert contract_state.reserved_interest == 0 + assert contract_state.reserved_principal == 0 + assert final_position.units == normalized.terms.total_units + assert final_position.reserved_units == 0 + assert final_position.claimable_interest == 0 + assert final_position.claimable_principal == 0 + assert final_position.settled_cursor == len(normalized.schedule) diff --git a/tests/perpetual_bond/__init__.py b/tests/perpetual_bond/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/perpetual_bond/conftest.py b/tests/perpetual_bond/conftest.py deleted file mode 100644 index af873813..00000000 --- a/tests/perpetual_bond/conftest.py +++ /dev/null @@ -1,302 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import ( - AlgorandClient, - SigningAccount, -) - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AccountOpenArgs, - AssetConfigArgs, - AssetCreateArgs, - AssetMetadata, - PayCouponArgs, - PerpetualBondClient, - PerpetualBondFactory, - PrimaryDistributionArgs, - RbacAssignRoleArgs, - RbacGovAssetSuspensionArgs, - SetDefaultStatusArgs, - SetSecondaryTimeEventsArgs, -) -from tests import conftest_helpers as helpers -from tests import utils -from tests.conftest import ( - APR, - INITIAL_D_ASA_UNITS, - ISSUANCE_DELAY, - MINIMUM_DENOMINATION, - PRIMARY_DISTRIBUTION_DELAY, - PRIMARY_DISTRIBUTION_DURATION, - PRINCIPAL, -) - -COUPON_PERIOD: Final[int] = 360 * sc_cst.DAY_2_SEC -DUE_COUPONS: Final[int] = 4 - -TOTAL_ASA_FUNDS: Final[int] = PRINCIPAL * (sc_cst.BPS + APR) // sc_cst.BPS - -PROSPECTUS_URL: Final[str] = "Perpetual Bond Prospectus" - - -@pytest.fixture(scope="session") -def asset_metadata() -> AssetMetadata: - return AssetMetadata( - contract_type=sc_cst.CT_PBN, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url=PROSPECTUS_URL, - ) - - -@pytest.fixture(scope="function") -def time_events(algorand: AlgorandClient) -> utils.TimeEvents: - current_ts = utils.get_latest_timestamp(algorand.client.algod) - primary_distribution_opening = current_ts + PRIMARY_DISTRIBUTION_DELAY - primary_distribution_closure = ( - primary_distribution_opening + PRIMARY_DISTRIBUTION_DURATION - ) - issuance_date = primary_distribution_closure + ISSUANCE_DELAY - return [ - primary_distribution_opening, - primary_distribution_closure, - issuance_date, - ] - - -@pytest.fixture(scope="function") -def perpetual_bond_cfg( - currency: utils.Currency, - time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return utils.DAsaConfig( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=0, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=day_count_convention, - interest_rate=APR, - coupon_rates=[], - time_events=time_events, - time_periods=[(COUPON_PERIOD, 0)], - ) - - -@pytest.fixture(scope="function") -def perpetual_bond_client_empty( - algorand: AlgorandClient, - arranger: SigningAccount, - asset_metadata: AssetMetadata, -) -> PerpetualBondClient: - return helpers.create_and_fund_client( - algorand, - PerpetualBondFactory, - arranger, - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata), - ) - - -@pytest.fixture(scope="function") -def account_manager( - algorand: AlgorandClient, - perpetual_bond_cfg: utils.DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> utils.DAsaAccountManager: - return helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - perpetual_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def trustee( - algorand: AlgorandClient, - perpetual_bond_cfg: utils.DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> utils.DAsaTrustee: - return helpers.create_role_account( - algorand, - utils.DAsaTrustee, - perpetual_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def authority( - algorand: AlgorandClient, - perpetual_bond_cfg: utils.DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> utils.DAsaAuthority: - return helpers.create_role_account( - algorand, - utils.DAsaAuthority, - perpetual_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def interest_oracle( - algorand: AlgorandClient, - perpetual_bond_cfg: utils.DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> utils.DAsaInterestOracle: - return helpers.create_role_account( - algorand, - utils.DAsaInterestOracle, - perpetual_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def perpetual_bond_client_active( - algorand: AlgorandClient, - bank: SigningAccount, - perpetual_bond_cfg: utils.DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> PerpetualBondClient: - return helpers.activate_client_with_config_and_funding( - algorand, - perpetual_bond_client_empty, - bank, - perpetual_bond_cfg, - TOTAL_ASA_FUNDS, - AssetConfigArgs, - ) - - -@pytest.fixture(scope="function") -def primary_dealer( - algorand: AlgorandClient, - perpetual_bond_client_active: PerpetualBondClient, -) -> utils.DAsaPrimaryDealer: - state = perpetual_bond_client_active.state.global_state - role_config = utils.set_role_config( - state.primary_distribution_opening_date, state.primary_distribution_closure_date - ) - return helpers.create_role_account( - algorand, - utils.DAsaPrimaryDealer, - perpetual_bond_client_active, - role_config, - RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def account_factory( - algorand: AlgorandClient, - bank: SigningAccount, - currency: utils.Currency, - account_manager: utils.DAsaAccountManager, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_factory( - algorand, currency, account_manager, AccountOpenArgs - ) - - -@pytest.fixture(scope="function") -def perpetual_bond_client_primary( - perpetual_bond_client_active: PerpetualBondClient, -) -> PerpetualBondClient: - state = perpetual_bond_client_active.state.global_state - return helpers.set_client_to_primary_phase( - perpetual_bond_client_active, - SetSecondaryTimeEventsArgs, - [state.issuance_date], - ) - - -@pytest.fixture(scope="function") -def account_with_units_factory( - account_factory: Callable[..., utils.DAsaAccount], - primary_dealer: utils.DAsaPrimaryDealer, - perpetual_bond_client_primary: PerpetualBondClient, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_with_units_factory( - account_factory, - primary_dealer, - perpetual_bond_client_primary, - PrimaryDistributionArgs, - INITIAL_D_ASA_UNITS, - ) - - -@pytest.fixture(scope="function") -def account_a( - account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return account_with_units_factory() - - -@pytest.fixture(scope="function") -def account_b( - account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return account_with_units_factory(units=2 * INITIAL_D_ASA_UNITS) - - -@pytest.fixture(scope="function") -def account_with_coupons_factory( - account_with_units_factory: Callable[..., utils.DAsaAccount], - perpetual_bond_client_primary: PerpetualBondClient, -) -> Callable[..., utils.DAsaAccount]: - state = perpetual_bond_client_primary.state.global_state - - def _factory( - *, units: int = INITIAL_D_ASA_UNITS, coupons: int = DUE_COUPONS - ) -> utils.DAsaAccount: - account = account_with_units_factory(units=units) - issuance_date = state.issuance_date - utils.time_warp(issuance_date + COUPON_PERIOD * coupons) - for _ in range(1, coupons + 1): - perpetual_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - return account - - return _factory - - -@pytest.fixture(scope="function") -def perpetual_bond_client_ongoing( - perpetual_bond_client_primary: PerpetualBondClient, -) -> PerpetualBondClient: - state = perpetual_bond_client_primary.state.global_state - utils.time_warp(state.issuance_date) - return perpetual_bond_client_primary - - -@pytest.fixture(scope="function") -def perpetual_bond_client_suspended( - authority: utils.DAsaAuthority, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> PerpetualBondClient: - return helpers.suspend_client( - perpetual_bond_client_ongoing, authority, RbacGovAssetSuspensionArgs - ) - - -@pytest.fixture(scope="function") -def perpetual_bond_client_defaulted( - trustee: utils.DAsaTrustee, perpetual_bond_client_ongoing: PerpetualBondClient -) -> PerpetualBondClient: - return helpers.set_client_to_default( - perpetual_bond_client_ongoing, trustee, SetDefaultStatusArgs - ) diff --git a/tests/perpetual_bond/test_asset_config.py b/tests/perpetual_bond/test_asset_config.py deleted file mode 100644 index d14d7eb1..00000000 --- a/tests/perpetual_bond/test_asset_config.py +++ /dev/null @@ -1,131 +0,0 @@ -from copy import deepcopy - -import pytest -from algokit_utils import LogicError - -from smart_contracts import config as sc_cfg -from smart_contracts import enums -from smart_contracts import errors as err -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetConfigArgs, - PerpetualBondClient, -) -from tests.utils import Currency, DAsaConfig - - -def test_pass_asset_config( - day_count_convention: int, - currency: Currency, - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> None: - perpetual_bond_client_empty.send.asset_config( - AssetConfigArgs(**perpetual_bond_cfg.dictify()) - ) - - state = perpetual_bond_client_empty.state.global_state - expected_time_events = perpetual_bond_client_empty.send.get_time_events().abi_return - expected_time_periods = ( - perpetual_bond_client_empty.send.get_time_periods().abi_return - ) - - # Asset Configuration - assert state.denomination_asset_id == currency.id - assert state.settlement_asset_id == state.denomination_asset_id - assert state.unit_value == perpetual_bond_cfg.minimum_denomination - assert state.day_count_convention == perpetual_bond_cfg.day_count_convention - - # Principal and Supply - assert ( - state.total_units - == perpetual_bond_cfg.principal // perpetual_bond_cfg.minimum_denomination - ) - assert not state.circulating_units - assert not state.principal_discount - - # Interest Rate - assert state.interest_rate == perpetual_bond_cfg.interest_rate - - # Coupons - assert state.total_coupons == perpetual_bond_cfg.total_coupons - assert state.coupon_period == perpetual_bond_cfg.time_periods[0][0] - assert not state.paid_coupon_units - - # Time Schedule - assert expected_time_events == perpetual_bond_cfg.time_events - # FIXME: algosdk has a bug ARC4 type decoding: https://github.com/algorand/py-algorand-sdk/issues/355 - # assert expected_time_periods == perpetual_bond_cfg.time_periods - assert not expected_time_periods[0][1] - assert ( - state.primary_distribution_opening_date - == perpetual_bond_cfg.time_events[sc_cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] - # == time_schedule_limits.primary_distribution_opening_date - ) - assert ( - state.primary_distribution_closure_date - == perpetual_bond_cfg.time_events[sc_cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX] - # == time_schedule_limits.primary_distribution_closure_date - ) - assert ( - state.issuance_date - == perpetual_bond_cfg.time_events[sc_cfg.ISSUANCE_DATE_IDX] - # == time_schedule_limits.issuance_date - ) - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert not state.maturity_date - - # Status - assert state.status == enums.STATUS_ACTIVE - assert not state.asset_suspended - - -def test_fail_invalid_time_events_length( - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(perpetual_bond_cfg) - wrong_d_asa_cfg.time_events = [*perpetual_bond_cfg.time_events, 0] - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): - perpetual_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time_periods( - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(perpetual_bond_cfg) - wrong_d_asa_cfg.time_periods = [*perpetual_bond_cfg.time_periods, (1, 1)] - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIODS): - perpetual_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_durations( - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(perpetual_bond_cfg) - wrong_d_asa_cfg.time_periods[0] = (0, 1) - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIOD_DURATION): - perpetual_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_repetitions( - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_empty: PerpetualBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(perpetual_bond_cfg) - wrong_d_asa_cfg.time_periods[0] = (1, 1) - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIOD_REPETITIONS): - perpetual_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -# TODO: Test INVALID_TIME_PERIOD for Actual/Actual convention diff --git a/tests/perpetual_bond/test_asset_create.py b/tests/perpetual_bond/test_asset_create.py deleted file mode 100644 index b50cddd4..00000000 --- a/tests/perpetual_bond/test_asset_create.py +++ /dev/null @@ -1,90 +0,0 @@ -from algokit_utils import AlgorandClient, SigningAccount -from algosdk.abi import ArrayStaticType, ByteType, StringType, TupleType, UintType - -from smart_contracts import constants as sc_cst -from smart_contracts import enums -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetCreateArgs, - AssetMetadata, - PerpetualBondFactory, -) - -from .conftest import PROSPECTUS_URL - - -def test_pass_asset_create( - algorand: AlgorandClient, - day_count_convention: int, - asset_metadata: AssetMetadata, - arranger: SigningAccount, -) -> None: - factory = algorand.client.get_typed_app_factory( - PerpetualBondFactory, - default_sender=arranger.address, - default_signer=arranger.signer, - ) - perpetual_bond_client, _ = factory.send.create.asset_create( - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata) - ) - - state = perpetual_bond_client.state.global_state - - # Roles - assert state.arranger == arranger.address - - # Asset Configuration - assert not state.denomination_asset_id - assert not state.settlement_asset_id - assert not state.unit_value - assert not state.day_count_convention - - # Metadata - assert state.metadata == TupleType( - [ - UintType(8), # Contract Type - UintType(8), # Calendar - UintType(8), # Business Day Convention - UintType(8), # End of Month Convention - UintType(8), # Prepayment Effect - UintType(8), # Penalty Type - ArrayStaticType(ByteType(), 32), # Prospectus Hash - StringType(), # Prospectus URL - ] - ).encode( - [ - sc_cst.CT_PBN, - sc_cst.CLDR_NC, - sc_cst.BDC_NOS, - sc_cst.EOMC_SD, - sc_cst.PPEF_N, - sc_cst.PYTP_N, - bytes(32), - PROSPECTUS_URL, - ] - ) - - # Principal and Supply - assert not state.total_units - assert not state.circulating_units - assert not state.principal_discount - - # Coupons - assert not state.total_coupons - assert not state.coupon_period - assert not state.paid_coupon_units - - # Time Schedule - assert not state.primary_distribution_opening_date - assert not state.primary_distribution_closure_date - assert not state.issuance_date - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert not state.maturity_date - - # Status - assert state.status == enums.STATUS_INACTIVE - assert not state.asset_suspended - - -def test_fail_invalid_state_schema() -> None: - pass # TODO diff --git a/tests/perpetual_bond/test_asset_transfer.py b/tests/perpetual_bond/test_asset_transfer.py deleted file mode 100644 index aa141d62..00000000 --- a/tests/perpetual_bond/test_asset_transfer.py +++ /dev/null @@ -1,268 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AccountGovSuspensionArgs, - AssetTransferArgs, - GetAccountUnitsCurrentValueArgs, - PayCouponArgs, - PerpetualBondClient, -) -from tests.utils import DAsaAccount, DAsaAuthority, DAsaConfig, time_warp - - -def test_pass_asset_transfer( - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_primary: PerpetualBondClient, - account_factory: Callable[..., DAsaAccount], - account_with_coupons_factory: Callable[..., DAsaAccount], -) -> None: - account_a = account_with_coupons_factory(units=3, coupons=1) - account_b = account_factory(perpetual_bond_client_primary) - - state = perpetual_bond_client_primary.state.global_state - coupon_1_date = state.issuance_date + state.coupon_period - - pre_transfer_units_a = account_a.units - pre_transfer_units_b = account_b.units - pre_transfer_unit_value_a = account_a.unit_value - pre_transfer_unit_value_b = account_b.unit_value - - assert pre_transfer_unit_value_a != pre_transfer_unit_value_b - assert pre_transfer_unit_value_b == 0 - assert account_a.paid_coupons != account_b.paid_coupons - - time_warp(coupon_1_date + state.coupon_period // 10) - - transfer_units = 1 - accrued_interest = ( - perpetual_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_units, - ) - ).abi_return.accrued_interest - ) - - transferred_value = perpetual_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_units_a = account_a.units - post_transfer_units_b = account_b.units - post_transfer_unit_value_a = account_a.unit_value - post_transfer_unit_value_b = account_b.unit_value - - assert ( - transferred_value - == perpetual_bond_cfg.minimum_denomination * transfer_units + accrued_interest - ) - assert post_transfer_units_a == pre_transfer_units_a - transfer_units - assert post_transfer_units_b == pre_transfer_units_b + transfer_units - assert post_transfer_unit_value_a == post_transfer_unit_value_b - assert account_a.paid_coupons == account_b.paid_coupons - - -def test_fail_secondary_market_not_open_yet( - perpetual_bond_client_primary: PerpetualBondClient, - account_a: DAsaAccount, - account_b: DAsaAccount, -) -> None: - with pytest.raises(LogicError, match=err.SECONDARY_MARKET_CLOSED): - perpetual_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_unauthorized( - no_role_account: SigningAccount, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_defaulted_status( - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_defaulted: PerpetualBondClient, -) -> None: - with pytest.raises(LogicError, match=err.DEFAULTED): - perpetual_bond_client_defaulted.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_suspended( - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_suspended: PerpetualBondClient, -) -> None: - with pytest.raises(LogicError, match=err.SUSPENDED): - perpetual_bond_client_suspended.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_invalid_sender( - no_role_account: SigningAccount, - account_a: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=no_role_account.address, - receiver_holding_address=account_a.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_receiver( - no_role_account: SigningAccount, - account_a: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=no_role_account.address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_suspended_sender( - authority: DAsaAuthority, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - perpetual_bond_client_ongoing.send.account_gov_suspension( - AccountGovSuspensionArgs( - holding_address=account_a.holding_address, - suspended=True, - ), - params=CommonAppCallParams(sender=authority.address), - ) - - with pytest.raises(LogicError, match=err.SUSPENDED): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_suspended_receiver( - authority: DAsaAuthority, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - perpetual_bond_client_ongoing.send.account_gov_suspension( - AccountGovSuspensionArgs( - holding_address=account_b.holding_address, - suspended=True, - ), - params=CommonAppCallParams(sender=authority.address), - ) - - with pytest.raises(LogicError, match=err.SUSPENDED): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_self_transfer() -> None: - pass # TODO - - -def test_fail_null_transfer() -> None: - pass # TODO - - -def test_fail_over_transfer( - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - with pytest.raises(LogicError, match=err.OVER_TRANSFER): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=account_a.units + 1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -@pytest.mark.skip("The PENDING_COUPON_PAYMENT is shadowed by NON_FUNGIBLE_UNITS") -def test_fail_pending_coupon_payment( - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - time_warp(state.issuance_date + state.coupon_period) - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): - perpetual_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_b.holding_address, - receiver_holding_address=account_a.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_b.address), - ) diff --git a/tests/perpetual_bond/test_get_account_units_current_value.py b/tests/perpetual_bond/test_get_account_units_current_value.py deleted file mode 100644 index dd2e3bba..00000000 --- a/tests/perpetual_bond/test_get_account_units_current_value.py +++ /dev/null @@ -1,96 +0,0 @@ -from collections.abc import Callable -from typing import Final - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - GetAccountUnitsCurrentValueArgs, - PayCouponArgs, - PerpetualBondClient, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - -D_ASA_TEST_UNITS: Final[int] = 3 - -# TODO: Add Actual/Actual DDC tests - - -def test_pass_get_account_units_current_value( - currency: Currency, - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_primary: PerpetualBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - state = perpetual_bond_client_primary.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - value = perpetual_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ) - ).abi_return - print("Initial units' value:") - print(value.__dict__) - assert ( - value.units_value == D_ASA_TEST_UNITS * perpetual_bond_cfg.minimum_denomination - ) - assert not value.accrued_interest - - for coupon in range(1, DUE_COUPONS + 1): - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - coupon_period_fraction = 10 - time_warp(coupon_due_date + coupon_period // coupon_period_fraction) - if coupon <= DUE_COUPONS: - perpetual_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - units_value = ( - perpetual_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ) - ).abi_return - ) - print(f"Units' value after {coupon} coupon due date:") - print(units_value.__dict__) - assert ( - value.units_value - == D_ASA_TEST_UNITS * perpetual_bond_cfg.minimum_denomination - ) - if coupon < perpetual_bond_cfg.total_coupons: - assert ( - value.accrued_interest - == value.units_value - * perpetual_bond_cfg.coupon_rates[coupon] - * coupon_period_fraction - // (sc_cst.BPS * coupon_period) - ) - else: - assert not value.accrued_interest - # TODO: validate day count factor - - -def test_fail_no_primary_distribution() -> None: - pass # TODO - - -def test_fail_invalid_holding_address() -> None: - pass # TODO - - -def test_fail_invalid_units() -> None: - pass # TODO - - -def test_fail_pending_coupon_payment() -> None: - pass # TODO diff --git a/tests/perpetual_bond/test_get_coupon_status.py b/tests/perpetual_bond/test_get_coupon_status.py deleted file mode 100644 index 8c0af710..00000000 --- a/tests/perpetual_bond/test_get_coupon_status.py +++ /dev/null @@ -1,78 +0,0 @@ -from collections.abc import Callable -from typing import Final - -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PayCouponArgs, - PerpetualBondClient, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - -D_ASA_TEST_UNITS: Final[int] = 3 - - -def test_pass_get_coupon_status( - currency: Currency, - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_primary: PerpetualBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - state = perpetual_bond_client_primary.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - coupon_status = perpetual_bond_client_primary.send.get_coupons_status().abi_return - print("Initial coupon status:") - print(coupon_status.__dict__) - assert not coupon_status.total_coupons - assert not coupon_status.due_coupons - assert coupon_status.next_coupon_due_date == issuance_date + coupon_period - assert coupon_status.all_due_coupons_paid - assert coupon_status.day_count_factor.numerator == 0 - assert coupon_status.day_count_factor.denominator == 0 - - for coupon in range(1, DUE_COUPONS + 1): - coupon_due_date = issuance_date + coupon_period * coupon - coupon_period_fraction = 10 - time_warp(coupon_due_date + coupon_period // coupon_period_fraction) - - coupon_status = ( - perpetual_bond_client_primary.send.get_coupons_status().abi_return - ) - print(f"Coupon status after {coupon} coupon due date:") - print(coupon_status.__dict__) - assert coupon_status.due_coupons == coupon - assert coupon_status.next_coupon_due_date == coupon_due_date + coupon_period - assert not coupon_status.all_due_coupons_paid - assert ( - coupon_status.day_count_factor.numerator - == coupon_status.day_count_factor.denominator // coupon_period_fraction - ) - - perpetual_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - coupon_status = ( - perpetual_bond_client_primary.send.get_coupons_status().abi_return - ) - print(f"Coupon status after {coupon} coupon payment:") - print(coupon_status.__dict__) - assert coupon_status.due_coupons == coupon - assert coupon_status.next_coupon_due_date == coupon_due_date + coupon_period - assert coupon_status.all_due_coupons_paid - assert ( - coupon_status.day_count_factor.numerator - == coupon_status.day_count_factor.denominator // coupon_period_fraction - ) - - -def test_pass_not_configured( - perpetual_bond_client_empty: PerpetualBondClient, -) -> None: - coupon_status = perpetual_bond_client_empty.send.get_coupons_status().abi_return - print(coupon_status.__dict__) diff --git a/tests/perpetual_bond/test_get_payment_amount.py b/tests/perpetual_bond/test_get_payment_amount.py deleted file mode 100644 index 20cd9581..00000000 --- a/tests/perpetual_bond/test_get_payment_amount.py +++ /dev/null @@ -1,76 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import LogicError, SigningAccount - -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - PayCouponArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - GetPaymentAmountArgs, - PerpetualBondClient, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - -D_ASA_TEST_UNITS: Final[int] = 3 - - -def test_pass_get_coupon_payment_amount( - currency: Currency, - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_primary: PerpetualBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - state = perpetual_bond_client_primary.state.global_state - - print(f"Principal: {account.principal * currency.asa_to_unit:.2f} EUR") - for coupon in range(1, DUE_COUPONS + 1): - payment_amount = perpetual_bond_client_primary.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address) - ).abi_return - coupon_rate_bps = perpetual_bond_cfg.interest_rate - print(f"Coupon rate {coupon}:\t\t{coupon_rate_bps / 100:.2f}%") - print( - f"Coupon amount {coupon}:\t{payment_amount.interest * currency.asa_to_unit:.2f} EUR\n" - ) - assert ( - payment_amount.interest == account.principal * coupon_rate_bps // sc_cst.BPS - ) - assert payment_amount.principal == 0 - - # Coupon reaches due date - coupon_due_date = state.issuance_date + state.coupon_period * coupon - time_warp(coupon_due_date) - perpetual_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - -def test_pass_not_configured( - perpetual_bond_client_empty: PerpetualBondClient, - account_factory: Callable[..., DAsaAccount], -) -> None: - account = account_factory(perpetual_bond_client_empty) - payment_amount = perpetual_bond_client_empty.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address) - ).abi_return - assert payment_amount.interest == 0 - assert payment_amount.principal == 0 - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, perpetual_bond_client_ongoing: PerpetualBondClient -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - perpetual_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=no_role_account.address) - ) diff --git a/tests/perpetual_bond/test_pay_coupon.py b/tests/perpetual_bond/test_pay_coupon.py deleted file mode 100644 index 39969778..00000000 --- a/tests/perpetual_bond/test_pay_coupon.py +++ /dev/null @@ -1,293 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import ( - AlgorandClient, - LogicError, - SigningAccount, -) - -from smart_contracts import errors as err -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - GetPaymentAmountArgs, - PayCouponArgs, - PerpetualBondClient, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - - -def test_pass_pay_coupon( - algorand: AlgorandClient, - currency: Currency, - perpetual_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - account_a_units = account_a.units - account_b_units = account_b.units - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - for coupon in range(1, DUE_COUPONS + 1): - print(f"Coupon {coupon}") - due_coupons = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == coupon - 1 - - # Pre payment sate - pre_payment_account_a_paid_coupons = account_a.paid_coupons - pre_payment_account_b_paid_coupons = account_a.paid_coupons - pre_payment_state = perpetual_bond_client_ongoing.state.global_state - assert pre_payment_account_a_paid_coupons == due_coupons - assert pre_payment_account_b_paid_coupons == due_coupons - assert ( - pre_payment_state.paid_coupon_units - == account_a_units * pre_payment_account_a_paid_coupons - + account_b_units * pre_payment_account_b_paid_coupons - ) - - account_a_coupon_amount = perpetual_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address) - ).abi_return.interest - - account_b_coupon_amount = perpetual_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_b.holding_address) - ).abi_return.interest - - # Coupon reaches due date - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - due_coupons = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == coupon - - # Coupon payment - payment_a = perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ).abi_return - assert payment_a.amount == account_a_coupon_amount - print("Account A:") - print( - f"Paid amount: {payment_a.amount * currency.asa_to_unit:.2f} EUR, Due date: {coupon_due_date}, " - f"Payment timestamp: {payment_a.timestamp}" - ) - - payment_b = perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_b.holding_address, - payment_info=b"", - ) - ).abi_return - assert payment_b.amount == account_b_coupon_amount - print("Account B:") - print( - f"Paid amount: {payment_b.amount * currency.asa_to_unit:.2f} EUR, Due date: {coupon_due_date}, " - f"Payment timestamp: {payment_b.timestamp}\n" - ) - - # Post payment state - post_payment_account_a_paid_coupons = account_a.paid_coupons - post_payment_account_b_paid_coupons = account_b.paid_coupons - post_payment_state = perpetual_bond_client_ongoing.state.global_state - assert ( - post_payment_account_a_paid_coupons - == pre_payment_account_a_paid_coupons + 1 - ) - assert ( - post_payment_account_b_paid_coupons - == pre_payment_account_b_paid_coupons + 1 - ) - assert ( - post_payment_state.paid_coupon_units - == account_a_units * post_payment_account_a_paid_coupons - + account_b_units * post_payment_account_b_paid_coupons - ) - # TODO: assert balance updates - - -def test_pass_pay_multiple_coupons( - currency: Currency, - perpetual_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - account_units = account_a.units - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - time_warp(issuance_date + coupon_period * DUE_COUPONS) - - due_coupons = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == DUE_COUPONS - - for coupon in range(1, DUE_COUPONS + 1): - print(f"Coupon {coupon}") - coupon_amount = perpetual_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address) - ).abi_return.interest - - # Pre payment sate - pre_payment_account_paid_coupons = account_a.paid_coupons - pre_payment_state = perpetual_bond_client_ongoing.state.global_state - assert ( - pre_payment_state.paid_coupon_units - == account_units * pre_payment_account_paid_coupons - ) - - # Coupon payment - coupon_due_date = pre_payment_state.issuance_date + state.coupon_period * coupon - payment = perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ).abi_return - assert payment.amount == coupon_amount - print( - f"Paid amount: {payment.amount * currency.asa_to_unit:.2f} EUR, Due date: {coupon_due_date}, " - f"Payment timestamp: {payment.timestamp}" - ) - - # Post payment state - post_payment_account_paid_coupons = account_a.paid_coupons - post_payment_state = perpetual_bond_client_ongoing.state.global_state - assert post_payment_account_paid_coupons == pre_payment_account_paid_coupons + 1 - assert ( - post_payment_state.paid_coupon_units - == account_units * post_payment_account_paid_coupons - ) - # TODO: assert balance updates - - -def test_pass_skip_suspended_account() -> None: - pass # TODO - - -def test_pass_skip_not_opted_in_account() -> None: - pass # TODO - - -def test_fail_unauthorized() -> None: - pass # TODO - - -def test_fail_unauthorized_status() -> None: - pass # TODO - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended() -> None: - pass # TODO - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, perpetual_bond_client_ongoing: PerpetualBondClient -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=no_role_account.address, - payment_info=b"", - ) - ) - - -def test_fail_no_units( - account_factory: Callable[..., DAsaAccount], - perpetual_bond_client_primary: PerpetualBondClient, -) -> None: - account = account_factory(perpetual_bond_client_primary) - - with pytest.raises(LogicError, match=err.NO_UNITS): - perpetual_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_no_due_coupon( - algorand: AlgorandClient, - perpetual_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - - for coupon in range(1, DUE_COUPONS + 1): - with pytest.raises(LogicError, match=err.NO_DUE_COUPON): - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - coupon_due_date = state.issuance_date + state.coupon_period * coupon - time_warp(coupon_due_date) - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_pending_coupon_payment( - perpetual_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - for coupon in range(1, DUE_COUPONS): - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - if coupon % 2: - first_payee = account_a - second_payee = account_b - else: - first_payee = account_b - second_payee = account_a - - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=first_payee.holding_address, - payment_info=b"", - ) - ) - - coupon_due_date = issuance_date + coupon_period * (coupon + 1) - time_warp(coupon_due_date) - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=first_payee.holding_address, - payment_info=b"", - ) - ) - - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=second_payee.holding_address, - payment_info=b"", - ) - ) diff --git a/tests/perpetual_bond/test_sub_accrued_interest_amount.py b/tests/perpetual_bond/test_sub_accrued_interest_amount.py deleted file mode 100644 index ded9e71f..00000000 --- a/tests/perpetual_bond/test_sub_accrued_interest_amount.py +++ /dev/null @@ -1,107 +0,0 @@ -from typing import Final - -from algokit_utils import AlgorandClient - -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - GetAccountUnitsCurrentValueArgs, - GetPaymentAmountArgs, - PayCouponArgs, - PerpetualBondClient, -) -from tests.utils import Currency, DAsaAccount, get_latest_timestamp, time_warp - -TEST_UNITS: Final[int] = 3 - -# TODO: Add Actual/Actual DDC tests - - -def test_from_issuance( - account_a: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - current_date = get_latest_timestamp( - perpetual_bond_client_ongoing.algorand.client.algod - ) - next_coupon_due_date = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - state = perpetual_bond_client_ongoing.state.global_state - assert current_date == state.issuance_date - - # Coupon accrued half period - half_coupon_period = (next_coupon_due_date - current_date) // 2 - time_warp(current_date + half_coupon_period) - due_coupons = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == 0 - - accrued_interest = ( - perpetual_bond_client_ongoing.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ) - ).abi_return.accrued_interest - ) - - coupon_amount = perpetual_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address) - ).abi_return.interest - assert accrued_interest == coupon_amount // 2 - - -def test_from_latest_coupon_due_date( - currency: Currency, - algorand: AlgorandClient, - account_a: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - first_coupon_due_date = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - time_warp(first_coupon_due_date) - current_date = get_latest_timestamp( - perpetual_bond_client_ongoing.algorand.client.algod - ) - assert current_date == first_coupon_due_date - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - next_coupon_due_date = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - - # Coupon accrued a tenth of period - tenth_coupon_period = (next_coupon_due_date - current_date) // 10 - time_warp(current_date + tenth_coupon_period) - due_coupons = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == 1 - - accrued_interest = ( - perpetual_bond_client_ongoing.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ) - ).abi_return.accrued_interest - ) - - coupon_amount = perpetual_bond_client_ongoing.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account_a.holding_address) - ).abi_return.interest - assert accrued_interest == coupon_amount // 10 - - -def test_on_coupon_due_date() -> None: - pass # TODO: Must be tested directly at subroutine level, not through get_payment_amount - - -def test_fail_pending_coupon_payment() -> None: - pass # TODO diff --git a/tests/perpetual_bond/test_sub_all_due_coupons_paid.py b/tests/perpetual_bond/test_sub_all_due_coupons_paid.py deleted file mode 100644 index e926f32e..00000000 --- a/tests/perpetual_bond/test_sub_all_due_coupons_paid.py +++ /dev/null @@ -1,59 +0,0 @@ -from algokit_utils import AlgorandClient - -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PayCouponArgs, - PerpetualBondClient, -) -from tests.utils import DAsaAccount, DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - - -def test_all_due_coupons_paid( - algorand: AlgorandClient, - perpetual_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - for coupon in range(1, DUE_COUPONS + 1): - all_paid = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert all_paid - - # Coupon reaches due date - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - all_paid = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert not all_paid - - # Coupon payment - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) - - all_paid = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert not all_paid - - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=account_b.holding_address, - payment_info=b"", - ) - ) - all_paid = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.all_due_coupons_paid - ) - assert all_paid diff --git a/tests/perpetual_bond/test_sub_count_due_coupons.py b/tests/perpetual_bond/test_sub_count_due_coupons.py deleted file mode 100644 index d065aa3f..00000000 --- a/tests/perpetual_bond/test_sub_count_due_coupons.py +++ /dev/null @@ -1,37 +0,0 @@ -from algokit_utils import AlgorandClient, SigningAccount - -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PerpetualBondClient, -) -from tests.utils import DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - - -def test_count_due_coupons_before_issuance( - perpetual_bond_client_primary: PerpetualBondClient, -) -> None: - due_coupons = ( - perpetual_bond_client_primary.send.get_coupons_status().abi_return.due_coupons - ) - assert due_coupons == 0 - - -def test_count_due_coupons_ongoing( - algorand: AlgorandClient, - arranger: SigningAccount, - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - for coupon in range(1, DUE_COUPONS + 1): - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - due_coupons = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.due_coupons - ) - print("Due coupons: ", due_coupons) - assert due_coupons == coupon diff --git a/tests/perpetual_bond/test_sub_latest_coupon_date.py b/tests/perpetual_bond/test_sub_latest_coupon_date.py deleted file mode 100644 index 46409041..00000000 --- a/tests/perpetual_bond/test_sub_latest_coupon_date.py +++ /dev/null @@ -1 +0,0 @@ -# TODO diff --git a/tests/perpetual_bond/test_sub_next_coupon_due_date.py b/tests/perpetual_bond/test_sub_next_coupon_due_date.py deleted file mode 100644 index 62bc10ba..00000000 --- a/tests/perpetual_bond/test_sub_next_coupon_due_date.py +++ /dev/null @@ -1,39 +0,0 @@ -from algokit_utils import AlgorandClient, SigningAccount - -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PerpetualBondClient, -) -from tests.utils import DAsaConfig, time_warp - -from .conftest import DUE_COUPONS - -TIME_LEFT_TO_DUE_DATE = 100 # Seconds - - -def test_next_coupon_due_date_before_issuance( - perpetual_bond_client_primary: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_primary.state.global_state - next_coupon_due_date = ( - perpetual_bond_client_primary.send.get_coupons_status().abi_return.next_coupon_due_date - ) - assert next_coupon_due_date == state.issuance_date + state.coupon_period - - -def test_next_coupon_due_date_ongoing( - algorand: AlgorandClient, - arranger: SigningAccount, - perpetual_bond_cfg: DAsaConfig, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - for coupon in range(1, DUE_COUPONS + 1): - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date - TIME_LEFT_TO_DUE_DATE) - next_coupon_due_date = ( - perpetual_bond_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - print("Next coupon due date: ", next_coupon_due_date) - assert next_coupon_due_date == coupon_due_date diff --git a/tests/perpetual_bond/test_update_interest_rate.py b/tests/perpetual_bond/test_update_interest_rate.py deleted file mode 100644 index a9fadd91..00000000 --- a/tests/perpetual_bond/test_update_interest_rate.py +++ /dev/null @@ -1,153 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import ( - AlgorandClient, - CommonAppCallParams, - LogicError, - SigningAccount, -) - -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - PayCouponArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PerpetualBondClient, - UpdateInterestRateArgs, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig, DAsaInterestOracle, time_warp - -from .conftest import DUE_COUPONS - -D_ASA_TEST_UNITS: Final[int] = 3 -INTEREST_RATE_INCREASE: Final[int] = 100 # BPS equal to 1% - - -def test_pass_primary_distribution( - algorand: AlgorandClient, - interest_oracle: DAsaInterestOracle, - perpetual_bond_client_primary: PerpetualBondClient, -) -> None: - interest_rate = perpetual_bond_client_primary.state.global_state.interest_rate - print(f"Interest rate:\t\t{interest_rate / 100:.2f}%") - perpetual_bond_client_primary.send.update_interest_rate( - UpdateInterestRateArgs(interest_rate=interest_rate + INTEREST_RATE_INCREASE), - params=CommonAppCallParams(sender=interest_oracle.address), - ) - updated_interest_rate = ( - perpetual_bond_client_primary.state.global_state.interest_rate - ) - print(f"Interest rate:\t\t{updated_interest_rate / 100:.2f}%") - assert updated_interest_rate == interest_rate + INTEREST_RATE_INCREASE - - -def test_pass_after_issuance( - currency: Currency, - interest_oracle: DAsaInterestOracle, - perpetual_bond_client_primary: PerpetualBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - state = perpetual_bond_client_primary.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - - for coupon in range(1, DUE_COUPONS + 1): - print(f"Interest rate:\t\t{state.interest_rate / 100:.2f}%") - # Coupon reaches due date - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - - # Coupon payment - perpetual_bond_client_primary.send.pay_coupon( - PayCouponArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - # Update interest rate - interest_rate = state.interest_rate - perpetual_bond_client_primary.send.update_interest_rate( - UpdateInterestRateArgs( - interest_rate=interest_rate + INTEREST_RATE_INCREASE - ), - params=CommonAppCallParams(sender=interest_oracle.address), - ) - state = perpetual_bond_client_primary.state.global_state - updated_interest_rate = state.interest_rate - assert updated_interest_rate == interest_rate + INTEREST_RATE_INCREASE - - -def test_fail_unauthorized( - algorand: AlgorandClient, - no_role_account: SigningAccount, - perpetual_bond_client_primary: PerpetualBondClient, -) -> None: - interest_rate = perpetual_bond_client_primary.state.global_state.interest_rate - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - perpetual_bond_client_primary.send.update_interest_rate( - UpdateInterestRateArgs(interest_rate=interest_rate + INTEREST_RATE_INCREASE) - ) - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended() -> None: - pass # TODO - - -def test_fail_pending_coupon_payment( - interest_oracle: DAsaInterestOracle, - perpetual_bond_cfg: DAsaConfig, - account_a: DAsaAccount, - account_b: DAsaAccount, - perpetual_bond_client_ongoing: PerpetualBondClient, -) -> None: - state = perpetual_bond_client_ongoing.state.global_state - issuance_date = state.issuance_date - coupon_period = state.coupon_period - interest_rate = state.interest_rate - - for coupon in range(1, DUE_COUPONS): - coupon_due_date = issuance_date + coupon_period * coupon - time_warp(coupon_due_date) - if coupon % 2: - first_payee = account_a - second_payee = account_b - else: - first_payee = account_b - second_payee = account_a - - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=first_payee.holding_address, - payment_info=b"", - ) - ) - - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): - perpetual_bond_client_ongoing.send.update_interest_rate( - UpdateInterestRateArgs( - interest_rate=interest_rate + INTEREST_RATE_INCREASE - ), - params=CommonAppCallParams(sender=interest_oracle.address), - ) - - perpetual_bond_client_ongoing.send.pay_coupon( - PayCouponArgs( - holding_address=second_payee.holding_address, - payment_info=b"", - ) - ) - - perpetual_bond_client_ongoing.send.update_interest_rate( - UpdateInterestRateArgs( - interest_rate=interest_rate + INTEREST_RATE_INCREASE - ), - params=CommonAppCallParams(sender=interest_oracle.address), - ) diff --git a/tests/sdk/test_contracts.py b/tests/sdk/test_contracts.py new file mode 100644 index 00000000..96d32a88 --- /dev/null +++ b/tests/sdk/test_contracts.py @@ -0,0 +1,553 @@ +"""Tests for the contracts module.""" + +from decimal import Decimal + +import pytest + +from d_asa.contracts import ( + ContractAttributes, + make_pam_fixed_coupon_bond_profile, + make_pam_zero_coupon_bond, +) +from d_asa.day_count import ( + BusinessDayConvention, + Calendar, + DayCountConvention, + EndOfMonthConvention, +) +from d_asa.errors import UnsupportedActusFeatureError +from d_asa.schedule import Cycle + + +class TestContractAttributes: + """Test ContractAttributes dataclass validation and creation.""" + + def test_basic_contract_creation(self): + """Test creating a basic valid contract.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.contract_id == 1 + assert contract.contract_type == "PAM" + assert contract.notional_principal == 1000000 + assert contract.nominal_interest_rate == 0 + + def test_contract_with_interest(self): + """Test creating a contract with interest attributes.""" + contract = ContractAttributes( + contract_id=2, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=10000, + nominal_interest_rate=0.05, + interest_payment_cycle=Cycle(count=3, unit="M"), + interest_payment_anchor=1100000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.nominal_interest_rate == 0.05 + assert contract.premium_discount_at_ied == 10000 + assert contract.interest_payment_cycle.count == 3 + assert contract.interest_payment_cycle.unit == "M" + + def test_contract_with_day_count_conventions(self): + """Test contract with various day count conventions.""" + for dcc in [ + DayCountConvention.A360, + DayCountConvention.A365, + DayCountConvention.AA, + DayCountConvention.THIRTY_E_360, + DayCountConvention.THIRTY_E_360_ISDA, + ]: + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=dcc, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.day_count_convention == dcc + + def test_contract_with_business_day_conventions(self): + """Test contract with supported business day conventions.""" + # Test supported BDC + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.business_day_convention == BusinessDayConvention.NOS + + def test_unsupported_contract_type_raises_error(self): + """Test that unsupported contract types raise an error.""" + with pytest.raises( + UnsupportedActusFeatureError, match="Unsupported ACTUS contract type" + ): + ContractAttributes( + contract_id=1, + contract_type="INVALID", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + def test_unsupported_business_day_convention_raises_error(self): + """Test that unsupported business day conventions raise an error.""" + with pytest.raises( + UnsupportedActusFeatureError, match="Unsupported business day convention" + ): + ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.CSF, # Rejected BDC + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + def test_supported_contract_types(self): + """Test all supported contract types.""" + for contract_type in ["PAM", "LAM", "NAM", "ANN", "LAX", "CLM"]: + contract = ContractAttributes( + contract_id=1, + contract_type=contract_type, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.contract_type == contract_type + + def test_contract_with_subtype_notation(self): + """Test contract with subtype notation like PAM:ZCB.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM:ZCB", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=50000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.contract_type == "PAM:ZCB" + + def test_contract_with_rate_reset_parameters(self): + """Test contract with rate reset parameters.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + rate_reset_spread=0.02, + rate_reset_multiplier=1.5, + rate_reset_floor=0.01, + rate_reset_cap=0.10, + rate_reset_next=0.05, + rate_reset_cycle=Cycle(count=6, unit="M"), + rate_reset_anchor=1200000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.rate_reset_spread == 0.02 + assert contract.rate_reset_multiplier == 1.5 + assert contract.rate_reset_floor == 0.01 + assert contract.rate_reset_cap == 0.10 + assert contract.rate_reset_next == 0.05 + + def test_contract_with_principal_redemption(self): + """Test contract with principal redemption parameters.""" + contract = ContractAttributes( + contract_id=1, + contract_type="LAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + next_principal_redemption_amount=100000, + principal_redemption_cycle=Cycle(count=1, unit="Q"), + principal_redemption_anchor=1200000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.next_principal_redemption_amount == 100000 + assert contract.principal_redemption_cycle.count == 1 + assert contract.principal_redemption_cycle.unit == "Q" + + def test_contract_with_decimal_values(self): + """Test contract with Decimal values for high precision.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=Decimal("1000000.00"), + premium_discount_at_ied=Decimal("5000.50"), + nominal_interest_rate=Decimal("0.0375"), + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.notional_principal == Decimal("1000000.00") + assert contract.premium_discount_at_ied == Decimal("5000.50") + assert contract.nominal_interest_rate == Decimal("0.0375") + + def test_contract_with_lax_arrays(self): + """Test LAX contract with array schedules.""" + contract = ContractAttributes( + contract_id=1, + contract_type="LAX", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + array_pr_anchor=[1200000, 1300000, 1400000], + array_pr_cycle=[Cycle(1, "M"), Cycle(1, "M"), Cycle(1, "M")], + array_pr_next=[10000, 20000, 30000], + array_increase_decrease=["DEC", "DEC", "DEC"], + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert len(contract.array_pr_anchor) == 3 + assert len(contract.array_pr_cycle) == 3 + assert len(contract.array_pr_next) == 3 + assert len(contract.array_increase_decrease) == 3 + + +class TestMakePamZeroCouponBond: + """Test the make_pam_zero_coupon_bond helper function.""" + + def test_basic_zero_coupon_bond(self): + """Test creating a basic zero coupon bond.""" + contract = make_pam_zero_coupon_bond( + contract_id=100, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=50000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.contract_id == 100 + assert contract.contract_type == "PAM:ZCB" + assert contract.notional_principal == 1000000 + assert contract.premium_discount_at_ied == 50000 + assert contract.nominal_interest_rate == 0 + assert contract.maturity_date == 2000000 + + def test_zero_coupon_bond_with_custom_conventions(self): + """Test ZCB with custom day count and business day conventions.""" + contract = make_pam_zero_coupon_bond( + contract_id=101, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=500000, + premium_discount_at_ied=25000, + day_count_convention=DayCountConvention.AA, + business_day_convention=BusinessDayConvention.SCF, + end_of_month_convention=EndOfMonthConvention.EOM, + calendar=Calendar.MF, + ) + assert contract.day_count_convention == DayCountConvention.AA + assert contract.business_day_convention == BusinessDayConvention.SCF + assert contract.end_of_month_convention == EndOfMonthConvention.EOM + assert contract.calendar == Calendar.MF + + def test_zero_coupon_bond_with_no_discount(self): + """Test ZCB with no premium/discount (at par).""" + contract = make_pam_zero_coupon_bond( + contract_id=102, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.premium_discount_at_ied == 0 + + def test_zero_coupon_bond_with_float_values(self): + """Test ZCB with float values.""" + contract = make_pam_zero_coupon_bond( + contract_id=103, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000.0, + premium_discount_at_ied=75000.5, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.notional_principal == 1000000.0 + assert contract.premium_discount_at_ied == 75000.5 + + +class TestMakePamFixedCouponBondProfile: + """Test the make_pam_fixed_coupon_bond_profile helper function.""" + + def test_basic_fixed_coupon_bond(self): + """Test creating a basic fixed coupon bond.""" + contract = make_pam_fixed_coupon_bond_profile( + contract_id=200, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + nominal_interest_rate=0.05, + interest_payment_cycle=Cycle(count=6, unit="M"), + interest_payment_anchor=1100000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.contract_id == 200 + assert contract.contract_type == "PAM:FCB" + assert contract.notional_principal == 1000000 + assert contract.nominal_interest_rate == 0.05 + assert contract.interest_payment_cycle.count == 6 + assert contract.interest_payment_cycle.unit == "M" + assert contract.interest_payment_anchor == 1100000 + + def test_fixed_coupon_bond_quarterly_payments(self): + """Test FCB with quarterly interest payments.""" + contract = make_pam_fixed_coupon_bond_profile( + contract_id=201, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=2000000, + nominal_interest_rate=0.04, + interest_payment_cycle=Cycle(count=1, unit="Q"), + interest_payment_anchor=1100000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.interest_payment_cycle.count == 1 + assert contract.interest_payment_cycle.unit == "Q" + assert contract.nominal_interest_rate == 0.04 + + def test_fixed_coupon_bond_with_custom_conventions(self): + """Test FCB with custom conventions.""" + contract = make_pam_fixed_coupon_bond_profile( + contract_id=202, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1500000, + nominal_interest_rate=0.035, + interest_payment_cycle=Cycle(count=1, unit="Y"), + interest_payment_anchor=1100000, + day_count_convention=DayCountConvention.THIRTY_E_360, + business_day_convention=BusinessDayConvention.SCMF, + end_of_month_convention=EndOfMonthConvention.EOM, + calendar=Calendar.MF, + ) + assert contract.day_count_convention == DayCountConvention.THIRTY_E_360 + assert contract.business_day_convention == BusinessDayConvention.SCMF + assert contract.end_of_month_convention == EndOfMonthConvention.EOM + assert contract.calendar == Calendar.MF + + def test_fixed_coupon_bond_with_decimal_rate(self): + """Test FCB with Decimal interest rate.""" + contract = make_pam_fixed_coupon_bond_profile( + contract_id=203, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=Decimal("1000000"), + nominal_interest_rate=Decimal("0.0425"), + interest_payment_cycle=Cycle(count=3, unit="M"), + interest_payment_anchor=1100000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.nominal_interest_rate == Decimal("0.0425") + + def test_fixed_coupon_bond_monthly_payments(self): + """Test FCB with monthly interest payments.""" + contract = make_pam_fixed_coupon_bond_profile( + contract_id=204, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=750000, + nominal_interest_rate=0.06, + interest_payment_cycle=Cycle(count=1, unit="M"), + interest_payment_anchor=1100000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.interest_payment_cycle.count == 1 + assert contract.interest_payment_cycle.unit == "M" + assert contract.nominal_interest_rate == 0.06 + + +class TestContractAttributesDefaults: + """Test default values for ContractAttributes.""" + + def test_default_interest_values(self): + """Test that interest-related defaults are correct.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.nominal_interest_rate == 0 + assert contract.rate_reset_spread == 0 + assert contract.rate_reset_multiplier == 1 + assert contract.rate_reset_floor == 0 + assert contract.rate_reset_cap == 0 + + def test_default_conventions(self): + """Test that convention defaults are correct.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.day_count_convention == DayCountConvention.A360 + assert contract.business_day_convention == BusinessDayConvention.NOS + assert contract.end_of_month_convention == EndOfMonthConvention.SD + assert contract.calendar == Calendar.NC + + def test_default_optional_fields(self): + """Test that optional fields default to None.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + assert contract.principal_redemption_cycle is None + assert contract.principal_redemption_anchor is None + assert contract.interest_payment_anchor is None + assert contract.interest_payment_cycle is None + assert contract.rate_reset_next is None + assert contract.array_pr_anchor is None + assert contract.array_pr_cycle is None + assert contract.array_pr_next is None + assert contract.array_increase_decrease is None + + +class TestContractImmutability: + """Test that ContractAttributes is immutable (frozen=True).""" + + def test_contract_is_frozen(self): + """Test that contract attributes cannot be modified after creation.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + with pytest.raises(AttributeError): + contract.contract_id = 2 + with pytest.raises(AttributeError): + contract.notional_principal = 2000000 diff --git a/tests/sdk/test_dasa.py b/tests/sdk/test_dasa.py new file mode 100644 index 00000000..9b64e444 --- /dev/null +++ b/tests/sdk/test_dasa.py @@ -0,0 +1,543 @@ +from __future__ import annotations + +import tomllib +from dataclasses import dataclass +from decimal import Decimal +from pathlib import Path +from types import SimpleNamespace + +from algosdk.constants import ZERO_ADDRESS + +from d_asa import ( + DAsa, + DAsaRole, + PricingContext, + RoleValidityWindow, + TradeQuoteInput, + make_pam_zero_coupon_bond, + normalize_contract_attributes, +) +from d_asa.models import AccountPosition +from smart_contracts import constants as cst +from smart_contracts import enums + + +@dataclass(frozen=True, slots=True) +class DummyTransaction: + kind: str + params: object + + +class FakeMap: + def __init__(self, values: dict[object, object] | None = None) -> None: + self._values = values or {} + + def get_value(self, key: object) -> object | None: + return self._values.get(key) + + +class FakeComposer: + def __init__(self) -> None: + self.steps: list[tuple[str, object, object | None]] = [] + + def add_transaction( + self, txn: object, signer: object | None = None + ) -> FakeComposer: + self.steps.append(("add_transaction", txn, signer)) + return self + + def transfer(self, args: object) -> FakeComposer: + self.steps.append(("transfer", args, None)) + return self + + def send(self, send_params: object | None = None) -> dict[str, object]: + return {"send_params": send_params, "steps": self.steps} + + def simulate(self, **kwargs: object) -> dict[str, object]: + return {"kwargs": kwargs, "steps": self.steps} + + +class FakeCreateTransaction: + def payment(self, params: object) -> DummyTransaction: + return DummyTransaction(kind="payment", params=params) + + def asset_transfer(self, params: object) -> DummyTransaction: + return DummyTransaction(kind="asset_transfer", params=params) + + +class FakeAlgod: + def __init__(self, timestamp: int) -> None: + self._timestamp = timestamp + + def status(self) -> dict[str, int]: + return {"last-round": 1} + + def block_info(self, round_number: int) -> dict[str, object]: + assert round_number == 1 + return {"block": {"ts": self._timestamp}} + + +class FakeAlgorand: + def __init__(self, timestamp: int) -> None: + self.client = SimpleNamespace(algod=FakeAlgod(timestamp)) + self.create_transaction = FakeCreateTransaction() + self.send = SimpleNamespace(payment=lambda params: params) + + +class FakeSend: + def __init__(self) -> None: + self.calls: list[tuple[str, object, object | None, object | None]] = [] + self.contract_schedule_returns: list[int] = [] + + def contract_config( + self, + args: object, + params: object | None = None, + send_params: object | None = None, + ) -> SimpleNamespace: + self.calls.append(("contract_config", args, params, send_params)) + return SimpleNamespace(abi_return=111) + + def contract_schedule( + self, + args: object, + params: object | None = None, + send_params: object | None = None, + ) -> SimpleNamespace: + self.calls.append(("contract_schedule", args, params, send_params)) + value = 200 + len( + [call for call in self.calls if call[0] == "contract_schedule"] + ) + self.contract_schedule_returns.append(value) + return SimpleNamespace(abi_return=value) + + +class FakeClient: + def __init__( + self, + *, + timestamp: int, + global_state: SimpleNamespace, + account_positions: dict[str, object] | None = None, + schedule_pages: dict[int, object] | None = None, + role_maps: dict[str, dict[str, object]] | None = None, + send: FakeSend | None = None, + app_id: int = 7, + app_address: str = "APP_ADDRESS", + default_sender: str | None = None, + default_signer: object | None = None, + ) -> None: + role_maps = role_maps or {} + self.algorand = FakeAlgorand(timestamp) + self.app_id = app_id + self.app_address = app_address + self._default_sender = default_sender + self._default_signer = default_signer + self._send = send or FakeSend() + self.state = SimpleNamespace( + global_state=global_state, + box=SimpleNamespace( + account=FakeMap(account_positions), + schedule_page=FakeMap(schedule_pages), + account_manager=FakeMap(role_maps.get("account_manager")), + primary_dealer=FakeMap(role_maps.get("primary_dealer")), + trustee=FakeMap(role_maps.get("trustee")), + authority=FakeMap(role_maps.get("authority")), + observer=FakeMap(role_maps.get("observer")), + ), + ) + self.send = self._send + + def clone( + self, + *, + default_sender: str | None = None, + default_signer: object | None = None, + **_: object, + ) -> FakeClient: + return FakeClient( + timestamp=self.algorand.client.algod._timestamp, + global_state=self.state.global_state, + account_positions=self.state.box.account._values, + schedule_pages=self.state.box.schedule_page._values, + role_maps={ + "account_manager": self.state.box.account_manager._values, + "primary_dealer": self.state.box.primary_dealer._values, + "trustee": self.state.box.trustee._values, + "authority": self.state.box.authority._values, + "observer": self.state.box.observer._values, + }, + send=self._send, + app_id=self.app_id, + app_address=self.app_address, + default_sender=default_sender, + default_signer=default_signer, + ) + + def new_group(self) -> FakeComposer: + return FakeComposer() + + +def _global_state(**overrides: object) -> SimpleNamespace: + defaults = { + "arranger": "ARRANGER", + "op_daemon": ZERO_ADDRESS, + "contract_suspended": 0, + "defaulted": 0, + "status": enums.STATUS_ACTIVE, + "contract_type": enums.CT_PAM, + "denomination_asset_id": 1, + "settlement_asset_id": 1, + "initial_exchange_date": 1_700_000_000, + "maturity_date": 1_800_000_000, + "transfer_opening_date": 0, + "transfer_closure_date": 0, + "day_count_convention": enums.DCC_A360, + "total_units": 100, + "reserved_units_total": 0, + "initial_exchange_amount": 10_000, + "outstanding_principal": 10_000, + "next_principal_redemption": 0, + "dynamic_principal_redemption": 0, + "interest_calculation_base": 10_000, + "accrued_interest": 0, + "nominal_interest_rate": 0, + "rate_reset_spread": 0, + "rate_reset_multiplier": cst.FIXED_POINT_SCALE, + "rate_reset_floor": 0, + "rate_reset_cap": 0, + "rate_reset_next": 0, + "has_rate_reset_floor": 0, + "has_rate_reset_cap": 0, + "reserved_principal": 0, + "reserved_interest": 0, + "cumulative_interest_index": 0, + "cumulative_principal_index": 0, + "event_cursor": 1, + "schedule_entry_count": 2, + "fixed_point_scale": cst.FIXED_POINT_SCALE, + } + defaults.update(overrides) + return SimpleNamespace(**defaults) + + +def _schedule_entry( + event_id: int, + event_type: int, + scheduled_time: int, + accrual_factor: int = 0, +) -> tuple[int, int, int, int, int, int, int, int, int]: + return (event_id, event_type, scheduled_time, accrual_factor, 0, 0, 0, 0, 0) + + +def test_root_exports_include_high_level_surface() -> None: + import d_asa + + assert d_asa.DAsa is DAsa + assert d_asa.make_pam_zero_coupon_bond is make_pam_zero_coupon_bond + assert d_asa.normalize_contract_attributes is normalize_contract_attributes + assert d_asa.constants.DAY_2_SEC == cst.DAY_2_SEC + assert d_asa.enums.CT_PAM == enums.CT_PAM + assert not hasattr(d_asa, "dasa_client") + assert not hasattr(d_asa, "dasa_avm_client") + + +def test_actualized_position_activates_reserved_units_and_settles_indices() -> None: + client = FakeClient( + timestamp=1_700_000_100, + global_state=_global_state( + cumulative_interest_index=105, + cumulative_principal_index=207, + event_cursor=4, + fixed_point_scale=100, + ), + account_positions={ + "INVESTOR": AccountPosition( + units=0, + reserved_units=10, + payment_address="INVESTOR", + suspended=False, + settled_cursor=0, + interest_checkpoint=5, + principal_checkpoint=7, + claimable_interest=2, + claimable_principal=3, + ) + }, + schedule_pages={0: [_schedule_entry(0, enums.EVT_IED, 1_700_000_000)]}, + ) + + position = ( + DAsa.from_client(client) + .account(SimpleNamespace(address="INVESTOR", signer=object())) + .get_actualized_position() + ) + + assert position.units == 10 + assert position.reserved_units == 0 + assert position.claimable_interest == 12 + assert position.claimable_principal == 23 + assert position.settled_cursor == 4 + assert position.interest_checkpoint == 105 + assert position.principal_checkpoint == 207 + + +def test_quote_trade_adds_mid_period_accrual_and_dirty_price() -> None: + start = 1_700_000_000 + valuation_time = start + 90 * cst.DAY_2_SEC + client = FakeClient( + timestamp=valuation_time, + global_state=_global_state( + accrued_interest=200, + nominal_interest_rate=100_000_000, + event_cursor=1, + schedule_entry_count=2, + ), + account_positions={ + "INVESTOR": AccountPosition( + units=20, + reserved_units=0, + payment_address="INVESTOR", + suspended=False, + settled_cursor=1, + interest_checkpoint=0, + principal_checkpoint=0, + claimable_interest=15, + claimable_principal=25, + ) + }, + schedule_pages={ + 0: [ + _schedule_entry(0, enums.EVT_IED, start), + _schedule_entry(1, enums.EVT_IP, start + 180 * cst.DAY_2_SEC), + ] + }, + ) + app = DAsa.from_client( + client, pricing_context=PricingContext(notional_unit_value=100) + ) + quote = app.account( + SimpleNamespace(address="INVESTOR", signer=object()) + ).quote_trade( + 20, + clean_quote=TradeQuoteInput(clean_price_per_100=Decimal("99.50")), + ) + + assert quote.principal_share_total == 2_000 + assert quote.accrued_interest_not_due_total == 90 + assert quote.par_reference_dirty_total == 2_090 + assert quote.seller_retained_claimable_interest == 15 + assert quote.seller_retained_claimable_principal == 25 + assert quote.market_clean_total == Decimal("1990.00") + assert quote.market_dirty_total == Decimal("2080.00") + + +def test_quote_trade_rejects_due_event() -> None: + due_time = 1_700_000_000 + client = FakeClient( + timestamp=due_time, + global_state=_global_state(event_cursor=1, schedule_entry_count=2), + account_positions={ + "INVESTOR": AccountPosition( + units=10, + reserved_units=0, + payment_address="INVESTOR", + suspended=False, + settled_cursor=1, + interest_checkpoint=0, + principal_checkpoint=0, + claimable_interest=0, + claimable_principal=0, + ) + }, + schedule_pages={ + 0: [ + _schedule_entry(0, enums.EVT_IED, due_time - cst.DAY_2_SEC), + _schedule_entry(1, enums.EVT_IP, due_time), + ] + }, + ) + holding = DAsa.from_client(client).account( + SimpleNamespace(address="INVESTOR", signer=object()) + ) + + try: + holding.quote_trade(1) + except ValueError as exc: + assert "due ACTUS event is pending" in str(exc) + else: # pragma: no cover - defensive + raise AssertionError("expected quote_trade to reject a pending due event") + + +def test_build_otc_dvp_supports_algo_and_asa_payment_legs() -> None: + timestamp = 1_700_000_100 + client = FakeClient( + timestamp=timestamp, + global_state=_global_state( + accrued_interest=200, + nominal_interest_rate=100_000_000, + event_cursor=1, + schedule_entry_count=2, + ), + account_positions={ + "SELLER": AccountPosition( + units=20, + reserved_units=0, + payment_address="SELLER", + suspended=False, + settled_cursor=1, + interest_checkpoint=0, + principal_checkpoint=0, + claimable_interest=0, + claimable_principal=0, + ) + }, + schedule_pages={ + 0: [ + _schedule_entry(0, enums.EVT_IED, timestamp - cst.DAY_2_SEC), + _schedule_entry(1, enums.EVT_IP, timestamp + 90 * cst.DAY_2_SEC), + ] + }, + ) + app = DAsa.from_client(client) + seller = SimpleNamespace(address="SELLER", signer=object()) + buyer = SimpleNamespace(address="BUYER", signer=object()) + + algo_draft = app.account(seller).build_otc_dvp( + buyer=buyer, + units=5, + payment_amount=1_000, + ) + asa_draft = app.account(seller).build_otc_dvp( + buyer=buyer, + units=5, + payment_amount=2_000, + payment_asset_id=77, + ) + + assert algo_draft.payment_transaction.kind == "payment" + assert asa_draft.payment_transaction.kind == "asset_transfer" + assert algo_draft.composer.steps[0][0] == "add_transaction" + assert algo_draft.composer.steps[1][0] == "transfer" + transfer_args = algo_draft.composer.steps[1][1] + assert transfer_args.sender_holding_address == "SELLER" + assert transfer_args.receiver_holding_address == "BUYER" + assert transfer_args.units == 5 + + +def test_arranger_configure_contract_uses_mappers_and_updates_pricing_context() -> None: + normalized = normalize_contract_attributes( + make_pam_zero_coupon_bond( + contract_id=1, + status_date=1_700_000_000, + initial_exchange_date=1_700_000_000 + 30 * cst.DAY_2_SEC, + maturity_date=1_700_000_000 + 365 * cst.DAY_2_SEC, + notional_principal=10_000, + premium_discount_at_ied=0, + ), + denomination_asset_id=1, + denomination_asset_decimals=2, + notional_unit_value=100, + secondary_market_opening_date=1_700_000_000 + 30 * cst.DAY_2_SEC, + secondary_market_closure_date=1_700_000_000 + 366 * cst.DAY_2_SEC, + ) + fake_send = FakeSend() + client = FakeClient( + timestamp=1_700_000_000, + global_state=_global_state( + status=enums.STATUS_INACTIVE, event_cursor=0, schedule_entry_count=0 + ), + send=fake_send, + ) + app = DAsa.from_client(client) + arranger = SimpleNamespace(address="ARRANGER", signer=object()) + + result = app.arranger(arranger).configure_contract( + normalized=normalized, + prospectus_url="prospectus", + ) + + assert result == normalized + assert app.pricing_context == PricingContext( + notional_unit_value=normalized.terms.notional_unit_value + ) + assert [call[0] for call in fake_send.calls] == [ + "contract_config", + "contract_schedule", + ] + + +def test_pyproject_runtime_dependencies_only_keep_algokit_utils() -> None: + pyproject = Path(__file__).resolve().parents[2] / "pyproject.toml" + parsed = tomllib.loads(pyproject.read_text()) + project = parsed["project"] + tool_poetry = parsed["tool"]["poetry"] + dev_dependencies = tool_poetry["group"]["dev"]["dependencies"] + + assert "algokit-utils>=4.2.3,<5.0.0" in project["dependencies"] + assert all("python-dotenv" not in dep for dep in project["dependencies"]) + assert all("algorand-python" not in dep for dep in project["dependencies"]) + assert "python-dotenv" in dev_dependencies + assert tool_poetry["packages"] == [ + {"include": "d_asa", "from": "src"}, + ] + + +def test_contract_view_role_helpers_resolve_active_roles() -> None: + timestamp = 1_700_000_000 + client = FakeClient( + timestamp=timestamp, + global_state=_global_state(op_daemon="OP_DAEMON"), + role_maps={ + "account_manager": { + "MANAGER": SimpleNamespace( + role_validity_start=0, + role_validity_end=2**64 - 1, + ) + } + }, + ) + roles = DAsa.from_client(client).contract.get_address_roles("MANAGER") + + assert roles.account_manager is True + assert roles.arranger is False + assert roles.op_daemon is False + assert DAsa.from_client(client).contract.get_role_validity( + DAsaRole.ACCOUNT_MANAGER, + "MANAGER", + ) == RoleValidityWindow(0, 2**64 - 1) + + +def test_contract_view_get_address_roles_at_time_zero() -> None: + """Test that get_address_roles correctly uses timestamp 0 when at_time=0 is passed.""" + # Current timestamp is much later than 0 + current_timestamp = 1_700_000_000 + + client = FakeClient( + timestamp=current_timestamp, + global_state=_global_state(op_daemon="OP_DAEMON"), + role_maps={ + "account_manager": { + "MANAGER": SimpleNamespace( + # Role is only valid from timestamp 1000 onwards + role_validity_start=1000, + role_validity_end=2**64 - 1, + ) + } + }, + ) + + contract_view = DAsa.from_client(client).contract + + # When checking roles at current time, the role should be active (1000 < current_timestamp) + roles_now = contract_view.get_address_roles("MANAGER") + assert roles_now.account_manager is True + + # When checking roles at timestamp 0, the role should NOT be active (0 < 1000) + # This tests the edge case where at_time=0 should use 0, not fall back to current timestamp + roles_at_zero = contract_view.get_address_roles("MANAGER", at_time=0) + assert roles_at_zero.account_manager is False + + # When checking roles at timestamp 1000, the role should be active (exactly at start) + roles_at_start = contract_view.get_address_roles("MANAGER", at_time=1000) + assert roles_at_start.account_manager is True diff --git a/tests/sdk/test_day_count.py b/tests/sdk/test_day_count.py new file mode 100644 index 00000000..9be9a568 --- /dev/null +++ b/tests/sdk/test_day_count.py @@ -0,0 +1,394 @@ +"""Tests for d_asa.day_count module.""" + +from __future__ import annotations + +from datetime import UTC, datetime + +from d_asa.day_count import ( + BusinessDayConvention, + Calendar, + EndOfMonthConvention, + adjust_to_business_day, + is_business_day, + is_calculate_shift, + is_end_of_month, + is_shift_calculate, +) +from d_asa.unix_time import datetime_to_timestamp + + +class TestCalendarEnum: + """Test Calendar enum.""" + + def test_has_no_calendar_value(self) -> None: + """Test NO_CALENDAR constant exists.""" + assert Calendar.NO_CALENDAR is not None + assert Calendar.NC == Calendar.NO_CALENDAR + + def test_has_monday_to_friday_value(self) -> None: + """Test MONDAY_TO_FRIDAY constant exists.""" + assert Calendar.MONDAY_TO_FRIDAY is not None + assert Calendar.MF == Calendar.MONDAY_TO_FRIDAY + + def test_enum_values_are_integers(self) -> None: + """Test Calendar enum values are integers.""" + assert isinstance(Calendar.NO_CALENDAR, int) + assert isinstance(Calendar.MONDAY_TO_FRIDAY, int) + + +class TestEndOfMonthConventionEnum: + """Test EndOfMonthConvention enum.""" + + def test_has_same_day_value(self) -> None: + """Test SAME_DAY constant exists.""" + assert EndOfMonthConvention.SAME_DAY is not None + assert EndOfMonthConvention.SD == EndOfMonthConvention.SAME_DAY + + def test_has_end_of_month_value(self) -> None: + """Test END_OF_MONTH constant exists.""" + assert EndOfMonthConvention.END_OF_MONTH is not None + assert EndOfMonthConvention.EOM == EndOfMonthConvention.END_OF_MONTH + + def test_enum_values_are_integers(self) -> None: + """Test EndOfMonthConvention enum values are integers.""" + assert isinstance(EndOfMonthConvention.SAME_DAY, int) + assert isinstance(EndOfMonthConvention.END_OF_MONTH, int) + + +class TestBusinessDayConventionEnum: + """Test BusinessDayConvention enum.""" + + def test_has_no_shift_value(self) -> None: + """Test NO_SHIFT constant exists.""" + assert BusinessDayConvention.NO_SHIFT is not None + assert BusinessDayConvention.NOS == BusinessDayConvention.NO_SHIFT + + def test_has_all_conventions(self) -> None: + """Test all business day conventions exist.""" + expected = [ + "NO_SHIFT", + "SHIFT_CALCULATE_FOLLOWING", + "SHIFT_CALCULATE_MODIFIED_FOLLOWING", + "CALCULATE_SHIFT_FOLLOWING", + "CALCULATE_SHIFT_MODIFIED_FOLLOWING", + "SHIFT_CALCULATE_PRECEDING", + "SHIFT_CALCULATE_MODIFIED_PRECEDING", + "CALCULATE_SHIFT_PRECEDING", + "CALCULATE_SHIFT_MODIFIED_PRECEDING", + ] + for name in expected: + assert hasattr(BusinessDayConvention, name) + + def test_aliases_match_full_names(self) -> None: + """Test that aliases match full names.""" + aliases = { + "NOS": "NO_SHIFT", + "SCF": "SHIFT_CALCULATE_FOLLOWING", + "SCMF": "SHIFT_CALCULATE_MODIFIED_FOLLOWING", + "CSF": "CALCULATE_SHIFT_FOLLOWING", + "CSMF": "CALCULATE_SHIFT_MODIFIED_FOLLOWING", + "SCP": "SHIFT_CALCULATE_PRECEDING", + "SCMP": "SHIFT_CALCULATE_MODIFIED_PRECEDING", + "CSP": "CALCULATE_SHIFT_PRECEDING", + "CSMP": "CALCULATE_SHIFT_MODIFIED_PRECEDING", + } + for alias, full_name in aliases.items(): + assert getattr(BusinessDayConvention, alias) == getattr( + BusinessDayConvention, full_name + ) + + +class TestIsEndOfMonth: + """Test is_end_of_month function.""" + + def test_recognizes_january_31(self) -> None: + """Test January 31 is end of month.""" + dt = datetime(2024, 1, 31, 12, 0, 0) + assert is_end_of_month(dt) is True + + def test_recognizes_february_29_leap_year(self) -> None: + """Test Feb 29 is end of month in leap year.""" + dt = datetime(2024, 2, 29, 12, 0, 0) + assert is_end_of_month(dt) is True + + def test_recognizes_february_28_non_leap_year(self) -> None: + """Test Feb 28 is end of month in non-leap year.""" + dt = datetime(2023, 2, 28, 12, 0, 0) + assert is_end_of_month(dt) is True + + def test_february_28_not_end_in_leap_year(self) -> None: + """Test Feb 28 is NOT end of month in leap year.""" + dt = datetime(2024, 2, 28, 12, 0, 0) + assert is_end_of_month(dt) is False + + def test_recognizes_april_30(self) -> None: + """Test April 30 is end of month (30-day month).""" + dt = datetime(2024, 4, 30, 12, 0, 0) + assert is_end_of_month(dt) is True + + def test_april_29_not_end_of_month(self) -> None: + """Test April 29 is not end of month.""" + dt = datetime(2024, 4, 29, 12, 0, 0) + assert is_end_of_month(dt) is False + + def test_recognizes_december_31(self) -> None: + """Test December 31 is end of month.""" + dt = datetime(2024, 12, 31, 12, 0, 0) + assert is_end_of_month(dt) is True + + def test_january_15_not_end_of_month(self) -> None: + """Test mid-month date is not end of month.""" + dt = datetime(2024, 1, 15, 12, 0, 0) + assert is_end_of_month(dt) is False + + def test_all_months_last_days(self) -> None: + """Test last day detection for all months.""" + # 2024 is a leap year + month_last_days = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + for month, last_day in enumerate(month_last_days, start=1): + dt = datetime(2024, month, last_day, 12, 0, 0) + assert is_end_of_month(dt) is True, f"Failed for month {month}" + + +class TestIsBusinessDay: + """Test is_business_day function.""" + + def test_no_calendar_all_days_are_business_days(self) -> None: + """Test with NO_CALENDAR, all days are business days.""" + # Monday 2024-01-15 + monday = datetime_to_timestamp(datetime(2024, 1, 15, 12, 0, 0, tzinfo=UTC)) + # Saturday 2024-01-20 + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) + # Sunday 2024-01-21 + sunday = datetime_to_timestamp(datetime(2024, 1, 21, 12, 0, 0, tzinfo=UTC)) + + assert is_business_day(monday, Calendar.NO_CALENDAR) is True + assert is_business_day(saturday, Calendar.NO_CALENDAR) is True + assert is_business_day(sunday, Calendar.NO_CALENDAR) is True + + def test_monday_to_friday_weekdays_are_business_days(self) -> None: + """Test with MONDAY_TO_FRIDAY, weekdays are business days.""" + # Week of 2024-01-15 (Monday) to 2024-01-19 (Friday) + for day in range(15, 20): + timestamp = datetime_to_timestamp( + datetime(2024, 1, day, 12, 0, 0, tzinfo=UTC) + ) + assert is_business_day(timestamp, Calendar.MONDAY_TO_FRIDAY) is True + + def test_monday_to_friday_weekends_are_not_business_days(self) -> None: + """Test with MONDAY_TO_FRIDAY, weekends are not business days.""" + # Saturday 2024-01-20 + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) + # Sunday 2024-01-21 + sunday = datetime_to_timestamp(datetime(2024, 1, 21, 12, 0, 0, tzinfo=UTC)) + + assert is_business_day(saturday, Calendar.MONDAY_TO_FRIDAY) is False + assert is_business_day(sunday, Calendar.MONDAY_TO_FRIDAY) is False + + def test_default_calendar_is_no_calendar(self) -> None: + """Test default calendar parameter is NO_CALENDAR.""" + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) + assert is_business_day(saturday) is True + + +class TestAdjustToBusinessDay: + """Test adjust_to_business_day function.""" + + def test_no_shift_returns_original(self) -> None: + """Test NO_SHIFT returns timestamp unchanged.""" + # Saturday 2024-01-20 + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) + result = adjust_to_business_day( + saturday, + business_day_convention=BusinessDayConvention.NO_SHIFT, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == saturday + + def test_business_day_unchanged(self) -> None: + """Test business day returns unchanged for any convention.""" + # Monday 2024-01-15 + monday = datetime_to_timestamp(datetime(2024, 1, 15, 12, 0, 0, tzinfo=UTC)) + conventions = [ + BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_PRECEDING, + ] + for convention in conventions: + result = adjust_to_business_day( + monday, + business_day_convention=convention, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == monday + + def test_shift_calculate_following_shifts_forward(self) -> None: + """Test SCF shifts Saturday to next Monday.""" + # Saturday 2024-01-20 + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) + # Expected: Monday 2024-01-22 + expected_monday = datetime_to_timestamp( + datetime(2024, 1, 22, 12, 0, 0, tzinfo=UTC) + ) + + result = adjust_to_business_day( + saturday, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected_monday + + def test_calculate_shift_following_shifts_forward(self) -> None: + """Test CSF shifts Saturday to next Monday.""" + # Saturday 2024-01-20 + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) + # Expected: Monday 2024-01-22 + expected_monday = datetime_to_timestamp( + datetime(2024, 1, 22, 12, 0, 0, tzinfo=UTC) + ) + + result = adjust_to_business_day( + saturday, + business_day_convention=BusinessDayConvention.CALCULATE_SHIFT_FOLLOWING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected_monday + + def test_shift_calculate_preceding_shifts_backward(self) -> None: + """Test SCP shifts Saturday to previous Friday.""" + # Saturday 2024-01-20 + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) + # Expected: Friday 2024-01-19 + expected_friday = datetime_to_timestamp( + datetime(2024, 1, 19, 12, 0, 0, tzinfo=UTC) + ) + + result = adjust_to_business_day( + saturday, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected_friday + + def test_calculate_shift_preceding_shifts_backward(self) -> None: + """Test CSP shifts Saturday to previous Friday.""" + # Saturday 2024-01-20 + saturday = datetime_to_timestamp(datetime(2024, 1, 20, 12, 0, 0, tzinfo=UTC)) + # Expected: Friday 2024-01-19 + expected_friday = datetime_to_timestamp( + datetime(2024, 1, 19, 12, 0, 0, tzinfo=UTC) + ) + + result = adjust_to_business_day( + saturday, + business_day_convention=BusinessDayConvention.CALCULATE_SHIFT_PRECEDING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected_friday + + def test_modified_following_shifts_back_if_next_month(self) -> None: + """Test SCMF shifts back to preceding if following goes to next month.""" + # Saturday 2024-01-27 (last Saturday of January) + saturday = datetime_to_timestamp(datetime(2024, 1, 27, 12, 0, 0, tzinfo=UTC)) + # Following would be Monday 2024-01-29 (same month, so should follow) + expected = datetime_to_timestamp(datetime(2024, 1, 29, 12, 0, 0, tzinfo=UTC)) + + result = adjust_to_business_day( + saturday, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected + + # Sunday 2024-03-31 (last day of March) + # Following would be Monday 2024-04-01 (next month) + # Should shift back to Friday 2024-03-29 + sunday = datetime_to_timestamp(datetime(2024, 3, 31, 12, 0, 0, tzinfo=UTC)) + expected_friday = datetime_to_timestamp( + datetime(2024, 3, 29, 12, 0, 0, tzinfo=UTC) + ) + + result = adjust_to_business_day( + sunday, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected_friday + + def test_modified_preceding_shifts_forward_if_previous_month(self) -> None: + """Test SCMP shifts forward to following if preceding goes to previous month.""" + # Sunday 2024-09-01 (first day of September) + # Preceding would be Friday 2024-08-30 (previous month) + # Should shift forward to Monday 2024-09-02 + sunday = datetime_to_timestamp(datetime(2024, 9, 1, 12, 0, 0, tzinfo=UTC)) + expected_monday = datetime_to_timestamp( + datetime(2024, 9, 2, 12, 0, 0, tzinfo=UTC) + ) + + result = adjust_to_business_day( + sunday, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + assert result == expected_monday + + +class TestIsCalculateShift: + """Test is_calculate_shift function.""" + + def test_returns_true_for_calculate_shift_conventions(self) -> None: + """Test returns True for all CS* conventions.""" + cs_conventions = [ + BusinessDayConvention.CALCULATE_SHIFT_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_PRECEDING, + ] + for convention in cs_conventions: + assert is_calculate_shift(convention) is True + + def test_returns_false_for_shift_calculate_conventions(self) -> None: + """Test returns False for all SC* conventions.""" + sc_conventions = [ + BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, + ] + for convention in sc_conventions: + assert is_calculate_shift(convention) is False + + def test_returns_false_for_no_shift(self) -> None: + """Test returns False for NO_SHIFT.""" + assert is_calculate_shift(BusinessDayConvention.NO_SHIFT) is False + + +class TestIsShiftCalculate: + """Test is_shift_calculate function.""" + + def test_returns_true_for_shift_calculate_conventions(self) -> None: + """Test returns True for all SC* conventions.""" + sc_conventions = [ + BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_FOLLOWING, + BusinessDayConvention.SHIFT_CALCULATE_PRECEDING, + BusinessDayConvention.SHIFT_CALCULATE_MODIFIED_PRECEDING, + ] + for convention in sc_conventions: + assert is_shift_calculate(convention) is True + + def test_returns_false_for_calculate_shift_conventions(self) -> None: + """Test returns False for all CS* conventions.""" + cs_conventions = [ + BusinessDayConvention.CALCULATE_SHIFT_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_FOLLOWING, + BusinessDayConvention.CALCULATE_SHIFT_PRECEDING, + BusinessDayConvention.CALCULATE_SHIFT_MODIFIED_PRECEDING, + ] + for convention in cs_conventions: + assert is_shift_calculate(convention) is False + + def test_returns_false_for_no_shift(self) -> None: + """Test returns False for NO_SHIFT.""" + assert is_shift_calculate(BusinessDayConvention.NO_SHIFT) is False diff --git a/tests/sdk/test_deploy_config.py b/tests/sdk/test_deploy_config.py new file mode 100644 index 00000000..7485c8b0 --- /dev/null +++ b/tests/sdk/test_deploy_config.py @@ -0,0 +1,86 @@ +from smart_contracts import constants as cst +from smart_contracts.d_asa.deploy_config import ( + DEMO_FCB_NOMINAL_RATE, + DEMO_NOTIONAL_PRINCIPAL, + DEMO_NOTIONAL_UNIT_VALUE, + DEMO_ZCB_DISCOUNT_BPS, + DemoDeploymentContext, + DenominationAsset, + build_fixed_coupon_bond_demo, + build_zero_coupon_bond_demo, +) + +CURRENT_TS = 1_700_000_000 +DENOMINATION_ASSET_ID = 12345 +DENOMINATION_ASSET_DECIMALS = 2 +ISSUANCE_DELAY_SECONDS = 30 * cst.DAY_2_SEC +FIXED_COUPON_PERIOD_SECONDS = 90 * cst.DAY_2_SEC +FIXED_COUPON_MATURITY_SECONDS = 1800 * cst.DAY_2_SEC +ZERO_COUPON_MATURITY_SECONDS = 360 * cst.DAY_2_SEC + + +def _context() -> DemoDeploymentContext: + return DemoDeploymentContext( + current_ts=CURRENT_TS, + denomination_asset=DenominationAsset( + asset_id=DENOMINATION_ASSET_ID, + decimals=DENOMINATION_ASSET_DECIMALS, + ), + ) + + +def test_fixed_coupon_bond_demo_builds_expected_schedule() -> None: + spec = build_fixed_coupon_bond_demo(_context()) + normalized = spec.normalized + + issuance_date = CURRENT_TS + ISSUANCE_DELAY_SECONDS + maturity_date = issuance_date + FIXED_COUPON_MATURITY_SECONDS + expected_event_types = ["IED"] + ["IP"] * 20 + ["MD"] + + assert spec.label == "FCB" + assert normalized.terms.denomination_asset_id == DENOMINATION_ASSET_ID + assert normalized.terms.initial_exchange_date == issuance_date + assert normalized.terms.maturity_date == maturity_date + assert normalized.terms.notional_principal == 1_000_000 + assert normalized.terms.initial_exchange_amount == 1_000_000 + assert ( + normalized.terms.total_units + == DEMO_NOTIONAL_PRINCIPAL // DEMO_NOTIONAL_UNIT_VALUE + ) + assert normalized.terms.rate_reset_next == int( + DEMO_FCB_NOMINAL_RATE * cst.FIXED_POINT_SCALE + ) + assert [entry.event_type for entry in normalized.schedule] == expected_event_types + assert normalized.schedule[0].scheduled_time == issuance_date + assert ( + normalized.schedule[1].scheduled_time + == issuance_date + FIXED_COUPON_PERIOD_SECONDS + ) + assert normalized.schedule[-1].scheduled_time == maturity_date + + +def test_zero_coupon_bond_demo_builds_expected_schedule() -> None: + spec = build_zero_coupon_bond_demo(_context()) + normalized = spec.normalized + + issuance_date = CURRENT_TS + ISSUANCE_DELAY_SECONDS + maturity_date = issuance_date + ZERO_COUPON_MATURITY_SECONDS + discount_amount = DEMO_NOTIONAL_PRINCIPAL * DEMO_ZCB_DISCOUNT_BPS // cst.BPS + issue_price = ( + DEMO_NOTIONAL_PRINCIPAL - discount_amount + ) * 10**DENOMINATION_ASSET_DECIMALS + + assert spec.label == "ZCB" + assert normalized.terms.denomination_asset_id == DENOMINATION_ASSET_ID + assert normalized.terms.initial_exchange_date == issuance_date + assert normalized.terms.maturity_date == maturity_date + assert normalized.terms.notional_principal == 1_000_000 + assert normalized.terms.initial_exchange_amount == issue_price + assert ( + normalized.terms.total_units + == DEMO_NOTIONAL_PRINCIPAL // DEMO_NOTIONAL_UNIT_VALUE + ) + assert normalized.terms.rate_reset_next == 0 + assert [entry.event_type for entry in normalized.schedule] == ["IED", "MD"] + assert normalized.schedule[0].scheduled_time == issuance_date + assert normalized.schedule[1].scheduled_time == maturity_date diff --git a/tests/sdk/test_localnet.py b/tests/sdk/test_localnet.py new file mode 100644 index 00000000..72f971c8 --- /dev/null +++ b/tests/sdk/test_localnet.py @@ -0,0 +1,115 @@ +from types import SimpleNamespace +from urllib.error import URLError + +from d_asa.localnet import ( + DEFAULT_ALGOD_PORT, + DEFAULT_INDEXER_PORT, + DEFAULT_KMD_PORT, + DEFAULT_LOCALNET_TOKEN, + LocalNetConfig, + load_localnet_config, + wait_for_localnet, +) + + +def test_load_localnet_config_uses_defaults_for_demo_host(monkeypatch) -> None: + monkeypatch.delenv("D_ASA_LOCALNET_HOST", raising=False) + monkeypatch.delenv("D_ASA_LOCALNET_TOKEN", raising=False) + monkeypatch.delenv("D_ASA_ALGOD_PORT", raising=False) + monkeypatch.delenv("D_ASA_KMD_PORT", raising=False) + monkeypatch.delenv("D_ASA_INDEXER_PORT", raising=False) + + config = load_localnet_config(default_host="host.docker.internal") + + assert config == LocalNetConfig( + host="host.docker.internal", + token=DEFAULT_LOCALNET_TOKEN, + algod_port=DEFAULT_ALGOD_PORT, + kmd_port=DEFAULT_KMD_PORT, + indexer_port=DEFAULT_INDEXER_PORT, + ) + + +def test_load_localnet_config_reads_environment_overrides(monkeypatch) -> None: + monkeypatch.setenv("D_ASA_LOCALNET_HOST", "demo-net") + monkeypatch.setenv("D_ASA_LOCALNET_TOKEN", "token") + monkeypatch.setenv("D_ASA_ALGOD_PORT", "14001") + monkeypatch.setenv("D_ASA_KMD_PORT", "14002") + monkeypatch.setenv("D_ASA_INDEXER_PORT", "18980") + monkeypatch.setenv("D_ASA_ALGOD_HOST", "algod-net") + monkeypatch.setenv("D_ASA_KMD_HOST", "kmd-net") + monkeypatch.setenv("D_ASA_INDEXER_HOST", "indexer-net") + + config = load_localnet_config(default_host="ignored") + + assert config == LocalNetConfig( + host="demo-net", + token="token", + algod_port=14001, + kmd_port=14002, + indexer_port=18980, + algod_host="algod-net", + kmd_host="kmd-net", + indexer_host="indexer-net", + ) + assert config.algod_client_config().server == "http://algod-net" + assert config.algod_client_config().port == 14001 + assert config.kmd_client_config().server == "http://kmd-net" + assert config.indexer_client_config().server == "http://indexer-net" + + +def test_round_warp_retries_on_transient_algod_timeout(monkeypatch) -> None: + wait_calls: list[tuple[float, float]] = [] + + def fake_wait_for_algod( + *, + localnet_config: LocalNetConfig | None = None, + timeout_seconds: float = 60.0, + poll_interval_seconds: float = 2.0, + ) -> None: + del localnet_config + wait_calls.append((timeout_seconds, poll_interval_seconds)) + + class FakeSend: + def __init__(self) -> None: + self.calls = 0 + + def payment(self, params: object) -> None: + del params + self.calls += 1 + if self.calls == 1: + raise URLError(TimeoutError("timed out")) + + fake_send = FakeSend() + fake_algorand = SimpleNamespace( + account=SimpleNamespace( + localnet_dispenser=lambda: SimpleNamespace(signer=object(), address="ADDR") + ), + send=fake_send, + ) + + monkeypatch.setattr("d_asa.localnet.wait_for_algod", fake_wait_for_algod) + + from d_asa.localnet import round_warp + + round_warp(algorand=fake_algorand) # type: ignore[arg-type] + + assert fake_send.calls == 2 + assert wait_calls == [(15.0, 1.0)] + + +def test_wait_for_localnet_checks_algod_then_kmd(monkeypatch) -> None: + calls: list[str] = [] + + def fake_wait_for_algod(**_: object) -> None: + calls.append("algod") + + def fake_wait_for_kmd(**_: object) -> None: + calls.append("kmd") + + monkeypatch.setattr("d_asa.localnet.wait_for_algod", fake_wait_for_algod) + monkeypatch.setattr("d_asa.localnet.wait_for_kmd", fake_wait_for_kmd) + + wait_for_localnet() + + assert calls == ["algod", "kmd"] diff --git a/tests/sdk/test_models.py b/tests/sdk/test_models.py new file mode 100644 index 00000000..92286c30 --- /dev/null +++ b/tests/sdk/test_models.py @@ -0,0 +1,62 @@ +from __future__ import annotations + +from d_asa.models import ( + ExecutionScheduleEntry, + InitialKernelState, + NormalizationResult, + NormalizedActusTerms, +) + + +def test_schedule_pages_chunk_entries() -> None: + terms = NormalizedActusTerms( + contract_id=42, + contract_type=0, + denomination_asset_id=1, + initial_exchange_date=1, + maturity_date=2, + secondary_market_opening_date=0, + secondary_market_closure_date=0, + notional_principal=100_000, + notional_unit_value=1_000, + initial_exchange_amount=100_000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=1_000_000_000, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=2, + fixed_point_scale=1_000_000_000, + ) + schedule = tuple( + ExecutionScheduleEntry( + event_id=index, + event_type="IP", + scheduled_time=index + 1, + accrual_factor=1, + redemption_accrual_factor=0, + next_nominal_interest_rate=0, + next_principal_redemption=0, + next_outstanding_principal=100_000, + flags=0, + ) + for index in range(5) + ) + state = InitialKernelState( + status_date=0, + event_cursor=0, + outstanding_principal=0, + interest_calculation_base=0, + nominal_interest_rate=0, + accrued_interest=0, + next_principal_redemption=0, + cumulative_interest_index=0, + cumulative_principal_index=0, + ) + result = NormalizationResult(terms=terms, schedule=schedule, initial_state=state) + + pages = result.schedule_pages(2) + assert len(pages) == 3 + assert pages[0][0].event_id == 0 + assert pages[-1][-1].event_id == 4 diff --git a/tests/sdk/test_normalization.py b/tests/sdk/test_normalization.py new file mode 100644 index 00000000..c87d63ca --- /dev/null +++ b/tests/sdk/test_normalization.py @@ -0,0 +1,1764 @@ +"""Tests for the normalization module.""" + +from decimal import Decimal + +import pytest + +from d_asa.contracts import ( + ContractAttributes, + make_pam_fixed_coupon_bond_profile, + make_pam_zero_coupon_bond, +) +from d_asa.day_count import ( + BusinessDayConvention, + Calendar, + DayCountConvention, + EndOfMonthConvention, +) +from d_asa.errors import ActusNormalizationError +from d_asa.models import ExecutionScheduleEntry, NormalizedActusTerms +from d_asa.normalization import normalize_contract_attributes +from d_asa.normalization.conversions import ( + compute_initial_exchange_amount, + rate_to_fp, + to_asa_units, +) +from d_asa.normalization.event_seeds import deduplicate_timestamps +from d_asa.schedule import Cycle +from smart_contracts import constants as cst +from smart_contracts import enums + + +class TestToAsaUnits: + """Test the to_asa_units helper function.""" + + def test_integer_conversion(self): + """Test converting integer amounts to ASA units.""" + assert to_asa_units(100, 2) == 10000 + assert to_asa_units(1000, 0) == 1000 + assert to_asa_units(50, 3) == 50000 + + def test_float_conversion(self): + """Test converting float amounts to ASA units.""" + result = to_asa_units(100.5, 2) + assert result == 10050 + assert isinstance(result, int) + + def test_decimal_conversion(self): + """Test converting Decimal amounts to ASA units.""" + result = to_asa_units(Decimal("100.42"), 3) + assert result == 100420 + assert isinstance(result, int) + + def test_zero_decimals(self): + """Test conversion with zero decimal places.""" + assert to_asa_units(100, 0) == 100 + + def test_high_decimal_places(self): + """Test conversion with high decimal places.""" + result = to_asa_units(1, 10) + assert result == 10_000_000_000 + assert isinstance(result, int) + + def test_unsupported_type_raises_error(self): + """Test that unsupported types raise TypeError.""" + with pytest.raises(TypeError, match="Unsupported value type"): + to_asa_units("100", 2) + with pytest.raises(TypeError, match="Unsupported value type"): + to_asa_units(None, 2) + + def test_exceeds_uint64_raises_error(self): + """Test that values exceeding uint64 max raise error.""" + # A large amount that when multiplied by scale exceeds uint64 max + with pytest.raises(ActusNormalizationError, match="exceeds uint64 bounds"): + to_asa_units(cst.MAX_UINT64 * 2, 2) + + +class TestRateToFp: + """Test the rate_to_fp helper function.""" + + def test_integer_rate_conversion(self): + """Test converting integer rates to fixed point.""" + result = rate_to_fp(1) + assert result == cst.FIXED_POINT_SCALE + assert isinstance(result, int) + + def test_float_rate_conversion(self): + """Test converting float rates to fixed point.""" + result = rate_to_fp(0.05) + expected = int(Decimal("0.05") * cst.FIXED_POINT_SCALE) + assert result == expected + + def test_decimal_rate_conversion(self): + """Test converting Decimal rates to fixed point.""" + result = rate_to_fp(Decimal("0.0375")) + expected = int(Decimal("0.0375") * cst.FIXED_POINT_SCALE) + assert result == expected + + def test_zero_rate(self): + """Test converting zero rate.""" + assert rate_to_fp(0) == 0 + + def test_high_precision_rate(self): + """Test converting high precision rate.""" + rate = Decimal("0.123456789") + result = rate_to_fp(rate) + assert isinstance(result, int) + assert result > 0 + + def test_negative_rate_raises_error(self): + """Test that negative rates raise error.""" + with pytest.raises(ActusNormalizationError, match="exceeds uint64 bounds"): + rate_to_fp(-0.01) + + def test_exceeds_uint64_raises_error(self): + """Test that very large rates raise error.""" + with pytest.raises(ActusNormalizationError, match="exceeds uint64 bounds"): + rate_to_fp(cst.MAX_UINT64) + + def test_unsupported_type_raises_error(self): + """Test that unsupported types raise TypeError.""" + with pytest.raises(TypeError, match="Unsupported value type"): + rate_to_fp("0.05") + + +class TestComputeInitialExchangeAmount: + """Test the compute_initial_exchange_amount helper function.""" + + def test_at_par_issuance(self): + """Test initial exchange with no premium/discount.""" + result = compute_initial_exchange_amount( + notional=1000000, + premium_discount_at_ied=0, + asa_decimals=2, + ) + # notional=1000000 with 2 decimals = 100000000, premium=0 + # result = 100000000 - 0 = 100000000 + assert result == 100000000 + + def test_with_discount(self): + """Test initial exchange with discount.""" + result = compute_initial_exchange_amount( + notional=1000000, + premium_discount_at_ied=50000, + asa_decimals=2, + ) + # notional=1000000 with 2 decimals = 100000000 + # premium_discount=50000 with 2 decimals = 5000000 + # result = 100000000 - 5000000 = 95000000 + assert result == 95000000 + + def test_with_premium(self): + """Test initial exchange with premium (negative discount).""" + result = compute_initial_exchange_amount( + notional=1000000, + premium_discount_at_ied=-50000, + asa_decimals=2, + ) + # notional=1000000 with 2 decimals = 100000000 + # premium_discount=-50000 with 2 decimals = -5000000 + # result = 100000000 - (-5000000) = 105000000 + assert result == 105000000 + + def test_discount_exceeds_notional_raises_error(self): + """Test that discount > notional results in negative value and raises error.""" + # notional=1000000 with 2 decimals = 100000000 + # discount=2000000 with 2 decimals = 200000000 + # result = 100000000 - 200000000 = -100000000 (negative) + with pytest.raises(ActusNormalizationError, match="exceeds notional"): + compute_initial_exchange_amount( + notional=1000000, + premium_discount_at_ied=2000000, + asa_decimals=2, + ) + + def test_premium_causes_uint64_overflow_raises_error(self): + """Test that large premium causing uint64 overflow raises error.""" + # Use a notional that's 60% of MAX_UINT64 and a premium that's 50% of MAX_UINT64 + # Together they will exceed MAX_UINT64 + notional_large = int(cst.MAX_UINT64 * 0.6) + premium_large = int(cst.MAX_UINT64 * 0.5) + with pytest.raises(ActusNormalizationError, match="exceeds uint64 maximum"): + compute_initial_exchange_amount( + notional=notional_large, + premium_discount_at_ied=-premium_large, + asa_decimals=0, + ) + + +class TestDeduplicateTimestamps: + """Test the deduplicate_timestamps helper function.""" + + def test_empty_sequence(self): + """Test deduplication of empty sequence.""" + result = deduplicate_timestamps([]) + assert result == () + + def test_no_duplicates(self): + """Test sequence with no duplicates.""" + timestamps = [1000000, 1100000, 1200000] + result = deduplicate_timestamps(timestamps) + assert result == (1000000, 1100000, 1200000) + + def test_with_duplicates(self): + """Test deduplication removes duplicates.""" + timestamps = [1000000, 1100000, 1100000, 1200000, 1000000] + result = deduplicate_timestamps(timestamps) + assert result == (1000000, 1100000, 1200000) + + def test_preserves_sorted_order(self): + """Test that result is sorted.""" + timestamps = [1200000, 1000000, 1100000] + result = deduplicate_timestamps(timestamps) + assert result == (1000000, 1100000, 1200000) + + def test_all_same_timestamps(self): + """Test with all identical timestamps.""" + timestamps = [1000000, 1000000, 1000000] + result = deduplicate_timestamps(timestamps) + assert result == (1000000,) + + +class TestNormalizeContractAttributes: + """Test the main normalize_contract_attributes function.""" + + def test_normalize_pam_zero_coupon_bond(self): + """Test normalizing a PAM zero coupon bond.""" + contract = make_pam_zero_coupon_bond( + contract_id=1, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=50000, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + ) + + assert result.terms is not None + assert result.schedule is not None + assert result.initial_state is not None + + # Check that notional principal is correctly normalized + # 1000000 with 2 decimals = 100000000 + assert result.terms.notional_principal == 100000000 + + # Check that initial exchange amount is correctly calculated + # notional (100000000) - premium_discount (5000000) = 95000000 + assert result.terms.initial_exchange_amount == 95000000 + + # Check that maturity date event exists in schedule + md_events = [e for e in result.schedule if e.event_type == "MD"] + assert len(md_events) == 1 + assert md_events[0].scheduled_time == 2000000 + + def test_status_date_after_ied_raises_error(self): + """Test that status_date >= initial_exchange_date raises error.""" + contract = ContractAttributes( + contract_id=1, + contract_type="PAM", + status_date=1100000, # Same as IED + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + with pytest.raises( + ActusNormalizationError, match="status_date to be strictly before" + ): + normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + ) + + def test_normalize_pam_fixed_coupon_bond(self): + """Test normalizing a PAM fixed coupon bond.""" + contract = make_pam_fixed_coupon_bond_profile( + contract_id=2, + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + nominal_interest_rate=0.05, + interest_payment_cycle=Cycle(count=6, unit="M"), + interest_payment_anchor=1100000, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + ) + + # Should have a schedule with events + assert result.schedule is not None + assert len(result.schedule) > 0 + + # Check that rate is normalized to fixed point + assert result.terms.rate_reset_next == int( + Decimal("0.05") * cst.FIXED_POINT_SCALE + ) + + # Should have IED and MD events at minimum + event_types = {e.event_type for e in result.schedule} + assert "IED" in event_types + assert "MD" in event_types + + def test_normalize_lam_contract(self): + """Test normalizing a LAM (Linear Amortizing) contract.""" + contract = ContractAttributes( + contract_id=3, + contract_type="LAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1200000, + premium_discount_at_ied=0, + nominal_interest_rate=0.04, + next_principal_redemption_amount=100000, + principal_redemption_cycle=Cycle(count=3, unit="M"), + principal_redemption_anchor=1200000, + interest_payment_cycle=Cycle(count=3, unit="M"), + interest_payment_anchor=1200000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + ) + + # Should have PR events + pr_events = [e for e in result.schedule if e.event_type == "PR"] + assert len(pr_events) > 0 + + def test_normalize_with_rate_reset(self): + """Test normalizing contract with rate reset.""" + contract = ContractAttributes( + contract_id=4, + contract_type="PAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=2000000, + notional_principal=1000000, + premium_discount_at_ied=0, + nominal_interest_rate=0.03, + rate_reset_spread=0.01, + rate_reset_multiplier=1.0, + rate_reset_floor=0.02, + rate_reset_cap=0.10, + rate_reset_next=0.04, + rate_reset_cycle=Cycle(count=1, unit="Y"), + rate_reset_anchor=1200000, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + ) + + # Check rate reset parameters are normalized + assert result.terms.rate_reset_spread > 0 + assert result.terms.rate_reset_floor > 0 + assert result.terms.rate_reset_cap > 0 + + +class TestNormalizedActusTerms: + """Test the NormalizedActusTerms model.""" + + def test_terms_creation(self): + """Test creating normalized terms with valid values.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=100000000, + notional_unit_value=100000, + initial_exchange_amount=95000000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + assert terms.contract_id == 1 + assert terms.total_units == 1000 + + def test_terms_total_units_calculation(self): + """Test that total_units is correctly calculated.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + assert terms.total_units == 1000 + + def test_terms_with_zero_notional_unit_value_raises_error(self): + """Test that zero notional_unit_value raises error.""" + with pytest.raises( + ActusNormalizationError, match="notional_unit_value must be positive" + ): + NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=0, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + + def test_terms_indivisible_notional_raises_error(self): + """Test that notional not divisible by unit value raises error.""" + with pytest.raises( + ActusNormalizationError, match="divisible by notional_unit_value" + ): + NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000001, # Not divisible by 1000 + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + + def test_dynamic_principal_redemption_for_ann(self): + """Test dynamic_principal_redemption property for ANN contracts.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_ANN, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, # Zero indicates dynamic + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + assert terms.dynamic_principal_redemption is True + + def test_has_rate_reset_floor(self): + """Test has_rate_reset_floor property.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=1000000, # Non-zero + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + assert terms.has_rate_reset_floor is True + + def test_has_rate_reset_cap(self): + """Test has_rate_reset_cap property.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=10000000, # Non-zero + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + assert terms.has_rate_reset_cap is True + + +class TestExecutionScheduleEntry: + """Test the ExecutionScheduleEntry model.""" + + def test_schedule_entry_creation(self): + """Test creating a schedule entry.""" + entry = ExecutionScheduleEntry( + event_id=0, + event_type="IED", + scheduled_time=1100000, + accrual_factor=0, + redemption_accrual_factor=0, + next_nominal_interest_rate=50000000, + next_principal_redemption=0, + next_outstanding_principal=1000000, + flags=enums.FLAG_NON_CASH_EVENT, + ) + assert entry.event_id == 0 + assert entry.event_type == "IED" + assert entry.scheduled_time == 1100000 + assert entry.flags == enums.FLAG_NON_CASH_EVENT + + def test_schedule_entry_cash_event(self): + """Test creating a cash event schedule entry.""" + entry = ExecutionScheduleEntry( + event_id=1, + event_type="IP", + scheduled_time=1200000, + accrual_factor=500000, + redemption_accrual_factor=0, + next_nominal_interest_rate=50000000, + next_principal_redemption=0, + next_outstanding_principal=1000000, + flags=enums.FLAG_CASH_EVENT, + ) + assert entry.event_type == "IP" + assert entry.flags == enums.FLAG_CASH_EVENT + + def test_schedule_entry_default_flags(self): + """Test that flags default to 0.""" + entry = ExecutionScheduleEntry( + event_id=2, + event_type="MD", + scheduled_time=2000000, + accrual_factor=100000, + redemption_accrual_factor=0, + next_nominal_interest_rate=0, + next_principal_redemption=0, + next_outstanding_principal=0, + ) + assert entry.flags == 0 + + +class TestNormalizationResult: + """Test the NormalizationResult model.""" + + def test_schedule_pages_basic(self): + """Test splitting schedule into pages.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + + schedule = tuple( + ExecutionScheduleEntry( + event_id=i, + event_type="IP", + scheduled_time=1100000 + i * 100000, + accrual_factor=0, + redemption_accrual_factor=0, + next_nominal_interest_rate=0, + next_principal_redemption=0, + next_outstanding_principal=0, + ) + for i in range(10) + ) + + from d_asa.models import InitialKernelState, NormalizationResult + + initial_state = InitialKernelState( + status_date=1000000, + event_cursor=0, + outstanding_principal=0, + interest_calculation_base=0, + nominal_interest_rate=0, + accrued_interest=0, + next_principal_redemption=0, + cumulative_interest_index=0, + cumulative_principal_index=0, + ) + + result = NormalizationResult( + terms=terms, + schedule=schedule, + initial_state=initial_state, + ) + + pages = result.schedule_pages(page_size=3) + assert len(pages) == 4 # 10 entries / 3 per page = 4 pages + assert len(pages[0]) == 3 + assert len(pages[1]) == 3 + assert len(pages[2]) == 3 + assert len(pages[3]) == 1 + + def test_schedule_pages_exact_division(self): + """Test paging when schedule size divides evenly.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + + schedule = tuple( + ExecutionScheduleEntry( + event_id=i, + event_type="IP", + scheduled_time=1100000 + i * 100000, + accrual_factor=0, + redemption_accrual_factor=0, + next_nominal_interest_rate=0, + next_principal_redemption=0, + next_outstanding_principal=0, + ) + for i in range(6) + ) + + from d_asa.models import InitialKernelState, NormalizationResult + + initial_state = InitialKernelState( + status_date=1000000, + event_cursor=0, + outstanding_principal=0, + interest_calculation_base=0, + nominal_interest_rate=0, + accrued_interest=0, + next_principal_redemption=0, + cumulative_interest_index=0, + cumulative_principal_index=0, + ) + + result = NormalizationResult( + terms=terms, + schedule=schedule, + initial_state=initial_state, + ) + + pages = result.schedule_pages(page_size=2) + assert len(pages) == 3 + assert all(len(page) == 2 for page in pages) + + def test_schedule_pages_invalid_page_size(self): + """Test that invalid page size raises error.""" + terms = NormalizedActusTerms( + contract_id=1, + contract_type=enums.CT_PAM, + denomination_asset_id=100, + initial_exchange_date=1100000, + maturity_date=2000000, + secondary_market_opening_date=1150000, + secondary_market_closure_date=1950000, + notional_principal=1000000, + notional_unit_value=1000, + initial_exchange_amount=950000, + next_principal_redemption_amount=0, + rate_reset_spread=0, + rate_reset_multiplier=cst.FIXED_POINT_SCALE, + rate_reset_floor=0, + rate_reset_cap=0, + rate_reset_next=0, + day_count_convention=enums.DCC_A360, + fixed_point_scale=cst.FIXED_POINT_SCALE, + ) + + from d_asa.models import InitialKernelState, NormalizationResult + + initial_state = InitialKernelState( + status_date=1000000, + event_cursor=0, + outstanding_principal=0, + interest_calculation_base=0, + nominal_interest_rate=0, + accrued_interest=0, + next_principal_redemption=0, + cumulative_interest_index=0, + cumulative_principal_index=0, + ) + + result = NormalizationResult( + terms=terms, + schedule=(), + initial_state=initial_state, + ) + + with pytest.raises(ValueError, match="page_size must be positive"): + result.schedule_pages(page_size=0) + + with pytest.raises(ValueError, match="page_size must be positive"): + result.schedule_pages(page_size=-1) + + +class TestLaxArrayPrNext: + """Test LAX contracts with array-based principal redemption amounts.""" + + def test_lax_array_pr_next_values_propagate_to_events(self): + """ + Test that array_pr_next values are correctly used in event seeds. + + This tests the fix for a bug where payment_total was initialized once + from next_principal_redemption_amount but per-period values from + array_pr_next were only applied locally in _principal_payment_for_period + and never propagated back to event seeds. + """ + # Define redemption dates (monthly for 6 months) + base_time = 1000000 + ied = base_time + (10 * 24 * 3600) + month_secs = 30 * 24 * 3600 + + # LAX contract with array_pr_next containing different values per period + contract = ContractAttributes( + contract_id=1, + contract_type="LAX", + status_date=base_time, + initial_exchange_date=ied, + maturity_date=ied + (8 * month_secs), + notional_principal=Decimal("100000.0"), + premium_discount_at_ied=Decimal("0"), + nominal_interest_rate=Decimal("0.05"), + day_count_convention=DayCountConvention.ACTUAL_365, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + # Use array-based schedule + array_pr_anchor=[ied + (i * month_secs) for i in range(1, 7)], + array_pr_cycle=[Cycle(1, "M") for _ in range(6)], + # Array with different per-period amounts + array_pr_next=[ + Decimal("2000.0"), + Decimal("3000.0"), + Decimal("4000.0"), + Decimal("5000.0"), + Decimal("6000.0"), + Decimal("7000.0"), + ], + array_increase_decrease=["INC", "INC", "DEC", "DEC", "INC", "DEC"], + next_principal_redemption_amount=Decimal("1000.0"), # Should be overridden + ) + + # Normalize the contract + result = normalize_contract_attributes( + contract, + denomination_asset_id=1, + denomination_asset_decimals=6, + notional_unit_value=Decimal("1.0"), + secondary_market_opening_date=base_time, + secondary_market_closure_date=ied + (10 * month_secs), + ) + + # Extract PR and PI events (INC periods generate PI, DEC periods generate PR) + pr_pi_events = [ev for ev in result.schedule if ev.event_type in ("PR", "PI")] + + # Verify that each event has the correct next_principal_redemption + # from array_pr_next, not the base next_principal_redemption_amount + # Note: There may be more events due to additional cycles, but we verify + # at least the first 6 match array_pr_next + assert len(pr_pi_events) >= 6 + + # Expected event types based on array_increase_decrease + expected_event_types = ["PI", "PI", "PR", "PR", "PI", "PR"] + + for i in range(6): + expected_amount = to_asa_units(contract.array_pr_next[i], 6) + assert pr_pi_events[i].event_type == expected_event_types[i], ( + f"Period {i}: Expected event_type={expected_event_types[i]}, " + f"got {pr_pi_events[i].event_type}" + ) + assert pr_pi_events[i].next_principal_redemption == expected_amount, ( + f"Period {i}: Expected next_principal_redemption={expected_amount}, " + f"got {pr_pi_events[i].next_principal_redemption}" + ) + + def test_lax_inc_direction_uses_correct_payment_total(self): + """ + Test that INC direction uses the correct per-period payment_total. + + For INC (increase) periods, next_outstanding should increase by the + per-period amount from array_pr_next, not the base amount. + """ + base_time = 1000000 + ied = base_time + (10 * 24 * 3600) + month_secs = 30 * 24 * 3600 + + contract = ContractAttributes( + contract_id=1, + contract_type="LAX", + status_date=base_time, + initial_exchange_date=ied, + maturity_date=ied + (5 * month_secs), + notional_principal=Decimal("100000.0"), + premium_discount_at_ied=Decimal("0"), + nominal_interest_rate=Decimal("0.00"), # No interest for simplicity + day_count_convention=DayCountConvention.ACTUAL_365, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + array_pr_anchor=[ied + (i * month_secs) for i in range(1, 4)], + array_pr_cycle=[Cycle(1, "M") for _ in range(3)], + array_pr_next=[ + Decimal("10000.0"), # INC - should increase by 10000 + Decimal("20000.0"), # INC - should increase by 20000 + Decimal("30000.0"), # DEC - should decrease by 30000 + ], + array_increase_decrease=["INC", "INC", "DEC"], + next_principal_redemption_amount=Decimal("1000.0"), + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=1, + denomination_asset_decimals=6, + notional_unit_value=Decimal("1.0"), + secondary_market_opening_date=base_time, + secondary_market_closure_date=ied + (6 * month_secs), + ) + + # Extract PR and PI events (PI for INC periods where principal_payment == 0) + pr_pi_events = [ + ev + for ev in result.schedule + if ev.event_type in ("PR", "PI") and ev.scheduled_time >= ied + month_secs + ] + + # Verify outstanding progression + # Initial: 100000 + # After period 0 (INC 10000): 100000 + 10000 = 110000 + # After period 1 (INC 20000): 110000 + 20000 = 130000 + # After period 2 (DEC 30000): 130000 - 30000 = 100000 + + expected_outstanding = [ + 100000 * 10**6 + 10000 * 10**6, # Period 0: INC by 10000 + 110000 * 10**6 + 20000 * 10**6, # Period 1: INC by 20000 + 130000 * 10**6 - 30000 * 10**6, # Period 2: DEC by 30000 + ] + + for i, ev in enumerate(pr_pi_events[:3]): + assert ev.next_outstanding_principal == expected_outstanding[i], ( + f"Period {i}: Expected outstanding={expected_outstanding[i]}, " + f"got {ev.next_outstanding_principal}" + ) + + def test_lax_without_array_pr_next_uses_base_amount(self): + """ + Test that when array_pr_next is not provided, the base amount is used. + """ + base_time = 1000000 + ied = base_time + (10 * 24 * 3600) + month_secs = 30 * 24 * 3600 + + contract = ContractAttributes( + contract_id=1, + contract_type="LAX", + status_date=base_time, + initial_exchange_date=ied, + maturity_date=ied + (4 * month_secs), + notional_principal=Decimal("100000.0"), + premium_discount_at_ied=Decimal("0"), + nominal_interest_rate=Decimal("0.05"), + day_count_convention=DayCountConvention.ACTUAL_365, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + array_pr_anchor=[ied + (i * month_secs) for i in range(1, 3)], + array_pr_cycle=[Cycle(1, "M") for _ in range(2)], + # No array_pr_next provided + array_increase_decrease=["DEC", "DEC"], + next_principal_redemption_amount=Decimal("5000.0"), + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=1, + denomination_asset_decimals=6, + notional_unit_value=Decimal("1.0"), + secondary_market_opening_date=base_time, + secondary_market_closure_date=ied + (5 * month_secs), + ) + + pr_events = [ev for ev in result.schedule if ev.event_type == "PR"] + + # All events should use the base amount + base_amount = to_asa_units(Decimal("5000.0"), 6) + for i, ev in enumerate(pr_events): + assert ev.next_principal_redemption == base_amount, ( + f"Period {i}: Expected next_principal_redemption={base_amount}, " + f"got {ev.next_principal_redemption}" + ) + + +class TestRateResetAmortizing: + """Test rate reset events are correctly interleaved with principal redemptions.""" + + def test_lam_with_rate_reset_interleaved(self): + """Test LAM contract with rate resets has correct outstanding principal at each RR event.""" + # Create LAM contract with quarterly principal redemptions and annual rate resets + contract = ContractAttributes( + contract_id=1, + contract_type="LAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60 * 2, # 2 years + notional_principal=1000000, + premium_discount_at_ied=0, + nominal_interest_rate=0.05, + next_principal_redemption_amount=250000, # 4 payments of 250k each + # Rate resets annually + rate_reset_cycle=Cycle(count=1, unit="Y"), + rate_reset_anchor=1100000 + 365 * 24 * 60 * 60, # 1 year after start + rate_reset_next=0.06, + # Principal redemptions quarterly + principal_redemption_cycle=Cycle(count=3, unit="M"), + principal_redemption_anchor=1100000 + 90 * 24 * 60 * 60, # 3 months + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + # Extract event schedule + events = result.schedule + + # Find RR events + rr_events = [e for e in events if e.event_type in ("RR", "RRF")] + + # Find PR events before each RR event + pr_events = [e for e in events if e.event_type == "PR"] + + assert len(rr_events) > 0, "Should have rate reset events" + assert len(pr_events) > 0, "Should have principal redemption events" + + # Verify that RR events have different outstanding principals + # (not all the same terminal balance) + if len(rr_events) > 1: + rr_principals = [e.next_outstanding_principal for e in rr_events] + # They should not all be the same (which would indicate the bug) + assert len(set(rr_principals)) > 1 or all( + p == 1000000 * 100 for p in rr_principals[:1] + ), "RR events should have varying outstanding principals as schedule progresses" + + # Verify ordering: earlier RR events should have higher or equal outstanding principal + for i in range(len(rr_events) - 1): + assert ( + rr_events[i].next_outstanding_principal + >= rr_events[i + 1].next_outstanding_principal + ), f"RR event {i} principal should be >= RR event {i+1} principal" + + def test_nam_with_rate_reset_correct_balance(self): + """Test NAM contract with rate resets tracks outstanding principal correctly.""" + contract = ContractAttributes( + contract_id=2, + contract_type="NAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60 * 3, # 3 years + notional_principal=900000, + premium_discount_at_ied=0, + nominal_interest_rate=0.04, + next_principal_redemption_amount=100000, + # Rate resets every 6 months + rate_reset_cycle=Cycle(count=6, unit="M"), + rate_reset_anchor=1100000 + 180 * 24 * 60 * 60, + rate_reset_next=0.045, + # Principal redemptions quarterly + principal_redemption_cycle=Cycle(count=3, unit="M"), + principal_redemption_anchor=1100000 + 90 * 24 * 60 * 60, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + events = result.schedule + rr_events = [e for e in events if e.event_type in ("RR", "RRF")] + + # Each RR event should have outstanding principal that reflects + # redemptions that occurred before it + for i, rr_event in enumerate(rr_events): + # Count PR events that occurred before this RR event + pr_before = [ + e + for e in events + if e.event_type == "PR" and e.scheduled_time < rr_event.scheduled_time + ] + + # The outstanding principal at this RR should be less than initial + # if there were any PR events before it + if len(pr_before) > 0: + assert ( + rr_event.next_outstanding_principal < 900000 * 100 + ), f"RR event {i} should reflect prior principal redemptions" + + def test_lax_with_rate_reset_interleaved(self): + """Test LAX contract with rate resets has correct outstanding principal progression.""" + contract = ContractAttributes( + contract_id=3, + contract_type="LAX", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60 * 2, + notional_principal=500000, + premium_discount_at_ied=0, + nominal_interest_rate=0.05, + # LAX with varying principal amounts + array_pr_next=[100000, 150000, 200000, 50000], + array_increase_decrease=["DEC", "DEC", "INC", "DEC"], + # Rate resets annually + rate_reset_cycle=Cycle(count=1, unit="Y"), + rate_reset_anchor=1100000 + 365 * 24 * 60 * 60, + rate_reset_next=0.055, + # Principal redemptions quarterly + principal_redemption_cycle=Cycle(count=3, unit="M"), + principal_redemption_anchor=1100000 + 90 * 24 * 60 * 60, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + events = result.schedule + rr_events = [e for e in events if e.event_type in ("RR", "RRF")] + + # Verify RR events exist + assert len(rr_events) > 0, "Should have rate reset events" + + # Verify that the outstanding principal at each RR event reflects + # the actual balance at that point in time, not the terminal balance + if len(rr_events) >= 2: + # The outstanding principals should differ if principal changes occurred + principals = [e.next_outstanding_principal for e in rr_events] + # Check that they're not all equal (which would indicate the bug) + unique_principals = set(principals) + # Given the LAX schedule with INC and DEC, we expect variation + # or at least not all terminal balance + assert ( + len(unique_principals) >= 2 + ), "RR events should reflect changing outstanding balances across RR events" + + +def test_nam_capitalizes_unpaid_interest(): + """Test that NAM capitalizes unpaid interest when payment < interest due.""" + # Create a NAM contract with small payments that won't cover interest + contract = ContractAttributes( + contract_id=1, + contract_type="NAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60, # 1 year + notional_principal=1000000, # 1,000,000 minor units + premium_discount_at_ied=0, + nominal_interest_rate=0.12, # 12% annual rate + # Small payment that won't cover interest + next_principal_redemption_amount=500, # 500 minor units + # Monthly payments + principal_redemption_cycle=Cycle(count=1, unit="M"), + principal_redemption_anchor=1100000 + 30 * 24 * 60 * 60, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + events = result.schedule + pr_events = [e for e in events if e.event_type == "PR"] + + # First PR event should show increased outstanding principal (capitalization) + # Interest for ~30 days at 12% on 1,000,000 (in cents) = ~10,000 cents + # Payment is only 500 cents, so ~9,500 cents should be capitalized + # Outstanding should increase from 1,000,000 to approximately 1,009,500 + + assert len(pr_events) > 0, "Should have PR events" + + first_pr = pr_events[0] + initial_outstanding = 1000000 # Initial outstanding in minor units + + # Outstanding should increase (negative amortization) + assert ( + first_pr.next_outstanding_principal > initial_outstanding + ), f"Outstanding should increase from {initial_outstanding} to {first_pr.next_outstanding_principal}" + + # Verify multiple periods show continued capitalization + if len(pr_events) > 1: + second_pr = pr_events[1] + assert ( + second_pr.next_outstanding_principal > first_pr.next_outstanding_principal + ), "Outstanding should continue to increase in subsequent periods" + + +class TestRateResetInterpolation: + """Test that rate reset events have correct balance interpolation.""" + + def test_lam_with_interleaved_rate_resets_has_correct_balance(self): + """ + Test LAM with monthly principal redemptions and semiannual rate resets. + + The rate reset events that fall between principal redemption dates should + have the interpolated balance at that timestamp, not the final balance. + """ + # Setup: 120k initial, 10k monthly redemptions, 6-month rate resets + # At month 6 (reset), balance should be 70k (120k - 5*10k from months 1-5) + status_ts = 1704067200 # 2024-01-01 00:00:00 UTC + start_ts = status_ts + 24 * 60 * 60 # 2024-01-02 (IED must be after status) + month_1 = start_ts + 31 * 24 * 60 * 60 # Feb 1 + month_6 = start_ts + 181 * 24 * 60 * 60 # Jul 1 (approx) + + contract = ContractAttributes( + contract_id=1, + contract_type="LAM", + status_date=status_ts, + initial_exchange_date=start_ts, + maturity_date=start_ts + 365 * 24 * 60 * 60, # 1 year + notional_principal=120_000, + premium_discount_at_ied=0, + nominal_interest_rate=0.05, + next_principal_redemption_amount=10_000, + principal_redemption_anchor=month_1, + principal_redemption_cycle=Cycle(count=1, unit="M"), # Monthly + rate_reset_anchor=month_6, + rate_reset_cycle=Cycle(count=6, unit="M"), # Semiannual + rate_reset_next=0.06, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=6, + notional_unit_value=1, + secondary_market_opening_date=start_ts, + secondary_market_closure_date=start_ts + 400 * 24 * 60 * 60, + ) + schedule = result.schedule + + # Find RR events + rr_events = [e for e in schedule if e.event_type in ("RR", "RRF")] + assert len(rr_events) > 0, "Should have rate reset events" + + # Find the first RR event (should be around month 6) + first_rr = rr_events[0] + + # Count PR events before first reset + pr_before_reset = [ + e + for e in schedule + if e.event_type == "PR" and e.scheduled_time < first_rr.scheduled_time + ] + + # With monthly redemptions and 6-month reset, should have ~5 PRs before reset + assert ( + len(pr_before_reset) >= 5 + ), f"Expected at least 5 PR events before first reset, got {len(pr_before_reset)}" + + # The balance at the reset should reflect those redemptions + # Not the terminal balance (which would be 0 or close to 0) + initial_balance = 120_000_000_000 # 120k in micro-units + + # First RR should NOT have terminal balance of 0 + assert ( + first_rr.next_outstanding_principal > 0 + ), "First RR event should not have terminal balance" + + # First RR should have less than initial (some payments made) + assert ( + first_rr.next_outstanding_principal < initial_balance + ), f"First RR event should have reduced balance after {len(pr_before_reset)} PR events" + + def test_ann_with_interleaved_rate_resets_has_correct_balance(self): + """ + Test ANN with quarterly principal redemptions and semiannual rate resets. + + Rate reset events between redemption dates should capture the correct + interpolated balance, not the terminal balance. + """ + status_ts = 1704067200 # 2024-01-01 00:00:00 UTC + start_ts = status_ts + 24 * 60 * 60 # 2024-01-02 + quarter_1 = start_ts + 90 * 24 * 60 * 60 # Apr 1 (approx) + month_6 = start_ts + 181 * 24 * 60 * 60 # Jul 1 (approx) + + contract = ContractAttributes( + contract_id=2, + contract_type="ANN", + status_date=status_ts, + initial_exchange_date=start_ts, + maturity_date=start_ts + 365 * 24 * 60 * 60, + notional_principal=100_000, + premium_discount_at_ied=0, + nominal_interest_rate=0.06, + next_principal_redemption_amount=7_000, + principal_redemption_anchor=quarter_1, + principal_redemption_cycle=Cycle(count=3, unit="M"), # Quarterly + rate_reset_anchor=month_6, + rate_reset_cycle=Cycle(count=6, unit="M"), # Semiannual + rate_reset_next=0.065, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=6, + notional_unit_value=1, + secondary_market_opening_date=status_ts, + secondary_market_closure_date=start_ts + 400 * 24 * 60 * 60, + ) + schedule = result.schedule + + # Find RR events + rr_events = [e for e in schedule if e.event_type in ("RR", "RRF")] + + if len(rr_events) > 0: + first_rr = rr_events[0] + + # Find the most recent PR event before or at the reset to determine expected balance + pr_events_before_reset = [ + e + for e in schedule + if e.event_type == "PR" and e.scheduled_time <= first_rr.scheduled_time + ] + + if pr_events_before_reset: + # Sort by time and get the last one + pr_events_before_reset.sort(key=lambda e: e.scheduled_time) + expected_balance = pr_events_before_reset[-1].next_outstanding_principal + + actual_balance = first_rr.next_outstanding_principal + + # For events at the same timestamp, balance should match + # For events between PR dates, balance should match last PR + assert actual_balance == expected_balance, ( + f"RR event should have balance matching last PR event at or before it: " + f"expected {expected_balance}, got {actual_balance}" + ) + + def test_nam_with_rate_reset_preserves_capitalized_balance(self): + """ + Test NAM (negative amortization) with rate resets. + + When principal can increase due to capitalization, rate reset events + should reflect the actual balance at that point in time. + """ + status_ts = 1704067200 # 2024-01-01 00:00:00 UTC + start_ts = status_ts + 24 * 60 * 60 # 2024-01-02 + month_1 = start_ts + 31 * 24 * 60 * 60 + month_6 = start_ts + 181 * 24 * 60 * 60 + + contract = ContractAttributes( + contract_id=3, + contract_type="NAM", + status_date=status_ts, + initial_exchange_date=start_ts, + maturity_date=start_ts + 365 * 24 * 60 * 60, + notional_principal=100_000, + premium_discount_at_ied=0, + nominal_interest_rate=0.12, # High rate to trigger capitalization + next_principal_redemption_amount=500, + # Low payment -> capitalization + principal_redemption_anchor=month_1, + principal_redemption_cycle=Cycle(count=1, unit="M"), # Monthly + rate_reset_anchor=month_6, + rate_reset_cycle=Cycle(count=6, unit="M"), # Semiannual + rate_reset_next=0.13, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=6, + notional_unit_value=1, + secondary_market_opening_date=status_ts, + secondary_market_closure_date=start_ts + 400 * 24 * 60 * 60, + ) + schedule = result.schedule + + # Find RR events + rr_events = [e for e in schedule if e.event_type in ("RR", "RRF")] + + if len(rr_events) > 0: + first_rr = rr_events[0] + + # Find the most recent PR event to compare + pr_events_before_reset = [ + e + for e in schedule + if e.event_type == "PR" and e.scheduled_time < first_rr.scheduled_time + ] + + if pr_events_before_reset: + pr_events_before_reset.sort(key=lambda e: e.scheduled_time) + expected_balance = pr_events_before_reset[-1].next_outstanding_principal + actual_balance = first_rr.next_outstanding_principal + + # Balance should have increased due to capitalization + assert ( + actual_balance >= 100_000_000_000 + ), "NAM balance should have grown due to capitalization" + + assert actual_balance == expected_balance, ( + f"RR event should capture the capitalized balance: " + f"expected {expected_balance}, got {actual_balance}" + ) + + def test_lax_with_rate_reset_tracks_balance_through_inc_and_dec(self): + """ + Test LAX with mixed INC/DEC directions and rate resets. + + Rate resets should track balance through both increases and decreases. + """ + status_ts = 1704067200 # 2024-01-01 00:00:00 UTC + start_ts = status_ts + 24 * 60 * 60 # 2024-01-02 + month_2 = start_ts + 31 * 24 * 60 * 60 + month_4 = start_ts + 90 * 24 * 60 * 60 + + contract = ContractAttributes( + contract_id=4, + contract_type="LAX", + status_date=status_ts, + initial_exchange_date=start_ts, + maturity_date=start_ts + 180 * 24 * 60 * 60, # 6 months + notional_principal=100_000, + premium_discount_at_ied=0, + nominal_interest_rate=0.05, + # LAX uses arrays + array_pr_anchor=[month_2, month_4], + array_pr_cycle=[Cycle(count=1, unit="M"), Cycle(count=1, unit="M")], + array_pr_next=[5_000, 3_000], # Different amounts per segment + array_increase_decrease=["DEC", "INC"], + # First segment decreases, second increases + rate_reset_anchor=start_ts + 75 * 24 * 60 * 60, # Month 2.5 + rate_reset_cycle=Cycle(count=1, unit="M"), + rate_reset_next=0.055, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result = normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=6, + notional_unit_value=1, + secondary_market_opening_date=status_ts, + secondary_market_closure_date=start_ts + 200 * 24 * 60 * 60, + ) + schedule = result.schedule + + # Find rate reset events + reset_events = [e for e in schedule if e.event_type in ("RR", "RRF")] + + # Each reset should have a balance matching the timeline + for reset_event in reset_events: + reset_ts = reset_event.scheduled_time + + # Find all PR/PI events before this reset + principal_events = [ + e + for e in schedule + if e.event_type in ("PR", "PI") and e.scheduled_time < reset_ts + ] + + if principal_events: + # Sort and get the last one + principal_events.sort(key=lambda e: e.scheduled_time) + expected_balance = principal_events[-1].next_outstanding_principal + else: + # No principal events yet, should be initial balance + expected_balance = 100_000_000_000 + + actual_balance = reset_event.next_outstanding_principal + + assert actual_balance == expected_balance, ( + f"RR event at {reset_ts} should have balance {expected_balance}, " + f"but got {actual_balance}" + ) + + +def test_nam_capitalization_uint64_overflow_detection(): + """Test that NAM capitalization detects and rejects uint64 overflow.""" + # Create a NAM contract with large notional and high interest rate + # that will cause overflow during capitalization + # Use a notional that when scaled won't overflow initially, + # but will overflow when interest capitalizes + + # Calculate a large notional that is divisible by notional_unit_value + # MAX_UINT64 / 100 ≈ 184467440737095516, round down to multiple of 1000 + large_notional = (int(cst.MAX_UINT64 / 100) // 1000) * 1000 + + contract = ContractAttributes( + contract_id=1, + contract_type="NAM", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60, # 1 year + notional_principal=large_notional, + premium_discount_at_ied=0, + nominal_interest_rate=0.50, # 50% annual rate - will cause massive capitalization + # Very small payment that won't cover interest + next_principal_redemption_amount=100, + # Monthly payments + principal_redemption_cycle=Cycle(count=1, unit="M"), + principal_redemption_anchor=1100000 + 30 * 24 * 60 * 60, + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + # Should raise ActusNormalizationError due to uint64 overflow + with pytest.raises( + ActusNormalizationError, + match=r"NAM capitalization.*exceeds uint64 bounds", + ): + normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=2, + notional_unit_value=1000, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + +def test_lax_inc_uint64_overflow_detection(): + """Test that LAX INC detects and rejects uint64 overflow when array_pr_next values are too large.""" + # Create a LAX contract with a large notional and an even larger array_pr_next value + # that would cause overflow when added to outstanding principal + + # Start with a large but valid notional + large_notional = int(cst.MAX_UINT64 * 0.6) # 60% of MAX_UINT64 + + # Create an array_pr_next value that when added to large_notional will exceed MAX_UINT64 + overflow_payment = int(cst.MAX_UINT64 * 0.5) # This + large_notional > MAX_UINT64 + + contract = ContractAttributes( + contract_id=1, + contract_type="LAX", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60, # 1 year + notional_principal=large_notional, + premium_discount_at_ied=0, + nominal_interest_rate=0.05, # 5% annual rate + # Array-based schedule + array_pr_next=[overflow_payment], # This will cause overflow in INC + array_increase_decrease=["INC"], # Principal increase + array_pr_anchor=[1100000 + 30 * 24 * 60 * 60], + array_pr_cycle=[Cycle(count=1, unit="M")], + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + # Should raise ActusNormalizationError due to uint64 overflow + with pytest.raises( + ActusNormalizationError, + match=r"LAX INC.*exceeds uint64 bounds", + ): + normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=0, # No scaling to simplify + notional_unit_value=1, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + +def test_lax_array_pr_next_scaled_value_overflow_detection(): + """Test that LAX detects overflow when array_pr_next scaled values exceed uint64 bounds.""" + # Create a LAX contract where the scaled array_pr_next value itself exceeds MAX_UINT64 + # This tests the validation that happens before any addition + + # Use a value that when scaled with decimals will exceed MAX_UINT64 + # MAX_UINT64 = 18446744073709551615 + # With 6 decimals, any value > 18446744073709.551615 will overflow + excessive_value = int(cst.MAX_UINT64 / 1e6) + 1000000 # This * 10^6 > MAX_UINT64 + + contract = ContractAttributes( + contract_id=1, + contract_type="LAX", + status_date=1000000, + initial_exchange_date=1100000, + maturity_date=1100000 + 365 * 24 * 60 * 60, + notional_principal=1000000, # Small notional + premium_discount_at_ied=0, + nominal_interest_rate=0.05, + array_pr_next=[excessive_value], # Scaled value will overflow + array_increase_decrease=["INC"], + array_pr_anchor=[1100000 + 30 * 24 * 60 * 60], + array_pr_cycle=[Cycle(count=1, unit="M")], + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + # Should raise ActusNormalizationError due to scaled value overflow + # The error can come from either to_asa_units or from our LAX-specific validation + with pytest.raises( + ActusNormalizationError, + match=r"(Value.*exceeds uint64 bounds|LAX array_pr_next\[\d+\] scaled value.*exceeds uint64 bounds)", + ): + normalize_contract_attributes( + contract, + denomination_asset_id=100, + denomination_asset_decimals=6, # 6 decimals will cause overflow + notional_unit_value=1, + secondary_market_opening_date=1000000, + secondary_market_closure_date=2000000, + ) + + +def test_ann_subtype_calculates_annuity_payment(): + """ + Test that ANN subtypes (e.g., "ANN:ZCB") correctly calculate annuity payments. + + Regression test for issue where "ANN:ZCB" was not recognized as an ANN contract + and would skip _resolve_annuity_payment, resulting in next_principal_redemption=0. + """ + status_ts = 1704067200 # 2024-01-01 00:00:00 UTC + start_ts = status_ts + 24 * 60 * 60 # 2024-01-02 + quarter_1 = start_ts + 90 * 24 * 60 * 60 + + # Test with subtype notation "ANN:ZCB" + contract_subtype = ContractAttributes( + contract_id=1, + contract_type="ANN:ZCB", + status_date=status_ts, + initial_exchange_date=start_ts, + maturity_date=start_ts + 365 * 24 * 60 * 60, + notional_principal=100_000, + premium_discount_at_ied=0, + nominal_interest_rate=0.06, + next_principal_redemption_amount=7_000, + principal_redemption_anchor=quarter_1, + principal_redemption_cycle=Cycle(count=3, unit="M"), + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + # Test with base type "ANN" + contract_base = ContractAttributes( + contract_id=2, + contract_type="ANN", + status_date=status_ts, + initial_exchange_date=start_ts, + maturity_date=start_ts + 365 * 24 * 60 * 60, + notional_principal=100_000, + premium_discount_at_ied=0, + nominal_interest_rate=0.06, + next_principal_redemption_amount=7_000, + principal_redemption_anchor=quarter_1, + principal_redemption_cycle=Cycle(count=3, unit="M"), + day_count_convention=DayCountConvention.A360, + business_day_convention=BusinessDayConvention.NOS, + end_of_month_convention=EndOfMonthConvention.SD, + calendar=Calendar.NC, + ) + + result_subtype = normalize_contract_attributes( + contract_subtype, + denomination_asset_id=100, + denomination_asset_decimals=6, + notional_unit_value=1, + secondary_market_opening_date=status_ts, + secondary_market_closure_date=start_ts + 400 * 24 * 60 * 60, + ) + + result_base = normalize_contract_attributes( + contract_base, + denomination_asset_id=100, + denomination_asset_decimals=6, + notional_unit_value=1, + secondary_market_opening_date=status_ts, + secondary_market_closure_date=start_ts + 400 * 24 * 60 * 60, + ) + + # Both should have the same IED event with correct annuity payment + # The IED (Initial Exchange Date) event contains the calculated annuity payment + ied_subtype = next(e for e in result_subtype.schedule if e.event_type == "IED") + ied_base = next(e for e in result_base.schedule if e.event_type == "IED") + + # Specifically, next_principal_redemption should be non-zero for both + assert ( + ied_subtype.next_principal_redemption > 0 + ), "ANN:ZCB subtype should calculate annuity payment in IED event" + assert ( + ied_base.next_principal_redemption > 0 + ), "ANN base type should calculate annuity payment in IED event" + + # The calculated annuity payment should be identical for both + assert ( + ied_subtype.next_principal_redemption == ied_base.next_principal_redemption + ), f"ANN:ZCB and ANN should produce identical annuity payments: subtype={ied_subtype.next_principal_redemption}, base={ied_base.next_principal_redemption}" + + # Verify other IED properties match too + assert ( + ied_subtype.next_outstanding_principal == ied_base.next_outstanding_principal + ), "Outstanding principal should match" + assert ( + ied_subtype.next_nominal_interest_rate == ied_base.next_nominal_interest_rate + ), "Nominal interest rate should match" diff --git a/tests/sdk/test_registry.py b/tests/sdk/test_registry.py new file mode 100644 index 00000000..8f89cad6 --- /dev/null +++ b/tests/sdk/test_registry.py @@ -0,0 +1,55 @@ +"""Pin the ACTUS registry constants used by the SDK and AVM.""" + +from __future__ import annotations + +from d_asa.registry import ( + ALLOWED_EVENT_TYPES, + CASH_EVENT_TYPES, + CONTRACT_TYPE_IDS, + EVENT_SCHEDULE_PRIORITY, + EVENT_TYPE_IDS, + NON_CASH_EVENT_TYPES, + REJECTED_EVENT_TYPES, + SUPPORTED_CONTRACT_TYPES, +) +from smart_contracts import enums + + +def test_supported_contract_types_match_v1_scope() -> None: + """Supported types should match the intended fixed-income v1 scope.""" + assert SUPPORTED_CONTRACT_TYPES == frozenset( + {"PAM", "LAM", "NAM", "ANN", "LAX", "CLM"} + ) + + +def test_rejected_event_types_exclude_v1_out_of_scope_flows() -> None: + """Rejected types should cover the event families excluded from v1.""" + assert REJECTED_EVENT_TYPES == frozenset( + {"PP", "PY", "SC", "CE", "PRD", "TD", "FP"} + ) + + +def test_contract_type_ids_are_stable() -> None: + """Contract type ids should remain stable across SDK and AVM layers.""" + assert CONTRACT_TYPE_IDS["PAM"] == enums.CT_PAM + assert CONTRACT_TYPE_IDS["CLM"] == enums.CT_CLM + + +def test_event_type_ids_are_stable() -> None: + """Event ids should remain stable across normalization and execution.""" + assert EVENT_TYPE_IDS["PR"] == enums.EVT_PR + assert EVENT_TYPE_IDS["PRF"] == enums.EVT_PRF + + +def test_cash_and_non_cash_sets_cover_allowed_events() -> None: + """Allowed events should include the shared cash and non-cash subsets.""" + allowed_events = set().union(*ALLOWED_EVENT_TYPES.values()) + assert CASH_EVENT_TYPES.issubset(allowed_events) + assert NON_CASH_EVENT_TYPES.issubset(allowed_events) + + +def test_event_priority_matches_actus_sequence() -> None: + """Event priority should preserve the intended ACTUS ordering.""" + assert EVENT_SCHEDULE_PRIORITY["PR"] < EVENT_SCHEDULE_PRIORITY["IP"] + assert EVENT_SCHEDULE_PRIORITY["IP"] < EVENT_SCHEDULE_PRIORITY["RR"] + assert EVENT_SCHEDULE_PRIORITY["RR"] < EVENT_SCHEDULE_PRIORITY["MD"] diff --git a/tests/sdk/test_schedule.py b/tests/sdk/test_schedule.py new file mode 100644 index 00000000..a4b7f738 --- /dev/null +++ b/tests/sdk/test_schedule.py @@ -0,0 +1,772 @@ +"""Tests for d_asa.schedule module.""" + +from __future__ import annotations + +from datetime import UTC, datetime + +import pytest + +from d_asa.day_count import ( + BusinessDayConvention, + Calendar, + EndOfMonthConvention, +) +from d_asa.errors import UnsupportedActusFeatureError +from d_asa.schedule import ( + Cycle, + add_cycle, + generate_array_schedule, + generate_schedule, + resolve_array_schedule, + resolve_cycle_schedule, +) +from d_asa.unix_time import datetime_to_timestamp + + +class TestCycle: + """Test Cycle dataclass.""" + + def test_create_cycle_with_defaults(self) -> None: + """Test creating Cycle with default stub.""" + cycle = Cycle(count=3, unit="M") + assert cycle.count == 3 + assert cycle.unit == "M" + assert cycle.stub == "" + + def test_create_cycle_with_stub(self) -> None: + """Test creating Cycle with stub marker.""" + cycle = Cycle(count=1, unit="Q", stub="+") + assert cycle.count == 1 + assert cycle.unit == "Q" + assert cycle.stub == "+" + + +class TestCycleParseCycle: + """Test Cycle.parse_cycle class method.""" + + def test_parse_simple_day_cycle(self) -> None: + """Test parsing day cycle.""" + cycle = Cycle.parse_cycle("90D") + assert cycle.count == 90 + assert cycle.unit == "D" + assert cycle.stub == "" + + def test_parse_simple_week_cycle(self) -> None: + """Test parsing week cycle.""" + cycle = Cycle.parse_cycle("12W") + assert cycle.count == 12 + assert cycle.unit == "W" + assert cycle.stub == "" + + def test_parse_simple_month_cycle(self) -> None: + """Test parsing month cycle.""" + cycle = Cycle.parse_cycle("3M") + assert cycle.count == 3 + assert cycle.unit == "M" + assert cycle.stub == "" + + def test_parse_simple_quarter_cycle(self) -> None: + """Test parsing quarter cycle.""" + cycle = Cycle.parse_cycle("1Q") + assert cycle.count == 1 + assert cycle.unit == "Q" + assert cycle.stub == "" + + def test_parse_simple_half_year_cycle(self) -> None: + """Test parsing half-year cycle.""" + cycle = Cycle.parse_cycle("1H") + assert cycle.count == 1 + assert cycle.unit == "H" + assert cycle.stub == "" + + def test_parse_simple_year_cycle(self) -> None: + """Test parsing year cycle.""" + cycle = Cycle.parse_cycle("2Y") + assert cycle.count == 2 + assert cycle.unit == "Y" + assert cycle.stub == "" + + def test_parse_cycle_with_long_stub(self) -> None: + """Test parsing cycle with long stub marker.""" + cycle = Cycle.parse_cycle("3M+") + assert cycle.count == 3 + assert cycle.unit == "M" + assert cycle.stub == "+" + + def test_parse_cycle_with_short_stub(self) -> None: + """Test parsing cycle with short stub marker.""" + cycle = Cycle.parse_cycle("1Q-") + assert cycle.count == 1 + assert cycle.unit == "Q" + assert cycle.stub == "-" + + def test_parse_cycle_case_insensitive(self) -> None: + """Test parsing is case-insensitive.""" + cycle = Cycle.parse_cycle("3m") + assert cycle.count == 3 + assert cycle.unit == "M" + + def test_parse_cycle_strips_whitespace(self) -> None: + """Test parsing strips whitespace.""" + cycle = Cycle.parse_cycle(" 3M ") + assert cycle.count == 3 + assert cycle.unit == "M" + + def test_parse_multi_digit_count(self) -> None: + """Test parsing cycles with multi-digit counts.""" + cycle = Cycle.parse_cycle("365D") + assert cycle.count == 365 + assert cycle.unit == "D" + + def test_parse_invalid_format_raises_error(self) -> None: + """Test parsing invalid format raises ValueError.""" + with pytest.raises(ValueError, match="Unsupported ACTUS cycle"): + Cycle.parse_cycle("M") # Missing count + + with pytest.raises(ValueError, match="Unsupported ACTUS cycle"): + Cycle.parse_cycle("XYZ") + + def test_parse_invalid_unit_raises_error(self) -> None: + """Test parsing invalid unit raises ValueError.""" + with pytest.raises(ValueError, match="Invalid cycle unit"): + Cycle.parse_cycle("3X") + + +class TestAddCycle: + """Test add_cycle function.""" + + def test_add_day_cycle(self) -> None: + """Test adding day cycles.""" + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) + result = add_cycle( + start, + "30D", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + expected = datetime_to_timestamp(datetime(2024, 2, 14, 0, 0, 0, tzinfo=UTC)) + assert result == expected + + def test_add_week_cycle(self) -> None: + """Test adding week cycles.""" + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) + result = add_cycle( + start, + "2W", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + expected = datetime_to_timestamp(datetime(2024, 1, 29, 0, 0, 0, tzinfo=UTC)) + assert result == expected + + def test_add_month_cycle(self) -> None: + """Test adding month cycles.""" + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) + result = add_cycle( + start, + "1M", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + expected = datetime_to_timestamp(datetime(2024, 2, 15, 0, 0, 0, tzinfo=UTC)) + assert result == expected + + def test_add_quarter_cycle(self) -> None: + """Test adding quarter cycles.""" + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) + result = add_cycle( + start, + "1Q", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + expected = datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=UTC)) + assert result == expected + + def test_add_half_year_cycle(self) -> None: + """Test adding half-year cycles.""" + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) + result = add_cycle( + start, + "1H", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + expected = datetime_to_timestamp(datetime(2024, 7, 15, 0, 0, 0, tzinfo=UTC)) + assert result == expected + + def test_add_year_cycle(self) -> None: + """Test adding year cycles.""" + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) + result = add_cycle( + start, + "1Y", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + expected = datetime_to_timestamp(datetime(2025, 1, 15, 0, 0, 0, tzinfo=UTC)) + assert result == expected + + def test_add_month_cycle_with_same_day_convention(self) -> None: + """Test adding month cycle with SAME_DAY convention.""" + # Jan 31 + 1M = Feb 29 (capped to last day of Feb in leap year) + start = datetime_to_timestamp(datetime(2024, 1, 31, 0, 0, 0, tzinfo=UTC)) + result = add_cycle( + start, "1M", end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + expected = datetime_to_timestamp(datetime(2024, 2, 29, 0, 0, 0, tzinfo=UTC)) + assert result == expected + + def test_add_month_cycle_with_eom_convention(self) -> None: + """Test adding month cycle with END_OF_MONTH convention.""" + # Jan 31 (end of month) + 1M = Feb 29 (end of month in leap year) + start = datetime_to_timestamp(datetime(2024, 1, 31, 0, 0, 0, tzinfo=UTC)) + result = add_cycle( + start, "1M", end_of_month_convention=EndOfMonthConvention.END_OF_MONTH + ) + expected = datetime_to_timestamp(datetime(2024, 2, 29, 0, 0, 0, tzinfo=UTC)) + assert result == expected + + def test_add_cycle_with_anchor_and_occurrence(self) -> None: + """Test adding cycle with anchor and occurrence index.""" + anchor = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) + result = add_cycle( + anchor, + "1M", + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + anchor_timestamp=anchor, + occurrence_index=3, + ) + expected = datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=UTC)) + assert result == expected + + def test_add_month_cycle_handles_short_months(self) -> None: + """Test month cycle handles months with different days.""" + # Jan 31 + 3M = Apr 30 (April has only 30 days) + start = datetime_to_timestamp(datetime(2024, 1, 31, 0, 0, 0, tzinfo=UTC)) + result = add_cycle( + start, "3M", end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + expected = datetime_to_timestamp(datetime(2024, 4, 30, 0, 0, 0, tzinfo=UTC)) + assert result == expected + + def test_add_cycle_leap_year_february(self) -> None: + """Test adding cycles around leap year February.""" + # Feb 29 2024 (leap year) + 1Y = Feb 28 2025 (non-leap year) + start = datetime_to_timestamp(datetime(2024, 2, 29, 0, 0, 0, tzinfo=UTC)) + result = add_cycle( + start, "1Y", end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + expected = datetime_to_timestamp(datetime(2025, 2, 28, 0, 0, 0, tzinfo=UTC)) + assert result == expected + + +class TestGenerateSchedule: + """Test generate_schedule function.""" + + def test_generate_monthly_schedule(self) -> None: + """Test generating monthly schedule.""" + start = datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_schedule( + start, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + + expected = ( + datetime_to_timestamp(datetime(2024, 1, 15, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 2, 15, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 15, 0, 0, 0, tzinfo=UTC)), + ) + assert schedule == expected + + def test_generate_quarterly_schedule(self) -> None: + """Test generating quarterly schedule.""" + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_schedule( + start, "1Q", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + + expected = ( + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 7, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 10, 1, 0, 0, 0, tzinfo=UTC)), + ) + assert schedule == expected + + def test_generate_daily_schedule(self) -> None: + """Test generating daily schedule.""" + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 1, 5, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_schedule( + start, "1D", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + + assert len(schedule) == 5 + assert schedule[0] == start + assert schedule[-1] == end + + def test_generate_yearly_schedule(self) -> None: + """Test generating yearly schedule.""" + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2027, 1, 1, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_schedule( + start, "1Y", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + + expected = ( + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2025, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2026, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2027, 1, 1, 0, 0, 0, tzinfo=UTC)), + ) + assert schedule == expected + + def test_generate_schedule_stops_at_end(self) -> None: + """Test schedule generation stops at end date.""" + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_schedule( + start, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + + # Should have Jan 1, Feb 1, Mar 1 but not Apr 1 + assert len(schedule) == 3 + assert schedule[-1] < end + + def test_generate_schedule_includes_end_if_exact_match(self) -> None: + """Test schedule includes end if it matches exactly.""" + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_schedule( + start, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + + assert schedule[-1] == end + + def test_generate_schedule_with_eom_convention(self) -> None: + """Test schedule generation with END_OF_MONTH convention.""" + # Jan 31 (end of month) + start = datetime_to_timestamp(datetime(2024, 1, 31, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_schedule( + start, + "1M", + end, + end_of_month_convention=EndOfMonthConvention.END_OF_MONTH, + ) + + # Should generate: Jan 31, Feb 29, Mar 31, Apr 30 + expected = ( + datetime_to_timestamp(datetime(2024, 1, 31, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 2, 29, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 3, 31, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 30, 0, 0, 0, tzinfo=UTC)), + ) + assert schedule == expected + + def test_generate_schedule_empty_if_start_after_end(self) -> None: + """Test empty schedule if start > end.""" + start = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_schedule( + start, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + + assert schedule == () + + def test_generate_schedule_empty_if_start_zero_or_negative(self) -> None: + """Test empty schedule if start <= 0.""" + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) + + assert ( + generate_schedule( + 0, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + == () + ) + assert ( + generate_schedule( + -1, "1M", end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + == () + ) + + def test_generate_schedule_empty_if_end_zero_or_negative(self) -> None: + """Test empty schedule if end <= 0.""" + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + + assert ( + generate_schedule( + start, "1M", 0, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + == () + ) + assert ( + generate_schedule( + start, "1M", -1, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + == () + ) + + +class TestGenerateArraySchedule: + """Test generate_array_schedule function.""" + + def test_generate_single_segment_schedule(self) -> None: + """Test array schedule with single anchor/cycle.""" + anchors = [datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC))] + cycles = ["1M"] + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_array_schedule( + anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + + expected = ( + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 2, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), + ) + assert schedule == expected + + def test_generate_multi_segment_schedule(self) -> None: + """Test array schedule with multiple anchor/cycle pairs.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), + ] + cycles = ["1M", "3M"] + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_array_schedule( + anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + + # First segment: monthly Jan 1, Feb 1, Mar 1 (stops before Apr 1) + # Second segment: quarterly Apr 1, Jul 1, Oct 1 + # Plus end date Dec 31 + expected_dates = [ + datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 2, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 3, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 7, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 10, 1, 0, 0, 0, tzinfo=UTC), + datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC), + ] + expected = tuple(datetime_to_timestamp(dt) for dt in expected_dates) + assert schedule == expected + + def test_generate_array_schedule_deduplicates(self) -> None: + """Test array schedule removes duplicates.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=UTC)), + ] + cycles = ["1M", "1M"] + end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_array_schedule( + anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + + # Should have unique dates: Jan 1, Feb 1, Mar 1, Apr 1, May 1 + assert len(schedule) == len(set(schedule)) + + def test_generate_array_schedule_sorts_dates(self) -> None: + """Test array schedule returns sorted dates.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=UTC)), + ] + cycles = ["1M", "1M"] + end = datetime_to_timestamp(datetime(2024, 5, 1, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_array_schedule( + anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + + # Should be sorted + assert schedule == tuple(sorted(schedule)) + + def test_generate_array_schedule_includes_end(self) -> None: + """Test array schedule always includes end date.""" + anchors = [datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC))] + cycles = ["1M"] + end = datetime_to_timestamp(datetime(2024, 3, 15, 0, 0, 0, tzinfo=UTC)) + + schedule = generate_array_schedule( + anchors, cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + + assert schedule[-1] == end + + def test_generate_array_schedule_empty_anchors(self) -> None: + """Test array schedule with empty anchors returns empty.""" + schedule = generate_array_schedule( + [], [], 1000000, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + assert schedule == () + + def test_generate_array_schedule_raises_if_length_mismatch(self) -> None: + """Test array schedule raises if anchors and cycles have different lengths.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), + ] + cycles = ["1M"] # Only one cycle for two anchors + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) + + with pytest.raises( + ValueError, match="anchors and cycles must have same length" + ): + generate_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + + def test_generate_array_schedule_empty_if_end_zero_or_negative(self) -> None: + """Test array schedule returns empty tuple if end <= 0.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + ] + cycles = ["1M"] + + assert ( + generate_array_schedule( + anchors, + cycles, + 0, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + == () + ) + assert ( + generate_array_schedule( + anchors, + cycles, + -1, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + == () + ) + + def test_generate_array_schedule_empty_if_anchor_invalid(self) -> None: + """Test array schedule returns empty tuple if any anchor is invalid.""" + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) + cycles = ["1M"] + + # Test anchor <= 0 + assert ( + generate_array_schedule( + [0], cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + == () + ) + assert ( + generate_array_schedule( + [-1], cycles, end, end_of_month_convention=EndOfMonthConvention.SAME_DAY + ) + == () + ) + + # Test anchor > end + anchors = [end + 1000] + assert ( + generate_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + == () + ) + + def test_generate_array_schedule_raises_if_anchors_descending(self) -> None: + """Test array schedule raises if anchors are in descending order.""" + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) + cycles = ["1M", "1M"] + + # Test descending order + anchors = [ + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + ] + with pytest.raises( + ValueError, match="anchors must be in strictly ascending order" + ): + generate_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + + def test_generate_array_schedule_raises_if_anchors_equal(self) -> None: + """Test array schedule raises if anchors are equal (not strictly ascending).""" + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) + cycles = ["1M", "1M"] + + # Test equal anchors (not strictly ascending) + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + ] + with pytest.raises( + ValueError, match="anchors must be in strictly ascending order" + ): + generate_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + + def test_generate_array_schedule_raises_if_anchors_partially_unsorted( + self, + ) -> None: + """Test array schedule raises if anchors are partially unsorted.""" + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) + cycles = ["1M", "1M", "1M"] + + # First two in order, but third is out of order + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 2, 1, 0, 0, 0, tzinfo=UTC)), + ] + with pytest.raises( + ValueError, match="anchors must be in strictly ascending order" + ): + generate_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + ) + + +class TestResolveCycleSchedule: + """Test resolve_cycle_schedule function.""" + + def test_resolve_cycle_schedule_no_adjustment(self) -> None: + """Test resolve_cycle_schedule with NO_SHIFT convention.""" + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) + + schedule = resolve_cycle_schedule( + start, + "1M", + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + business_day_convention=BusinessDayConvention.NO_SHIFT, + calendar=Calendar.NO_CALENDAR, + ) + + expected = ( + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 2, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 3, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), + ) + assert schedule == expected + + def test_resolve_cycle_schedule_raises_for_unsupported_bdc(self) -> None: + """Test raises error for unsupported business day convention.""" + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) + + with pytest.raises( + UnsupportedActusFeatureError, match="Business Day Convention" + ): + resolve_cycle_schedule( + start, + "1M", + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + calendar=Calendar.NO_CALENDAR, + ) + + def test_resolve_cycle_schedule_raises_for_unsupported_calendar(self) -> None: + """Test raises error for unsupported calendar.""" + start = datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)) + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) + + with pytest.raises(UnsupportedActusFeatureError, match="Calendar"): + resolve_cycle_schedule( + start, + "1M", + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + business_day_convention=BusinessDayConvention.NO_SHIFT, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) + + +class TestResolveArraySchedule: + """Test resolve_array_schedule function.""" + + def test_resolve_array_schedule_no_adjustment(self) -> None: + """Test resolve_array_schedule with NO_SHIFT convention.""" + anchors = [ + datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)), + ] + cycles = ["1M", "3M"] + end = datetime_to_timestamp(datetime(2024, 12, 31, 0, 0, 0, tzinfo=UTC)) + + schedule = resolve_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + business_day_convention=BusinessDayConvention.NO_SHIFT, + calendar=Calendar.NO_CALENDAR, + ) + + # Should have dates from both segments plus end + assert len(schedule) > 0 + assert schedule[-1] == end + + def test_resolve_array_schedule_raises_for_unsupported_bdc(self) -> None: + """Test raises error for unsupported business day convention.""" + anchors = [datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC))] + cycles = ["1M"] + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) + + with pytest.raises( + UnsupportedActusFeatureError, match="Business Day Convention" + ): + resolve_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + business_day_convention=BusinessDayConvention.SHIFT_CALCULATE_FOLLOWING, + calendar=Calendar.NO_CALENDAR, + ) + + def test_resolve_array_schedule_raises_for_unsupported_calendar(self) -> None: + """Test raises error for unsupported calendar.""" + anchors = [datetime_to_timestamp(datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC))] + cycles = ["1M"] + end = datetime_to_timestamp(datetime(2024, 4, 1, 0, 0, 0, tzinfo=UTC)) + + with pytest.raises(UnsupportedActusFeatureError, match="Calendar"): + resolve_array_schedule( + anchors, + cycles, + end, + end_of_month_convention=EndOfMonthConvention.SAME_DAY, + business_day_convention=BusinessDayConvention.NO_SHIFT, + calendar=Calendar.MONDAY_TO_FRIDAY, + ) diff --git a/tests/sdk/test_unix_time.py b/tests/sdk/test_unix_time.py new file mode 100644 index 00000000..6ee11380 --- /dev/null +++ b/tests/sdk/test_unix_time.py @@ -0,0 +1,132 @@ +"""Tests for d_asa.unix_time module.""" + +from __future__ import annotations + +from datetime import UTC, datetime + +from d_asa.unix_time import datetime_to_timestamp, timestamp_to_datetime + + +class TestTimestampToDatetime: + """Test timestamp_to_datetime function.""" + + def test_converts_epoch_zero(self) -> None: + """Test conversion of epoch 0 (1970-01-01 00:00:00 UTC).""" + result = timestamp_to_datetime(0) + expected = datetime(1970, 1, 1, 0, 0, 0, tzinfo=UTC) + assert result == expected + + def test_converts_positive_timestamp(self) -> None: + """Test conversion of a positive timestamp.""" + # 2024-01-15 12:30:45 UTC + timestamp = 1705321845 + result = timestamp_to_datetime(timestamp) + expected = datetime(2024, 1, 15, 12, 30, 45, tzinfo=UTC) + assert result == expected + + def test_converts_negative_timestamp(self) -> None: + """Test conversion of a negative timestamp (before epoch).""" + # 1969-12-31 23:59:59 UTC + timestamp = -1 + result = timestamp_to_datetime(timestamp) + expected = datetime(1969, 12, 31, 23, 59, 59, tzinfo=UTC) + assert result == expected + + def test_result_is_utc_aware(self) -> None: + """Test that result has UTC timezone info.""" + result = timestamp_to_datetime(1705321845) + assert result.tzinfo is UTC + assert result.utcoffset() == UTC.utcoffset(None) + + def test_converts_leap_year_date(self) -> None: + """Test conversion on leap year Feb 29.""" + # 2024-02-29 00:00:00 UTC (leap year) + timestamp = 1709164800 + result = timestamp_to_datetime(timestamp) + expected = datetime(2024, 2, 29, 0, 0, 0, tzinfo=UTC) + assert result == expected + + def test_converts_various_dates(self) -> None: + """Test conversion of various important dates.""" + test_cases = [ + (1672531200, datetime(2023, 1, 1, 0, 0, 0, tzinfo=UTC)), + (1704067200, datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC)), + (1735689600, datetime(2025, 1, 1, 0, 0, 0, tzinfo=UTC)), + ] + for timestamp, expected in test_cases: + result = timestamp_to_datetime(timestamp) + assert result == expected + + +class TestDatetimeToTimestamp: + """Test datetime_to_timestamp function.""" + + def test_converts_epoch_zero(self) -> None: + """Test conversion of epoch datetime.""" + dt = datetime(1970, 1, 1, 0, 0, 0, tzinfo=UTC) + result = datetime_to_timestamp(dt) + assert result == 0 + + def test_converts_aware_datetime(self) -> None: + """Test conversion of timezone-aware datetime.""" + dt = datetime(2024, 1, 15, 12, 30, 45, tzinfo=UTC) + result = datetime_to_timestamp(dt) + assert result == 1705321845 + + def test_converts_naive_datetime_as_utc(self) -> None: + """Test conversion of naive datetime (treated as UTC).""" + dt = datetime(2024, 1, 15, 12, 30, 45) + result = datetime_to_timestamp(dt) + assert result == 1705321845 + + def test_converts_leap_year_date(self) -> None: + """Test conversion on leap year Feb 29.""" + dt = datetime(2024, 2, 29, 0, 0, 0, tzinfo=UTC) + result = datetime_to_timestamp(dt) + assert result == 1709164800 + + def test_converts_various_dates(self) -> None: + """Test conversion of various important dates.""" + test_cases = [ + (datetime(2023, 1, 1, 0, 0, 0, tzinfo=UTC), 1672531200), + (datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC), 1704067200), + (datetime(2025, 1, 1, 0, 0, 0, tzinfo=UTC), 1735689600), + ] + for dt, expected in test_cases: + result = datetime_to_timestamp(dt) + assert result == expected + + +class TestRoundTrip: + """Test round-trip conversions between timestamp and datetime.""" + + def test_timestamp_to_datetime_to_timestamp(self) -> None: + """Test converting timestamp -> datetime -> timestamp preserves value.""" + original = 1705324245 + dt = timestamp_to_datetime(original) + result = datetime_to_timestamp(dt) + assert result == original + + def test_datetime_to_timestamp_to_datetime(self) -> None: + """Test converting datetime -> timestamp -> datetime preserves value.""" + original = datetime(2024, 1, 15, 12, 30, 45, tzinfo=UTC) + timestamp = datetime_to_timestamp(original) + result = timestamp_to_datetime(timestamp) + assert result == original + + def test_roundtrip_multiple_values(self) -> None: + """Test round-trip conversion for multiple timestamps.""" + timestamps = [0, 1, 1000000, 1705321845, 1735689600, -1] + for original in timestamps: + dt = timestamp_to_datetime(original) + result = datetime_to_timestamp(dt) + assert result == original + + def test_roundtrip_naive_datetime_becomes_aware(self) -> None: + """Test naive datetime becomes aware after round-trip.""" + naive_dt = datetime(2024, 1, 15, 12, 30, 45) + timestamp = datetime_to_timestamp(naive_dt) + result_dt = timestamp_to_datetime(timestamp) + assert result_dt.tzinfo is UTC + # Values should be equal ignoring timezone + assert result_dt.replace(tzinfo=None) == naive_dt diff --git a/tests/shared/__init__.py b/tests/shared/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/shared/cases.py b/tests/shared/cases.py deleted file mode 100644 index b1ab8b25..00000000 --- a/tests/shared/cases.py +++ /dev/null @@ -1,340 +0,0 @@ -from __future__ import annotations - -from collections.abc import Callable -from dataclasses import dataclass -from typing import Any - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AccountOpenArgs as FixedAccountOpenArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetConfigArgs as FixedAssetConfigArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetCreateArgs as FixedAssetCreateArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetMetadata as FixedAssetMetadata, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - AssetUpdateArgs as FixedAssetUpdateArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondFactory, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - PrimaryDistributionArgs as FixedPrimaryDistributionArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - RbacAssignRoleArgs as FixedRbacAssignRoleArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - RbacGovAssetSuspensionArgs as FixedRbacGovAssetSuspensionArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - SetDefaultStatusArgs as FixedSetDefaultStatusArgs, -) -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - SetSecondaryTimeEventsArgs as FixedSetSecondaryTimeEventsArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AccountOpenArgs as PerpetualAccountOpenArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetConfigArgs as PerpetualAssetConfigArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetCreateArgs as PerpetualAssetCreateArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetMetadata as PerpetualAssetMetadata, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - AssetUpdateArgs as PerpetualAssetUpdateArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PerpetualBondFactory, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PrimaryDistributionArgs as PerpetualPrimaryDistributionArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - RbacAssignRoleArgs as PerpetualRbacAssignRoleArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - RbacGovAssetSuspensionArgs as PerpetualRbacGovAssetSuspensionArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - SetDefaultStatusArgs as PerpetualSetDefaultStatusArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - SetSecondaryTimeEventsArgs as PerpetualSetSecondaryTimeEventsArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AccountOpenArgs as ZeroAccountOpenArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetConfigArgs as ZeroAssetConfigArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetCreateArgs as ZeroAssetCreateArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetMetadata as ZeroAssetMetadata, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetUpdateArgs as ZeroAssetUpdateArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - PrimaryDistributionArgs as ZeroPrimaryDistributionArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - RbacAssignRoleArgs as ZeroRbacAssignRoleArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - RbacGovAssetSuspensionArgs as ZeroRbacGovAssetSuspensionArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - SetDefaultStatusArgs as ZeroSetDefaultStatusArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - SetSecondaryTimeEventsArgs as ZeroSetSecondaryTimeEventsArgs, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - ZeroCouponBondFactory, -) -from tests import utils -from tests.conftest import ( - APR, - ISSUANCE_DELAY, - MATURITY_DELAY, - MINIMUM_DENOMINATION, - PRIMARY_DISTRIBUTION_DELAY, - PRIMARY_DISTRIBUTION_DURATION, - PRINCIPAL, -) - -_FIXED_TOTAL_COUPONS = 2 -_FIXED_COUPON_RATE = APR // _FIXED_TOTAL_COUPONS -_FIXED_COUPON_RATE_INCREASE = 5 -_FIXED_COUPON_RATES = [ - _FIXED_COUPON_RATE + idx * _FIXED_COUPON_RATE_INCREASE - for idx in range(_FIXED_TOTAL_COUPONS) -] -_FIXED_INTEREST_RATE = sum(_FIXED_COUPON_RATES) -_FIXED_COUPON_PERIOD = 30 * sc_cst.DAY_2_SEC - -_ZERO_MATURITY_DELAY = 366 * sc_cst.DAY_2_SEC -_PERPETUAL_COUPON_PERIOD = 360 * sc_cst.DAY_2_SEC - - -@dataclass(frozen=True) -class ContractCapabilities: - has_maturity: bool - has_coupon: bool - has_principal: bool - has_time_periods: bool - has_coupon_rates: bool - - -@dataclass(frozen=True) -class ContractCase: - name: str - metadata_contract_type: int - prospectus_url: str - factory_class: Any - asset_metadata_cls: Any - asset_create_args_cls: Any - asset_config_args_cls: Any - asset_update_args_cls: Any - account_open_args_cls: Any - primary_distribution_args_cls: Any - set_secondary_time_events_args_cls: Any - rbac_assign_role_args_cls: Any - rbac_gov_asset_suspension_args_cls: Any - set_default_status_args_cls: Any - capabilities: ContractCapabilities - build_time_events: Callable[[int], utils.TimeEvents] - build_config: Callable[[utils.Currency, utils.TimeEvents, int], utils.DAsaConfig] - secondary_market_time_events: Callable[[Any], list[int]] - - def total_asa_funds(self, cfg: utils.DAsaConfig) -> int: - funding_rate = ( - cfg.interest_rate if cfg.interest_rate else cfg.principal_discount - ) - return cfg.principal * (sc_cst.BPS + funding_rate) // sc_cst.BPS - - -def _zero_time_events(current_ts: int) -> utils.TimeEvents: - primary_open = current_ts + PRIMARY_DISTRIBUTION_DELAY - primary_close = primary_open + PRIMARY_DISTRIBUTION_DURATION - issuance_date = primary_close + ISSUANCE_DELAY - maturity_date = issuance_date + _ZERO_MATURITY_DELAY - return [primary_open, primary_close, issuance_date, maturity_date] - - -def _fixed_time_events(current_ts: int) -> utils.TimeEvents: - primary_open = current_ts + PRIMARY_DISTRIBUTION_DELAY - primary_close = primary_open + PRIMARY_DISTRIBUTION_DURATION - issuance_date = primary_close + ISSUANCE_DELAY - coupon_dates = [ - issuance_date + idx * _FIXED_COUPON_PERIOD - for idx in range(1, _FIXED_TOTAL_COUPONS + 1) - ] - maturity_date = coupon_dates[-1] + MATURITY_DELAY - return [primary_open, primary_close, issuance_date, *coupon_dates, maturity_date] - - -def _perpetual_time_events(current_ts: int) -> utils.TimeEvents: - primary_open = current_ts + PRIMARY_DISTRIBUTION_DELAY - primary_close = primary_open + PRIMARY_DISTRIBUTION_DURATION - issuance_date = primary_close + ISSUANCE_DELAY - return [primary_open, primary_close, issuance_date] - - -def _zero_config( - currency: utils.Currency, - time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return utils.DAsaConfig( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=APR, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=day_count_convention, - interest_rate=0, - coupon_rates=[], - time_events=time_events, - time_periods=[], - ) - - -def _fixed_config( - currency: utils.Currency, - time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return utils.DAsaConfig( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=0, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=day_count_convention, - interest_rate=_FIXED_INTEREST_RATE, - coupon_rates=_FIXED_COUPON_RATES, - time_events=time_events, - time_periods=[], - ) - - -def _perpetual_config( - currency: utils.Currency, - time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return utils.DAsaConfig( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=0, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=day_count_convention, - interest_rate=APR, - coupon_rates=[], - time_events=time_events, - time_periods=[(_PERPETUAL_COUPON_PERIOD, 0)], - ) - - -def _secondary_schedule_with_maturity(state: Any) -> list[int]: - return [state.issuance_date, state.maturity_date] - - -def _secondary_schedule_perpetual(state: Any) -> list[int]: - return [state.issuance_date] - - -CONTRACT_CASES = ( - ContractCase( - name="zero_coupon_bond", - metadata_contract_type=sc_cst.CT_PAM, - prospectus_url="Zero Coupon Bond Prospectus", - factory_class=ZeroCouponBondFactory, - asset_metadata_cls=ZeroAssetMetadata, - asset_create_args_cls=ZeroAssetCreateArgs, - asset_config_args_cls=ZeroAssetConfigArgs, - asset_update_args_cls=ZeroAssetUpdateArgs, - account_open_args_cls=ZeroAccountOpenArgs, - primary_distribution_args_cls=ZeroPrimaryDistributionArgs, - set_secondary_time_events_args_cls=ZeroSetSecondaryTimeEventsArgs, - rbac_assign_role_args_cls=ZeroRbacAssignRoleArgs, - rbac_gov_asset_suspension_args_cls=ZeroRbacGovAssetSuspensionArgs, - set_default_status_args_cls=ZeroSetDefaultStatusArgs, - capabilities=ContractCapabilities( - has_maturity=True, - has_coupon=False, - has_principal=True, - has_time_periods=False, - has_coupon_rates=False, - ), - build_time_events=_zero_time_events, - build_config=_zero_config, - secondary_market_time_events=_secondary_schedule_with_maturity, - ), - ContractCase( - name="fixed_coupon_bond", - metadata_contract_type=sc_cst.CT_PAM, - prospectus_url="Fixed Coupon Bond Prospectus", - factory_class=FixedCouponBondFactory, - asset_metadata_cls=FixedAssetMetadata, - asset_create_args_cls=FixedAssetCreateArgs, - asset_config_args_cls=FixedAssetConfigArgs, - asset_update_args_cls=FixedAssetUpdateArgs, - account_open_args_cls=FixedAccountOpenArgs, - primary_distribution_args_cls=FixedPrimaryDistributionArgs, - set_secondary_time_events_args_cls=FixedSetSecondaryTimeEventsArgs, - rbac_assign_role_args_cls=FixedRbacAssignRoleArgs, - rbac_gov_asset_suspension_args_cls=FixedRbacGovAssetSuspensionArgs, - set_default_status_args_cls=FixedSetDefaultStatusArgs, - capabilities=ContractCapabilities( - has_maturity=True, - has_coupon=True, - has_principal=True, - has_time_periods=False, - has_coupon_rates=True, - ), - build_time_events=_fixed_time_events, - build_config=_fixed_config, - secondary_market_time_events=_secondary_schedule_with_maturity, - ), - ContractCase( - name="perpetual_bond", - metadata_contract_type=sc_cst.CT_PBN, - prospectus_url="Perpetual Bond Prospectus", - factory_class=PerpetualBondFactory, - asset_metadata_cls=PerpetualAssetMetadata, - asset_create_args_cls=PerpetualAssetCreateArgs, - asset_config_args_cls=PerpetualAssetConfigArgs, - asset_update_args_cls=PerpetualAssetUpdateArgs, - account_open_args_cls=PerpetualAccountOpenArgs, - primary_distribution_args_cls=PerpetualPrimaryDistributionArgs, - set_secondary_time_events_args_cls=PerpetualSetSecondaryTimeEventsArgs, - rbac_assign_role_args_cls=PerpetualRbacAssignRoleArgs, - rbac_gov_asset_suspension_args_cls=PerpetualRbacGovAssetSuspensionArgs, - set_default_status_args_cls=PerpetualSetDefaultStatusArgs, - capabilities=ContractCapabilities( - has_maturity=False, - has_coupon=True, - has_principal=False, - has_time_periods=True, - has_coupon_rates=False, - ), - build_time_events=_perpetual_time_events, - build_config=_perpetual_config, - secondary_market_time_events=_secondary_schedule_perpetual, - ), -) diff --git a/tests/shared/conftest.py b/tests/shared/conftest.py deleted file mode 100644 index da7988fa..00000000 --- a/tests/shared/conftest.py +++ /dev/null @@ -1,229 +0,0 @@ -from collections.abc import Callable -from typing import Any - -import pytest -from algokit_utils import AlgorandClient, SigningAccount - -from smart_contracts import constants as sc_cst -from tests import conftest_helpers as helpers -from tests import utils -from tests.conftest import INITIAL_D_ASA_UNITS - -from .cases import CONTRACT_CASES, ContractCase - - -@pytest.fixture(scope="function", params=CONTRACT_CASES, ids=lambda case: case.name) -def contract_case(request: pytest.FixtureRequest) -> ContractCase: - return request.param - - -@pytest.fixture(scope="function") -def shared_asset_metadata(contract_case: ContractCase) -> Any: - return contract_case.asset_metadata_cls( - contract_type=contract_case.metadata_contract_type, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url=contract_case.prospectus_url, - ) - - -@pytest.fixture(scope="function") -def shared_time_events( - algorand: AlgorandClient, - contract_case: ContractCase, -) -> utils.TimeEvents: - current_ts = utils.get_latest_timestamp(algorand.client.algod) - return contract_case.build_time_events(current_ts) - - -@pytest.fixture(scope="function") -def shared_cfg( - contract_case: ContractCase, - currency: utils.Currency, - shared_time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return contract_case.build_config( - currency, shared_time_events, day_count_convention - ) - - -@pytest.fixture(scope="function") -def shared_client_empty( - algorand: AlgorandClient, - arranger: SigningAccount, - contract_case: ContractCase, - shared_asset_metadata: Any, -) -> Any: - return helpers.create_and_fund_client( - algorand, - contract_case.factory_class, - arranger, - contract_case.asset_create_args_cls( - arranger=arranger.address, - metadata=shared_asset_metadata, - ), - ) - - -@pytest.fixture(scope="function") -def shared_account_manager( - algorand: AlgorandClient, - contract_case: ContractCase, - shared_client_empty: Any, -) -> utils.DAsaAccountManager: - return helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - shared_client_empty, - rbac_assign_role_args_class=contract_case.rbac_assign_role_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_authority( - algorand: AlgorandClient, - contract_case: ContractCase, - shared_client_empty: Any, -) -> utils.DAsaAuthority: - return helpers.create_role_account( - algorand, - utils.DAsaAuthority, - shared_client_empty, - rbac_assign_role_args_class=contract_case.rbac_assign_role_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_trustee( - algorand: AlgorandClient, - contract_case: ContractCase, - shared_client_empty: Any, -) -> utils.DAsaTrustee: - return helpers.create_role_account( - algorand, - utils.DAsaTrustee, - shared_client_empty, - rbac_assign_role_args_class=contract_case.rbac_assign_role_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_interest_oracle( - algorand: AlgorandClient, - contract_case: ContractCase, - shared_client_empty: Any, -) -> utils.DAsaInterestOracle: - return helpers.create_role_account( - algorand, - utils.DAsaInterestOracle, - shared_client_empty, - rbac_assign_role_args_class=contract_case.rbac_assign_role_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_client_active( - algorand: AlgorandClient, - bank: SigningAccount, - contract_case: ContractCase, - shared_cfg: utils.DAsaConfig, - shared_client_empty: Any, -) -> Any: - return helpers.activate_client_with_config_and_funding( - algorand, - shared_client_empty, - bank, - shared_cfg, - contract_case.total_asa_funds(shared_cfg), - contract_case.asset_config_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_primary_dealer( - algorand: AlgorandClient, - contract_case: ContractCase, - shared_client_active: Any, -) -> utils.DAsaPrimaryDealer: - state = shared_client_active.state.global_state - role_config = utils.set_role_config( - state.primary_distribution_opening_date, - state.primary_distribution_closure_date, - ) - return helpers.create_role_account( - algorand, - utils.DAsaPrimaryDealer, - shared_client_active, - role_config, - contract_case.rbac_assign_role_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_account_factory( - algorand: AlgorandClient, - currency: utils.Currency, - shared_account_manager: utils.DAsaAccountManager, - contract_case: ContractCase, -) -> Callable[[Any], utils.DAsaAccount]: - return helpers.build_account_factory( - algorand, - currency, - shared_account_manager, - contract_case.account_open_args_cls, - ) - - -@pytest.fixture(scope="function") -def shared_client_primary( - contract_case: ContractCase, - shared_client_active: Any, -) -> Any: - state = shared_client_active.state.global_state - return helpers.set_client_to_primary_phase( - shared_client_active, - contract_case.set_secondary_time_events_args_cls, - contract_case.secondary_market_time_events(state), - ) - - -@pytest.fixture(scope="function") -def shared_account_with_units_factory( - shared_account_factory: Callable[[Any], utils.DAsaAccount], - shared_primary_dealer: utils.DAsaPrimaryDealer, - shared_client_primary: Any, - contract_case: ContractCase, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_with_units_factory( - shared_account_factory, - shared_primary_dealer, - shared_client_primary, - contract_case.primary_distribution_args_cls, - INITIAL_D_ASA_UNITS, - ) - - -@pytest.fixture(scope="function") -def shared_account_a( - shared_account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return shared_account_with_units_factory() - - -@pytest.fixture(scope="function") -def shared_account_b( - shared_account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return shared_account_with_units_factory(units=2 * INITIAL_D_ASA_UNITS) - - -@pytest.fixture(scope="function") -def shared_client_ongoing(shared_client_primary: Any) -> Any: - state = shared_client_primary.state.global_state - utils.time_warp(state.issuance_date) - return shared_client_primary diff --git a/tests/shared/test_asset_config.py b/tests/shared/test_asset_config.py deleted file mode 100644 index 01e45f48..00000000 --- a/tests/shared/test_asset_config.py +++ /dev/null @@ -1,267 +0,0 @@ -import re -from copy import deepcopy -from typing import Any - -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import constants as sc_cst -from smart_contracts import enums -from smart_contracts import errors as err - -from .cases import ContractCase - - -def test_pass_asset_config( - contract_case: ContractCase, - currency: Any, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**shared_cfg.dictify()) - ) - - state = shared_client_empty.state.global_state - expected_time_events = shared_client_empty.send.get_time_events().abi_return - - assert state.denomination_asset_id == currency.id - assert state.settlement_asset_id == state.denomination_asset_id - assert state.unit_value == shared_cfg.minimum_denomination - assert state.day_count_convention == shared_cfg.day_count_convention - - assert state.total_units == shared_cfg.principal // shared_cfg.minimum_denomination - assert not state.circulating_units - assert state.principal_discount == shared_cfg.principal_discount - assert state.interest_rate == shared_cfg.interest_rate - assert state.total_coupons == shared_cfg.total_coupons - - if contract_case.capabilities.has_coupon_rates: - expected_coupon_rates = shared_client_empty.send.get_coupon_rates().abi_return - assert expected_coupon_rates == shared_cfg.coupon_rates - - if contract_case.capabilities.has_time_periods: - expected_time_periods = shared_client_empty.send.get_time_periods().abi_return - assert expected_time_periods[0][0] == shared_cfg.time_periods[0][0] - assert expected_time_periods[0][1] == shared_cfg.time_periods[0][1] - assert state.coupon_period == shared_cfg.time_periods[0][0] - - assert expected_time_events == shared_cfg.time_events - assert state.primary_distribution_opening_date == shared_cfg.time_events[0] - assert state.primary_distribution_closure_date == shared_cfg.time_events[1] - assert state.issuance_date == shared_cfg.time_events[2] - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - - if contract_case.capabilities.has_maturity: - assert state.maturity_date == shared_cfg.time_events[-1] - else: - assert not state.maturity_date - - assert state.status == enums.STATUS_ACTIVE - assert not state.asset_suspended - - -def test_fail_unauthorized( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**shared_cfg.dictify()), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_already_configured( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_active: Any, -) -> None: - with pytest.raises(LogicError, match=err.ALREADY_CONFIGURED): - shared_client_active.send.asset_config( - contract_case.asset_config_args_cls(**shared_cfg.dictify()) - ) - - -def test_fail_invalid_denomination( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.denomination_asset_id = 0 - with pytest.raises(LogicError, match=err.INVALID_DENOMINATION): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_minimum_denomination( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.minimum_denomination -= 1 - with pytest.raises(LogicError, match=err.INVALID_MINIMUM_DENOMINATION): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_day_count_convention( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.day_count_convention = sc_cst.DCC_CONT - 1 - with pytest.raises(LogicError, match=err.INVALID_DAY_COUNT_CONVENTION): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_interest_rate( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.interest_rate = 1 if shared_cfg.principal_discount else 0 - with pytest.raises(LogicError, match=err.INVALID_INTEREST_RATE): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_coupon_rates( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.coupon_rates = [] if contract_case.capabilities.has_coupon_rates else [1] - with pytest.raises(LogicError, match=err.INVALID_COUPON_RATES): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_time_events_length( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_events = [*shared_cfg.time_events, 0] - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_time( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_events[0] = 0 - with pytest.raises(LogicError, match=err.INVALID_TIME): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_sorting( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_events[-1] = shared_cfg.time_events[-2] - with pytest.raises(LogicError, match=err.INVALID_SORTING): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_representation( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_periods = ( - [] if contract_case.capabilities.has_time_periods else [(1, 1)] - ) - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIODS): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_settlement_asset( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.settlement_asset_id = wrong_cfg.denomination_asset_id + 1 - with pytest.raises(LogicError, match=err.INVALID_SETTLEMENT_ASSET): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_for_actual_actual( - contract_case: ContractCase, - day_count_convention: int, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - if day_count_convention != sc_cst.DCC_A_A: - pytest.skip("requires Actual/Actual day count convention") - - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_events[1] = wrong_cfg.time_events[0] + 1 - with pytest.raises(LogicError, match=re.escape(err.INVALID_TIME_PERIOD)): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_duration_for_perpetual( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - if not contract_case.capabilities.has_time_periods: - pytest.skip("contract has no recurring time periods") - - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_periods[0] = (0, 0) - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIOD_DURATION): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_repetitions_for_perpetual( - contract_case: ContractCase, - shared_cfg: Any, - shared_client_empty: Any, -) -> None: - if not contract_case.capabilities.has_time_periods: - pytest.skip("contract has no recurring time periods") - - wrong_cfg = deepcopy(shared_cfg) - wrong_cfg.time_periods[0] = (shared_cfg.time_periods[0][0], 1) - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIOD_REPETITIONS): - shared_client_empty.send.asset_config( - contract_case.asset_config_args_cls(**wrong_cfg.dictify()) - ) diff --git a/tests/shared/test_asset_create.py b/tests/shared/test_asset_create.py deleted file mode 100644 index 52b669e4..00000000 --- a/tests/shared/test_asset_create.py +++ /dev/null @@ -1,58 +0,0 @@ -from typing import Any - -from algokit_utils import SigningAccount - -from smart_contracts import enums - -from .cases import ContractCase - - -def test_pass_asset_create( - arranger: SigningAccount, - contract_case: ContractCase, - shared_asset_metadata: Any, - shared_client_empty: Any, -) -> None: - state = shared_client_empty.state.global_state - - assert state.arranger == arranger.address - assert not state.denomination_asset_id - assert not state.settlement_asset_id - assert not state.unit_value - assert not state.day_count_convention - - metadata = shared_client_empty.send.get_asset_metadata().abi_return - assert metadata.contract_type == shared_asset_metadata.contract_type - assert metadata.calendar == shared_asset_metadata.calendar - assert ( - metadata.business_day_convention - == shared_asset_metadata.business_day_convention - ) - assert ( - metadata.end_of_month_convention - == shared_asset_metadata.end_of_month_convention - ) - assert metadata.prepayment_effect == shared_asset_metadata.prepayment_effect - assert metadata.penalty_type == shared_asset_metadata.penalty_type - assert bytes(metadata.prospectus_hash) == shared_asset_metadata.prospectus_hash - assert metadata.prospectus_url == shared_asset_metadata.prospectus_url - - assert not state.total_units - assert not state.circulating_units - assert not state.principal_discount - assert not state.total_coupons - - if contract_case.capabilities.has_coupon and hasattr(state, "paid_coupon_units"): - assert not state.paid_coupon_units - if contract_case.capabilities.has_time_periods and hasattr(state, "coupon_period"): - assert not state.coupon_period - - assert not state.primary_distribution_opening_date - assert not state.primary_distribution_closure_date - assert not state.issuance_date - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert not state.maturity_date - - assert state.status == enums.STATUS_INACTIVE - assert not state.asset_suspended diff --git a/tests/shared/test_asset_update.py b/tests/shared/test_asset_update.py deleted file mode 100644 index 9ac83d89..00000000 --- a/tests/shared/test_asset_update.py +++ /dev/null @@ -1,49 +0,0 @@ -from typing import Any - -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err - -from .cases import ContractCase - -_UPDATED_PROSPECTUS_URL = "Updated Prospectus" - - -def test_pass_asset_update( - contract_case: ContractCase, - shared_asset_metadata: Any, - shared_client_active: Any, -) -> None: - metadata = shared_client_active.send.get_asset_metadata().abi_return - assert metadata.prospectus_url == shared_asset_metadata.prospectus_url - - updated_metadata = contract_case.asset_metadata_cls( - contract_type=shared_asset_metadata.contract_type, - calendar=shared_asset_metadata.calendar, - business_day_convention=shared_asset_metadata.business_day_convention, - end_of_month_convention=shared_asset_metadata.end_of_month_convention, - prepayment_effect=shared_asset_metadata.prepayment_effect, - penalty_type=shared_asset_metadata.penalty_type, - prospectus_hash=shared_asset_metadata.prospectus_hash, - prospectus_url=_UPDATED_PROSPECTUS_URL, - ) - shared_client_active.send.update.asset_update( - contract_case.asset_update_args_cls(metadata=updated_metadata) - ) - - metadata = shared_client_active.send.get_asset_metadata().abi_return - assert metadata.prospectus_url == _UPDATED_PROSPECTUS_URL - - -def test_fail_unauthorized( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_asset_metadata: Any, - shared_client_active: Any, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.update.asset_update( - contract_case.asset_update_args_cls(metadata=shared_asset_metadata), - params=CommonAppCallParams(sender=no_role_account.address), - ) diff --git a/tests/shared/test_core_getters.py b/tests/shared/test_core_getters.py deleted file mode 100644 index a130b15f..00000000 --- a/tests/shared/test_core_getters.py +++ /dev/null @@ -1,86 +0,0 @@ -from typing import Any - -import pytest -from algokit_utils import CommonAppCallParams - -from smart_contracts import constants as sc_cst - -from .cases import ContractCase - - -def test_get_time_events_when_not_configured(shared_client_empty: Any) -> None: - assert not shared_client_empty.send.get_time_events().abi_return - - -def test_get_time_events_after_config( - shared_cfg: Any, shared_client_active: Any -) -> None: - assert ( - shared_client_active.send.get_time_events().abi_return == shared_cfg.time_events - ) - - -def test_get_asset_metadata( - shared_asset_metadata: Any, shared_client_empty: Any -) -> None: - metadata = shared_client_empty.send.get_asset_metadata().abi_return - assert metadata.contract_type == shared_asset_metadata.contract_type - assert metadata.prospectus_url == shared_asset_metadata.prospectus_url - - -def test_get_secondary_market_schedule_default(shared_client_active: Any) -> None: - schedule = shared_client_active.send.get_secondary_market_schedule().abi_return - assert schedule == [0, 0] - - -def test_get_asset_info_active(shared_cfg: Any, shared_client_active: Any) -> None: - info = shared_client_active.send.get_asset_info().abi_return - - assert info.denomination_asset_id == shared_cfg.denomination_asset_id - assert info.settlement_asset_id == shared_cfg.settlement_asset_id - assert info.outstanding_principal == 0 - assert info.unit_value == shared_cfg.minimum_denomination - assert info.day_count_convention == shared_cfg.day_count_convention - assert info.principal_discount == shared_cfg.principal_discount - assert info.interest_rate == shared_cfg.interest_rate - assert info.total_supply == shared_cfg.principal // shared_cfg.minimum_denomination - assert info.circulating_supply == 0 - assert info.primary_distribution_opening_date == shared_cfg.time_events[0] - assert info.primary_distribution_closure_date == shared_cfg.time_events[1] - assert info.issuance_date == shared_cfg.time_events[2] - if len(shared_cfg.time_events) > 3: - assert info.maturity_date == shared_cfg.time_events[-1] - else: - assert info.maturity_date == 0 - assert not info.suspended - assert info.performance == sc_cst.PRF_PERFORMANT - - -def test_get_asset_info_defaulted( - contract_case: ContractCase, - shared_client_ongoing: Any, - shared_trustee: Any, -) -> None: - shared_client_ongoing.send.set_default_status( - contract_case.set_default_status_args_cls(defaulted=True), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - info = shared_client_ongoing.send.get_asset_info().abi_return - assert info.performance == sc_cst.PRF_DEFAULTED - - -def test_get_asset_info_matured( - contract_case: ContractCase, - shared_client_primary: Any, -) -> None: - if not contract_case.capabilities.has_maturity: - pytest.skip("perpetual contract has no maturity date") - - state = shared_client_primary.state.global_state - from tests.utils import ( - time_warp, - ) # local import avoids circular fixture module import at load time - - time_warp(state.maturity_date + sc_cst.DAY_2_SEC) - info = shared_client_primary.send.get_asset_info().abi_return - assert info.performance == sc_cst.PRF_MATURED diff --git a/tests/shared/test_financial_error_paths.py b/tests/shared/test_financial_error_paths.py deleted file mode 100644 index 7159e123..00000000 --- a/tests/shared/test_financial_error_paths.py +++ /dev/null @@ -1,197 +0,0 @@ -from typing import Any - -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from tests import utils -from tests.utils import time_warp - -from .cases import ContractCase - - -def test_fail_get_account_units_current_value_no_primary_distribution( - no_role_account: SigningAccount, - shared_client_active: Any, -) -> None: - with pytest.raises(LogicError, match=err.NO_PRIMARY_DISTRIBUTION): - shared_client_active.send.get_account_units_current_value( - (no_role_account.address, 1) - ) - - -def test_fail_get_account_units_current_value_invalid_holding_address( - no_role_account: SigningAccount, - shared_client_primary: Any, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_primary.send.get_account_units_current_value( - (no_role_account.address, 1) - ) - - -def test_fail_get_account_units_current_value_invalid_units( - shared_account_a: utils.DAsaAccount, - shared_client_primary: Any, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_UNITS): - shared_client_primary.send.get_account_units_current_value( - (shared_account_a.holding_address, shared_account_a.units + 1) - ) - - -def test_fail_get_account_units_current_value_pending_coupon_payment( - contract_case: ContractCase, - shared_account_a: utils.DAsaAccount, - shared_account_b: utils.DAsaAccount, - shared_client_ongoing: Any, -) -> None: - if not contract_case.capabilities.has_coupon: - pytest.skip("contract has no coupons") - - next_coupon_due_date = ( - shared_client_ongoing.send.get_coupons_status().abi_return.next_coupon_due_date - ) - time_warp(next_coupon_due_date) - shared_client_ongoing.send.pay_coupon((shared_account_a.holding_address, b"")) - - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): - shared_client_ongoing.send.get_account_units_current_value( - (shared_account_b.holding_address, 1) - ) - - -def test_fail_pay_principal_unauthorized_status( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_client_empty: Any, -) -> None: - if not contract_case.capabilities.has_principal: - pytest.skip("contract has no principal payments") - - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_empty.send.pay_principal((no_role_account.address, b"")) - - -def test_fail_pay_principal_defaulted( - contract_case: ContractCase, - shared_account_a: utils.DAsaAccount, - shared_trustee: utils.DAsaTrustee, - shared_client_ongoing: Any, -) -> None: - if not contract_case.capabilities.has_principal: - pytest.skip("contract has no principal payments") - - shared_client_ongoing.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_ongoing.send.pay_principal( - (shared_account_a.holding_address, b"") - ) - - -def test_fail_pay_principal_suspended( - contract_case: ContractCase, - shared_account_a: utils.DAsaAccount, - shared_authority: utils.DAsaAuthority, - shared_client_ongoing: Any, -) -> None: - if not contract_case.capabilities.has_principal: - pytest.skip("contract has no principal payments") - - shared_client_ongoing.send.rbac_gov_asset_suspension( - (True,), - params=CommonAppCallParams(sender=shared_authority.address), - ) - with pytest.raises(LogicError, match=err.SUSPENDED): - shared_client_ongoing.send.pay_principal( - (shared_account_a.holding_address, b"") - ) - - -def test_fail_pay_coupon_unauthorized_status( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_client_empty: Any, -) -> None: - if not contract_case.capabilities.has_coupon: - pytest.skip("contract has no coupon payments") - - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_empty.send.pay_coupon((no_role_account.address, b"")) - - -def test_fail_pay_coupon_defaulted( - contract_case: ContractCase, - shared_account_a: utils.DAsaAccount, - shared_trustee: utils.DAsaTrustee, - shared_client_ongoing: Any, -) -> None: - if not contract_case.capabilities.has_coupon: - pytest.skip("contract has no coupon payments") - - shared_client_ongoing.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_ongoing.send.pay_coupon((shared_account_a.holding_address, b"")) - - -def test_fail_pay_coupon_suspended( - contract_case: ContractCase, - shared_account_a: utils.DAsaAccount, - shared_authority: utils.DAsaAuthority, - shared_client_ongoing: Any, -) -> None: - if not contract_case.capabilities.has_coupon: - pytest.skip("contract has no coupon payments") - - shared_client_ongoing.send.rbac_gov_asset_suspension( - (True,), - params=CommonAppCallParams(sender=shared_authority.address), - ) - with pytest.raises(LogicError, match=err.SUSPENDED): - shared_client_ongoing.send.pay_coupon((shared_account_a.holding_address, b"")) - - -def test_fail_update_interest_rate_defaulted( - contract_case: ContractCase, - shared_interest_oracle: utils.DAsaInterestOracle, - shared_trustee: utils.DAsaTrustee, - shared_client_ongoing: Any, -) -> None: - if contract_case.name != "perpetual_bond": - pytest.skip("only perpetual supports interest rate updates") - - shared_client_ongoing.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_ongoing.send.update_interest_rate( - (shared_client_ongoing.state.global_state.interest_rate + 1,), - params=CommonAppCallParams(sender=shared_interest_oracle.address), - ) - - -def test_fail_update_interest_rate_suspended( - contract_case: ContractCase, - shared_interest_oracle: utils.DAsaInterestOracle, - shared_authority: utils.DAsaAuthority, - shared_client_ongoing: Any, -) -> None: - if contract_case.name != "perpetual_bond": - pytest.skip("only perpetual supports interest rate updates") - - shared_client_ongoing.send.rbac_gov_asset_suspension( - (True,), - params=CommonAppCallParams(sender=shared_authority.address), - ) - with pytest.raises(LogicError, match=err.SUSPENDED): - shared_client_ongoing.send.update_interest_rate( - (shared_client_ongoing.state.global_state.interest_rate + 1,), - params=CommonAppCallParams(sender=shared_interest_oracle.address), - ) diff --git a/tests/shared/test_primary_distribution.py b/tests/shared/test_primary_distribution.py deleted file mode 100644 index fbe521b2..00000000 --- a/tests/shared/test_primary_distribution.py +++ /dev/null @@ -1,183 +0,0 @@ -from collections.abc import Callable -from typing import Any - -import pytest -from algokit_utils import ( - AlgorandClient, - CommonAppCallParams, - LogicError, - SigningAccount, -) - -from smart_contracts import errors as err -from tests.utils import DAsaAccount, get_latest_timestamp, time_warp - -from .cases import ContractCase - -_ACCOUNT_TEST_UNITS = 7 - - -def test_pass_primary_distribution( - contract_case: ContractCase, - shared_primary_dealer: Any, - shared_client_primary: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - state = shared_client_primary.state.global_state - assert state.circulating_units == 0 - - remaining_units = shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=_ACCOUNT_TEST_UNITS, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ).abi_return - - state = shared_client_primary.state.global_state - assert state.circulating_units == _ACCOUNT_TEST_UNITS - assert remaining_units == state.total_units - state.circulating_units - assert account.payment_address == account.holding_address - assert account.units == _ACCOUNT_TEST_UNITS - assert account.paid_coupons == 0 - - -def test_fail_primary_distribution_closed( - algorand: AlgorandClient, - contract_case: ContractCase, - shared_primary_dealer: Any, - shared_client_primary: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - state = shared_client_primary.state.global_state - time_warp(state.primary_distribution_closure_date) - assert ( - get_latest_timestamp(algorand.client.algod) - >= state.primary_distribution_closure_date - ) - - with pytest.raises(LogicError, match=err.PRIMARY_DISTRIBUTION_CLOSED): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=_ACCOUNT_TEST_UNITS, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ) - - -def test_fail_unauthorized( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_client_primary: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=_ACCOUNT_TEST_UNITS, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_holding_address( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_primary_dealer: Any, - shared_client_primary: Any, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=no_role_account.address, - units=_ACCOUNT_TEST_UNITS, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ) - - -def test_fail_defaulted_status( - contract_case: ContractCase, - shared_client_primary: Any, - shared_trustee: Any, - shared_primary_dealer: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - shared_client_primary.send.set_default_status( - contract_case.set_default_status_args_cls(defaulted=True), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=_ACCOUNT_TEST_UNITS, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ) - - -def test_fail_suspended( - contract_case: ContractCase, - shared_authority: Any, - shared_primary_dealer: Any, - shared_client_primary: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - shared_client_primary.send.rbac_gov_asset_suspension( - contract_case.rbac_gov_asset_suspension_args_cls(suspended=True), - params=CommonAppCallParams(sender=shared_authority.address), - ) - - with pytest.raises(LogicError, match=err.SUSPENDED): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=_ACCOUNT_TEST_UNITS, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ) - - -def test_fail_zero_units( - contract_case: ContractCase, - shared_primary_dealer: Any, - shared_client_primary: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - with pytest.raises(LogicError, match=err.ZERO_UNITS): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=0, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ) - - -def test_fail_over_distribution( - contract_case: ContractCase, - shared_primary_dealer: Any, - shared_client_primary: Any, - shared_account_factory: Callable[[Any], DAsaAccount], -) -> None: - account = shared_account_factory(shared_client_primary) - state = shared_client_primary.state.global_state - - with pytest.raises(LogicError, match=err.OVER_DISTRIBUTION): - shared_client_primary.send.primary_distribution( - contract_case.primary_distribution_args_cls( - holding_address=account.holding_address, - units=state.total_units + 1, - ), - params=CommonAppCallParams(sender=shared_primary_dealer.address), - ) diff --git a/tests/shared/test_secondary_schedule.py b/tests/shared/test_secondary_schedule.py deleted file mode 100644 index 776b0850..00000000 --- a/tests/shared/test_secondary_schedule.py +++ /dev/null @@ -1,172 +0,0 @@ -from collections.abc import Callable -from typing import Any - -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - PayPrincipalArgs, -) -from tests.utils import DAsaAccount, time_warp - -from .cases import ContractCase - - -def test_pass_set_secondary_time_events( - contract_case: ContractCase, - shared_client_active: Any, -) -> None: - state = shared_client_active.state.global_state - secondary_market_time_events = contract_case.secondary_market_time_events(state) - expected_schedule = shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=secondary_market_time_events, - ) - ).abi_return - - state = shared_client_active.state.global_state - assert state.secondary_market_opening_date == secondary_market_time_events[0] - assert ( - expected_schedule.secondary_market_opening_date - == secondary_market_time_events[0] - ) - - if contract_case.capabilities.has_maturity: - assert state.secondary_market_closure_date == secondary_market_time_events[1] - assert ( - expected_schedule.secondary_market_closure_date - == secondary_market_time_events[1] - ) - else: - assert state.secondary_market_closure_date == 0 - assert expected_schedule.secondary_market_closure_date == 0 - - -def test_fail_unauthorized_caller( - contract_case: ContractCase, - no_role_account: SigningAccount, - shared_client_active: Any, -) -> None: - state = shared_client_active.state.global_state - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=contract_case.secondary_market_time_events( - state - ) - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_unauthorized_status_ended( - contract_case: ContractCase, - shared_client_primary: Any, - shared_account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - if contract_case.name != "zero_coupon_bond": - pytest.skip("ended status scenario is stable only on zero coupon flow") - - account = shared_account_with_units_factory(units=1) - state = shared_client_primary.state.global_state - time_warp(state.maturity_date) - shared_client_primary.send.pay_principal( - PayPrincipalArgs(holding_address=account.holding_address, payment_info=b"") - ) - - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_primary.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=contract_case.secondary_market_time_events( - state - ) - ) - ) - - -def test_fail_defaulted_status( - contract_case: ContractCase, - shared_client_active: Any, - shared_trustee: Any, -) -> None: - state = shared_client_active.state.global_state - shared_client_active.send.set_default_status( - contract_case.set_default_status_args_cls(defaulted=True), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - - with pytest.raises(LogicError, match=err.DEFAULTED): - shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=contract_case.secondary_market_time_events( - state - ) - ) - ) - - -def test_fail_invalid_time_events_length( - contract_case: ContractCase, - shared_client_active: Any, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): - shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=[] - ) - ) - - -def test_fail_invalid_sorting( - contract_case: ContractCase, - shared_client_active: Any, -) -> None: - state = shared_client_active.state.global_state - invalid_schedule = [state.issuance_date + 2 * sc_cst.DAY_2_SEC, state.issuance_date] - with pytest.raises(LogicError, match=err.INVALID_SORTING): - shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=invalid_schedule, - ) - ) - - -def test_fail_invalid_secondary_opening_date( - contract_case: ContractCase, - shared_client_active: Any, -) -> None: - state = shared_client_active.state.global_state - with pytest.raises(LogicError, match=err.INVALID_SECONDARY_OPENING_DATE): - shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=( - [ - state.issuance_date - sc_cst.DAY_2_SEC, - state.maturity_date, - ] - if contract_case.capabilities.has_maturity - else [state.issuance_date - sc_cst.DAY_2_SEC] - ), - ) - ) - - -def test_fail_invalid_secondary_closure_date( - contract_case: ContractCase, - shared_client_active: Any, -) -> None: - if not contract_case.capabilities.has_maturity: - pytest.skip("perpetual contract has no maturity closure") - - state = shared_client_active.state.global_state - with pytest.raises(LogicError, match=err.INVALID_SECONDARY_CLOSURE_DATE): - shared_client_active.send.set_secondary_time_events( - contract_case.set_secondary_time_events_args_cls( - secondary_market_time_events=[ - state.issuance_date, - state.maturity_date + sc_cst.DAY_2_SEC, - ] - ) - ) diff --git a/tests/shared/test_set_default_status.py b/tests/shared/test_set_default_status.py deleted file mode 100644 index 01f4154a..00000000 --- a/tests/shared/test_set_default_status.py +++ /dev/null @@ -1,32 +0,0 @@ -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err - - -def test_concrete_pass_set_default_status( - shared_trustee, - shared_client_active, -) -> None: - shared_client_active.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - assert shared_client_active.state.global_state.asset_defaulted - - shared_client_active.send.set_default_status( - (False,), - params=CommonAppCallParams(sender=shared_trustee.address), - ) - assert not shared_client_active.state.global_state.asset_defaulted - - -def test_concrete_fail_unauthorized( - no_role_account: SigningAccount, - shared_client_active, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - shared_client_active.send.set_default_status( - (True,), - params=CommonAppCallParams(sender=no_role_account.address), - ) diff --git a/tests/test_mixin_composition_guards.py b/tests/test_mixin_composition_guards.py deleted file mode 100644 index 03343698..00000000 --- a/tests/test_mixin_composition_guards.py +++ /dev/null @@ -1,137 +0,0 @@ -from pathlib import Path -from textwrap import dedent - -import pytest - -from smart_contracts.mixin_composition import ( - CompositionValidationError, - validate_contract_composition, -) - -REPO_ROOT = Path(__file__).resolve().parents[1] -SMART_CONTRACTS_ROOT = REPO_ROOT / "smart_contracts" - - -def _validate_source(tmp_path: Path, source: str) -> None: - scratch_dir = SMART_CONTRACTS_ROOT / "_tmp_mixin_guards" - scratch_dir.mkdir(parents=True, exist_ok=True) - - source_path = scratch_dir / f"tmp_{tmp_path.name.replace('-', '_')}.py" - source_path.write_text(dedent(source), encoding="utf-8") - try: - validate_contract_composition(source_path, SMART_CONTRACTS_ROOT) - finally: - source_path.unlink(missing_ok=True) - # Remove directory if empty - try: - scratch_dir.rmdir() - except OSError: - pass - - -def test_pass_existing_fixed_coupon_contract() -> None: - validate_contract_composition( - SMART_CONTRACTS_ROOT / "fixed_coupon_bond" / "contract.py", - SMART_CONTRACTS_ROOT, - ) - - -def test_fail_coupon_transfer_without_coupon_cashflow(tmp_path: Path) -> None: - with pytest.raises( - CompositionValidationError, match="core_prepare_transfer_with_coupon" - ): - _validate_source( - tmp_path, - """ - from modules.transfer_agent import CouponTransferAgentMixin - - - class BrokenCouponTransfer(CouponTransferAgentMixin): - pass - """, - ) - - -def test_fail_coupon_transfer_wrong_mro_default_wins(tmp_path: Path) -> None: - with pytest.raises( - CompositionValidationError, match="core_prepare_transfer_with_coupon" - ): - _validate_source( - tmp_path, - """ - from modules.core_financial import FixedCouponCashflowMixin - from modules.transfer_agent import CouponTransferAgentMixin - - - class WrongOrderCouponTransfer( - CouponTransferAgentMixin, - FixedCouponCashflowMixin, - ): - pass - """, - ) - - -def test_fail_coupon_payment_without_coupon_cashflow(tmp_path: Path) -> None: - with pytest.raises(CompositionValidationError, match="core_prepare_coupon_payment"): - _validate_source( - tmp_path, - """ - from modules.payment_agent import CouponPaymentAgentMixin - - - class BrokenCouponPayment(CouponPaymentAgentMixin): - pass - """, - ) - - -def test_fail_coupon_counting_hook_not_overridden(tmp_path: Path) -> None: - with pytest.raises(CompositionValidationError, match="count_due_coupons"): - _validate_source( - tmp_path, - """ - from modules.core_financial import CouponCashflowMixin - from modules.payment_agent import CouponPaymentAgentMixin - - - class BrokenCouponCounting(CouponCashflowMixin, CouponPaymentAgentMixin): - pass - """, - ) - - -def test_fail_principal_payment_without_cashflow_provider(tmp_path: Path) -> None: - with pytest.raises( - CompositionValidationError, match="core_prepare_principal_payment" - ): - _validate_source( - tmp_path, - """ - from modules.payment_agent import PrincipalPaymentAgentMixin - - - class BrokenPrincipalPayment(PrincipalPaymentAgentMixin): - pass - """, - ) - - -def test_fail_principal_authorization_hook_not_overridden(tmp_path: Path) -> None: - with pytest.raises( - CompositionValidationError, match="assert_pay_principal_authorization" - ): - _validate_source( - tmp_path, - """ - from modules.core_financial import NoCouponCashflowMixin - from modules.payment_agent import PrincipalPaymentAgentMixin - - - class BrokenPrincipalAuthorization( - NoCouponCashflowMixin, - PrincipalPaymentAgentMixin, - ): - pass - """, - ) diff --git a/tests/utils.py b/tests/utils.py index 70cb3705..7b1149a6 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,329 +1,35 @@ -import math -from base64 import b64decode -from dataclasses import asdict, dataclass -from typing import TypeAlias - -from algokit_utils import ( - AlgoAmount, - AlgorandClient, - PaymentParams, - SendAppTransactionResult, - SigningAccount, -) -from algosdk.abi import TupleType, UintType -from algosdk.constants import min_txn_fee -from algosdk.v2client.algod import AlgodClient - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, -) -from smart_contracts.artifacts.mock_module_accounting.mock_accounting_module_client import ( - AccountGetInfoArgs, -) -from smart_contracts.artifacts.perpetual_bond.perpetual_bond_client import ( - PerpetualBondClient, +from d_asa.localnet import ( + Currency, + DAsaAccount, + DAsaAccountManager, + DAsaAuthority, + DAsaInterestOracle, + DAsaPrimaryDealer, + DAsaTrustee, + decode_actus_event, + decode_actus_execution_event, + get_event_from_call_result, + get_last_round, + get_latest_timestamp, + get_primary_tx_id, + round_warp, + time_warp, ) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - ZeroCouponBondClient, -) - -COUPON_PER_OP_UP_TXN = 10 # This parameter is empirical and depends on the complexity of `count_due_coupons` subroutine - -CouponRates: TypeAlias = list[int] -TimeEvents: TypeAlias = list[int] -TimePeriods: TypeAlias = list[tuple[int, int]] - - -@dataclass -class DAsaConfig: - denomination_asset_id: int - settlement_asset_id: int - principal: int - principal_discount: int - minimum_denomination: int - day_count_convention: int - interest_rate: int - coupon_rates: CouponRates - time_events: TimeEvents - time_periods: TimePeriods - - def dictify(self) -> dict[str, int | CouponRates | TimeEvents | TimePeriods]: - return asdict(self) # type: ignore - - @property - def total_coupons(self) -> int: - return len(self.coupon_rates) - - -@dataclass -class Currency: - id: int - total: int - decimals: int - name: str - unit_name: str - asa_to_unit: float - - -@dataclass(kw_only=True) -class DAsaAccountManager(SigningAccount): - @classmethod - def role_id(cls) -> int: - return sc_cst.ROLE_ACCOUNT_MANAGER - - -@dataclass(kw_only=True) -class DAsaPrimaryDealer(SigningAccount): - @classmethod - def role_id(cls) -> int: - return sc_cst.ROLE_PRIMARY_DEALER - - -@dataclass(kw_only=True) -class DAsaTrustee(SigningAccount): - @classmethod - def role_id(cls) -> int: - return sc_cst.ROLE_TRUSTEE - - -@dataclass(kw_only=True) -class DAsaAuthority(SigningAccount): - @classmethod - def role_id(cls) -> int: - return sc_cst.ROLE_AUTHORITY - - -@dataclass(kw_only=True) -class DAsaInterestOracle(SigningAccount): - @classmethod - def role_id(cls) -> int: - return sc_cst.ROLE_INTEREST_ORACLE - - -@dataclass(kw_only=True) -class DAsaAccount(SigningAccount): - holding_address: str - d_asa_client: ZeroCouponBondClient | FixedCouponBondClient | PerpetualBondClient - - @property - def payment_address(self) -> str: - return self.d_asa_client.send.account_get_info( - AccountGetInfoArgs( - holding_address=self.holding_address, - ) - ).abi_return.payment_address - - @property - def units(self) -> int: - return self.d_asa_client.send.account_get_info( - AccountGetInfoArgs(holding_address=self.holding_address) - ).abi_return.units - - @property - def unit_value(self) -> int: - return self.d_asa_client.send.account_get_info( - AccountGetInfoArgs(holding_address=self.holding_address) - ).abi_return.unit_value - - @property - def paid_coupons(self) -> int: - return self.d_asa_client.send.account_get_info( - AccountGetInfoArgs(holding_address=self.holding_address) - ).abi_return.paid_coupons - - @property - def suspended(self) -> bool: - return self.d_asa_client.send.account_get_info( - AccountGetInfoArgs(holding_address=self.holding_address) - ).abi_return.suspended - - @property - def principal(self) -> int: - return self.units * self.unit_value - - -def get_last_round(algod_client: AlgodClient) -> int: - return algod_client.status()["last-round"] # type: ignore - - -def get_latest_timestamp(algod_client: AlgodClient) -> int: - return algod_client.block_info(get_last_round(algod_client))["block"]["ts"] # type: ignore - - -def round_warp(to_round: int | None = None) -> None: - """ - Fastforward directly `to_round` or advance by 1 round. - - Args: - to_round (Optional): Round to advance to - """ - algorand_client = AlgorandClient.default_localnet() - algorand_client.set_suggested_params_cache_timeout(0) - dispenser = algorand_client.account.localnet_dispenser() - if to_round is not None: - last_round = get_last_round(algorand_client.client.algod) - assert to_round > last_round - n_rounds = to_round - last_round - else: - n_rounds = 1 - for _ in range(n_rounds): - algorand_client.send.payment( - PaymentParams( - signer=dispenser.signer, - sender=dispenser.address, - receiver=dispenser.address, - amount=AlgoAmount.from_algo(0), - ) - ) - - -def time_warp(to_timestamp: int) -> None: - """ - Fastforward directly `to_timestamp` - - Args: - to_timestamp: Timestamp to advance to - """ - algorand_client = AlgorandClient.default_localnet() - algorand_client.set_suggested_params_cache_timeout(0) - algorand_client.client.algod.set_timestamp_offset( - to_timestamp - get_latest_timestamp(algorand_client.client.algod) - ) - round_warp() - algorand_client.client.algod.set_timestamp_offset(0) - - -def max_fee_per_coupon(coupon_idx: int) -> AlgoAmount: - """ - Compute max fee credit for opcode budget, based on coupon index to process - - Args: - coupon_idx: coupon index to process - - Returns: - Max fee - """ - return AlgoAmount.from_micro_algo( - math.ceil(coupon_idx / COUPON_PER_OP_UP_TXN) * min_txn_fee - ) - - -def set_role_config(validity_start: int = 0, validity_end: int = 2**64 - 1) -> bytes: - return TupleType([UintType(64), UintType(64)]).encode( - [validity_start, validity_end] - ) - - -def get_event_from_call_result(call_result: SendAppTransactionResult) -> bytes: - # Contract emits ACTUS events right before the ARC-4 (which is the last log) - event = call_result.returns[0].tx_info["logs"][-2] - # Stripping ARC-28 4-bytes event signature prefix - event_bytes = b64decode(event) - return event_bytes[4:] - - -def decode_actus_event(event_bytes: bytes) -> dict: - """ - Decode an ACTUS ARC-28 Event from bytes using ARC-4 encoding. - - In ARC-4, structs with dynamic types (String, Bytes) use offsets: - - Fixed-size fields are stored inline - - Dynamic fields are stored as 2-byte offsets pointing to data at the end - - Event structure (ARC-4 encoding): - Fixed part (head): - - contract_id: UInt64 (8 bytes) - - type: arc4.UInt8 (1 byte) - - type_name: offset (2 bytes) -> points to String data in tail - - time: UInt64 (8 bytes) - - payoff: UInt64 (8 bytes) - - currency_id: UInt64 (8 bytes) - - currency_unit: offset (2 bytes) -> points to Bytes data in tail - - nominal_value: UInt64 (8 bytes) - - nominal_rate_bps: arc4.UInt16 (2 bytes) - - nominal_accrued: UInt64 (8 bytes) - - Dynamic part (tail): - - String data for type_name (2 bytes length + UTF-8 data) - - Bytes data for currency_unit (2 bytes length + raw data) - - Args: - event_bytes: The raw event bytes (after removing the 4-byte event signature) - - Returns: - Dictionary with decoded event fields - """ - import struct - - offset = 0 - - # Read contract_id (UInt64 - 8 bytes) - contract_id = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] - offset += 8 - - # Read type (arc4.UInt8 - 1 byte) - event_type = event_bytes[offset] - offset += 1 - - # Read type_name offset (2 bytes) - type_name_offset = struct.unpack(">H", event_bytes[offset : offset + 2])[0] - offset += 2 - - # Read time (UInt64 - 8 bytes) - time = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] - offset += 8 - - # Read payoff (UInt64 - 8 bytes) - payoff = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] - offset += 8 - - # Read currency_id (UInt64 - 8 bytes) - currency_id = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] - offset += 8 - - # Read currency_unit offset (2 bytes) - currency_unit_offset = struct.unpack(">H", event_bytes[offset : offset + 2])[0] - offset += 2 - - # Read nominal_value (UInt64 - 8 bytes) - nominal_value = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] - offset += 8 - - # Read nominal_rate_bps (arc4.UInt16 - 2 bytes) - nominal_rate_bps = struct.unpack(">H", event_bytes[offset : offset + 2])[0] - offset += 2 - - # Read nominal_accrued (UInt64 - 8 bytes) - nominal_accrued = struct.unpack(">Q", event_bytes[offset : offset + 8])[0] - offset += 8 - - # Now decode the dynamic fields using their offsets - # Read type_name from tail - type_name_length = struct.unpack( - ">H", event_bytes[type_name_offset : type_name_offset + 2] - )[0] - type_name = event_bytes[ - type_name_offset + 2 : type_name_offset + 2 + type_name_length - ].decode("utf-8") - - # Read currency_unit from tail - currency_unit_length = struct.unpack( - ">H", event_bytes[currency_unit_offset : currency_unit_offset + 2] - )[0] - currency_unit = event_bytes[ - currency_unit_offset + 2 : currency_unit_offset + 2 + currency_unit_length - ].decode("utf-8") - return { - "contract_id": contract_id, - "type": event_type, - "type_name": type_name, - "time": time, - "payoff": payoff, - "currency_id": currency_id, - "currency_unit": currency_unit, - "nominal_value": nominal_value, - "nominal_rate_bps": nominal_rate_bps, - "nominal_accrued": nominal_accrued, - } +__all__ = [ + "Currency", + "DAsaAccount", + "DAsaAccountManager", + "DAsaAuthority", + "DAsaInterestOracle", + "DAsaPrimaryDealer", + "DAsaTrustee", + "decode_actus_event", + "decode_actus_execution_event", + "get_event_from_call_result", + "get_last_round", + "get_latest_timestamp", + "get_primary_tx_id", + "round_warp", + "time_warp", +] diff --git a/tests/zero_coupon_bond/__init__.py b/tests/zero_coupon_bond/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/zero_coupon_bond/conftest.py b/tests/zero_coupon_bond/conftest.py deleted file mode 100644 index 42e88ee4..00000000 --- a/tests/zero_coupon_bond/conftest.py +++ /dev/null @@ -1,249 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import ( - AlgorandClient, - SigningAccount, -) - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AccountOpenArgs, - AssetConfigArgs, - AssetCreateArgs, - AssetMetadata, - PrimaryDistributionArgs, - RbacAssignRoleArgs, - RbacGovAssetSuspensionArgs, - SetSecondaryTimeEventsArgs, - ZeroCouponBondClient, - ZeroCouponBondFactory, -) -from tests import conftest_helpers as helpers -from tests import utils -from tests.conftest import ( - APR, - INITIAL_D_ASA_UNITS, - ISSUANCE_DELAY, - MINIMUM_DENOMINATION, - PRIMARY_DISTRIBUTION_DELAY, - PRIMARY_DISTRIBUTION_DURATION, - PRINCIPAL, -) - -MATURITY_DELAY: Final[int] = 366 * sc_cst.DAY_2_SEC -TOTAL_ASA_FUNDS: Final[int] = PRINCIPAL * (sc_cst.BPS + APR) // sc_cst.BPS - -PROSPECTUS_URL: Final[str] = "Zero Coupon Bond Prospectus" - - -@pytest.fixture(scope="session") -def asset_metadata() -> AssetMetadata: - return AssetMetadata( - contract_type=sc_cst.CT_PAM, - calendar=sc_cst.CLDR_NC, - business_day_convention=sc_cst.BDC_NOS, - end_of_month_convention=sc_cst.EOMC_SD, - prepayment_effect=sc_cst.PPEF_N, - penalty_type=sc_cst.PYTP_N, - prospectus_hash=bytes(32), - prospectus_url=PROSPECTUS_URL, - ) - - -@pytest.fixture(scope="function") -def time_events( - algorand: AlgorandClient, -) -> utils.TimeEvents: - current_ts = utils.get_latest_timestamp(algorand.client.algod) - primary_distribution_opening = current_ts + PRIMARY_DISTRIBUTION_DELAY - primary_distribution_closure = ( - primary_distribution_opening + PRIMARY_DISTRIBUTION_DURATION - ) - issuance_date = primary_distribution_closure + ISSUANCE_DELAY - maturity_date = issuance_date + MATURITY_DELAY - return [ - primary_distribution_opening, - primary_distribution_closure, - issuance_date, - maturity_date, - ] - - -@pytest.fixture(scope="function") -def zero_coupon_bond_cfg( - currency: utils.Currency, - time_events: utils.TimeEvents, - day_count_convention: int, -) -> utils.DAsaConfig: - return utils.DAsaConfig( - denomination_asset_id=currency.id, - settlement_asset_id=currency.id, - principal=PRINCIPAL, - principal_discount=APR, - minimum_denomination=MINIMUM_DENOMINATION, - day_count_convention=day_count_convention, - interest_rate=0, - coupon_rates=[], - time_events=time_events, - time_periods=[], - ) - - -@pytest.fixture(scope="function") -def zero_coupon_bond_client_empty( - algorand: AlgorandClient, - arranger: SigningAccount, - asset_metadata: AssetMetadata, -) -> ZeroCouponBondClient: - return helpers.create_and_fund_client( - algorand, - ZeroCouponBondFactory, - arranger, - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata), - ) - - -@pytest.fixture(scope="function") -def account_manager( - algorand: AlgorandClient, - zero_coupon_bond_cfg: utils.DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> utils.DAsaAccountManager: - return helpers.create_role_account( - algorand, - utils.DAsaAccountManager, - zero_coupon_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def authority( - algorand: AlgorandClient, - zero_coupon_bond_cfg: utils.DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> utils.DAsaAuthority: - return helpers.create_role_account( - algorand, - utils.DAsaAuthority, - zero_coupon_bond_client_empty, - rbac_assign_role_args_class=RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def zero_coupon_bond_client_active( - algorand: AlgorandClient, - bank: SigningAccount, - zero_coupon_bond_cfg: utils.DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> ZeroCouponBondClient: - return helpers.activate_client_with_config_and_funding( - algorand, - zero_coupon_bond_client_empty, - bank, - zero_coupon_bond_cfg, - TOTAL_ASA_FUNDS, - AssetConfigArgs, - ) - - -@pytest.fixture(scope="function") -def primary_dealer( - algorand: AlgorandClient, - zero_coupon_bond_client_active: ZeroCouponBondClient, -) -> utils.DAsaPrimaryDealer: - state = zero_coupon_bond_client_active.state.global_state - role_config = utils.set_role_config( - state.primary_distribution_opening_date, state.primary_distribution_closure_date - ) - return helpers.create_role_account( - algorand, - utils.DAsaPrimaryDealer, - zero_coupon_bond_client_active, - role_config, - RbacAssignRoleArgs, - ) - - -@pytest.fixture(scope="function") -def account_factory( - algorand: AlgorandClient, - bank: SigningAccount, - currency: utils.Currency, - account_manager: utils.DAsaAccountManager, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_factory( - algorand, currency, account_manager, AccountOpenArgs - ) - - -@pytest.fixture(scope="function") -def zero_coupon_bond_client_primary( - zero_coupon_bond_client_active: ZeroCouponBondClient, -) -> ZeroCouponBondClient: - state = zero_coupon_bond_client_active.state.global_state - return helpers.set_client_to_primary_phase( - zero_coupon_bond_client_active, - SetSecondaryTimeEventsArgs, - [state.issuance_date, state.maturity_date], - ) - - -@pytest.fixture(scope="function") -def account_with_units_factory( - account_factory: Callable[..., utils.DAsaAccount], - primary_dealer: utils.DAsaPrimaryDealer, - zero_coupon_bond_client_primary: ZeroCouponBondClient, -) -> Callable[..., utils.DAsaAccount]: - return helpers.build_account_with_units_factory( - account_factory, - primary_dealer, - zero_coupon_bond_client_primary, - PrimaryDistributionArgs, - INITIAL_D_ASA_UNITS, - ) - - -@pytest.fixture(scope="function") -def account_a( - account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return account_with_units_factory() - - -@pytest.fixture(scope="function") -def account_b( - account_with_units_factory: Callable[..., utils.DAsaAccount], -) -> utils.DAsaAccount: - return account_with_units_factory(units=2 * INITIAL_D_ASA_UNITS) - - -@pytest.fixture(scope="function") -def zero_coupon_bond_client_ongoing( - zero_coupon_bond_client_primary: ZeroCouponBondClient, -) -> ZeroCouponBondClient: - state = zero_coupon_bond_client_primary.state.global_state - utils.time_warp(state.issuance_date) - return zero_coupon_bond_client_primary - - -@pytest.fixture(scope="function") -def zero_coupon_bond_client_at_maturity( - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> ZeroCouponBondClient: - state = zero_coupon_bond_client_ongoing.state.global_state - utils.time_warp(state.maturity_date) - return zero_coupon_bond_client_ongoing - - -@pytest.fixture(scope="function") -def zero_coupon_bond_client_suspended( - authority: utils.DAsaAuthority, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> ZeroCouponBondClient: - return helpers.suspend_client( - zero_coupon_bond_client_ongoing, authority, RbacGovAssetSuspensionArgs - ) diff --git a/tests/zero_coupon_bond/test_asset_config.py b/tests/zero_coupon_bond/test_asset_config.py deleted file mode 100644 index 29e6123a..00000000 --- a/tests/zero_coupon_bond/test_asset_config.py +++ /dev/null @@ -1,170 +0,0 @@ -from copy import deepcopy - -import pytest -from algokit_utils import LogicError - -from smart_contracts import config as sc_cfg -from smart_contracts import enums -from smart_contracts import errors as err -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetConfigArgs, - ZeroCouponBondClient, -) -from tests.utils import Currency, DAsaConfig - - -def test_pass_asset_config( - day_count_convention: int, - currency: Currency, - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> None: - zero_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**zero_coupon_bond_cfg.dictify()) - ) - - state = zero_coupon_bond_client_empty.state.global_state - expected_coupon_rates = [] - expected_time_events = ( - zero_coupon_bond_client_empty.send.get_time_events().abi_return - ) - - # Asset Configuration - assert state.denomination_asset_id == currency.id - assert state.settlement_asset_id == state.denomination_asset_id - assert state.unit_value == zero_coupon_bond_cfg.minimum_denomination - assert state.day_count_convention == zero_coupon_bond_cfg.day_count_convention - - # Principal and Supply - assert ( - state.total_units - == zero_coupon_bond_cfg.principal // zero_coupon_bond_cfg.minimum_denomination - ) - assert not state.circulating_units - assert state.principal_discount == zero_coupon_bond_cfg.principal_discount - - # Interest Rate - assert state.interest_rate == zero_coupon_bond_cfg.interest_rate - - # Coupons - assert expected_coupon_rates == zero_coupon_bond_cfg.coupon_rates - assert state.total_coupons == zero_coupon_bond_cfg.total_coupons - - # Time Schedule - assert expected_time_events == zero_coupon_bond_cfg.time_events - assert ( - state.primary_distribution_opening_date - == zero_coupon_bond_cfg.time_events[ - sc_cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - ] - # == time_schedule_limits.primary_distribution_opening_date - ) - assert ( - state.primary_distribution_closure_date - == zero_coupon_bond_cfg.time_events[ - sc_cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - ] - # == time_schedule_limits.primary_distribution_closure_date - ) - assert ( - state.issuance_date - == zero_coupon_bond_cfg.time_events[sc_cfg.ISSUANCE_DATE_IDX] - # == time_schedule_limits.issuance_date - ) - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert ( - state.maturity_date - == zero_coupon_bond_cfg.time_events[sc_cfg.MATURITY_DATE_IDX] - # == time_schedule_limits.maturity_date - ) - - # Status - assert state.status == enums.STATUS_ACTIVE - assert not state.asset_suspended - - -def test_fail_unauthorized() -> None: - pass # TODO - - -def test_fail_already_configured() -> None: - pass # TODO - - -def test_fail_invalid_denomination() -> None: - pass # TODO - - -def test_fail_invalid_minimum_denomination() -> None: - pass # TODO - - -def test_fail_invalid_interest_rate() -> None: - pass # TODO - - -def test_fail_invalid_time_events_length( - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(zero_coupon_bond_cfg) - wrong_d_asa_cfg.time_events = [*zero_coupon_bond_cfg.time_events, 0] - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): - zero_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time( - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(zero_coupon_bond_cfg) - wrong_d_asa_cfg.time_events[0] = 0 - with pytest.raises(LogicError, match=err.INVALID_TIME): - zero_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_sorting( - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_empty: ZeroCouponBondClient, -) -> None: - wrong_d_asa_cfg = deepcopy(zero_coupon_bond_cfg) - wrong_d_asa_cfg.time_events[-1] = zero_coupon_bond_cfg.time_events[-2] - with pytest.raises(LogicError, match=err.INVALID_SORTING): - zero_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - wrong_d_asa_cfg = deepcopy(zero_coupon_bond_cfg) - wrong_d_asa_cfg.time_events[0] = zero_coupon_bond_cfg.time_events[-1] - with pytest.raises(LogicError, match=err.INVALID_SORTING): - zero_coupon_bond_client_empty.send.asset_config( - AssetConfigArgs(**wrong_d_asa_cfg.dictify()) - ) - - -def test_fail_invalid_time_period_duration() -> None: - pass # TODO - - -def test_fail_invalid_settlement_asset() -> None: - pass # TODO - - -def test_fail_invalid_time_periods() -> None: - pass # TODO - - -def test_fail_invalid_time_period_representations() -> None: - pass # TODO - - -def test_fail_invalid_coupon_rates() -> None: - pass # TODO - - -# TODO: Test INVALID_TIME_PERIOD for Actual/Actual convention diff --git a/tests/zero_coupon_bond/test_asset_create.py b/tests/zero_coupon_bond/test_asset_create.py deleted file mode 100644 index db2cf5b1..00000000 --- a/tests/zero_coupon_bond/test_asset_create.py +++ /dev/null @@ -1,88 +0,0 @@ -from algokit_utils import AlgorandClient, SigningAccount -from algosdk.abi import ArrayStaticType, ByteType, StringType, TupleType, UintType - -from smart_contracts import constants as sc_cst -from smart_contracts import enums -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetCreateArgs, - AssetMetadata, - ZeroCouponBondFactory, -) - -from .conftest import PROSPECTUS_URL - - -def test_pass_asset_create( - algorand: AlgorandClient, - day_count_convention: int, - asset_metadata: AssetMetadata, - arranger: SigningAccount, -) -> None: - factory = algorand.client.get_typed_app_factory( - ZeroCouponBondFactory, - default_sender=arranger.address, - default_signer=arranger.signer, - ) - zero_coupon_bond_client, _ = factory.send.create.asset_create( - AssetCreateArgs(arranger=arranger.address, metadata=asset_metadata) - ) - - state = zero_coupon_bond_client.state.global_state - - # Roles - assert state.arranger == arranger.address - - # Asset Configuration - assert not state.denomination_asset_id - assert not state.settlement_asset_id - assert not state.unit_value - assert not state.day_count_convention - - # Metadata - assert state.metadata == TupleType( - [ - UintType(8), # Contract Type - UintType(8), # Calendar - UintType(8), # Business Day Convention - UintType(8), # End of Month Convention - UintType(8), # Prepayment Effect - UintType(8), # Penalty Type - ArrayStaticType(ByteType(), 32), # Prospectus Hash - StringType(), # Prospectus URL - ] - ).encode( - [ - sc_cst.CT_PAM, - sc_cst.CLDR_NC, - sc_cst.BDC_NOS, - sc_cst.EOMC_SD, - sc_cst.PPEF_N, - sc_cst.PYTP_N, - bytes(32), - PROSPECTUS_URL, - ] - ) - - # Principal and Supply - assert not state.total_units - assert not state.circulating_units - assert not state.principal_discount - - # Coupons - assert not state.total_coupons - - # Time Schedule - assert not state.primary_distribution_opening_date - assert not state.primary_distribution_closure_date - assert not state.issuance_date - assert not state.secondary_market_opening_date - assert not state.secondary_market_closure_date - assert not state.maturity_date - - # Status - assert state.status == enums.STATUS_INACTIVE - assert not state.asset_suspended - - -def test_fail_invalid_state_schema() -> None: - pass # TODO diff --git a/tests/zero_coupon_bond/test_asset_transfer.py b/tests/zero_coupon_bond/test_asset_transfer.py deleted file mode 100644 index c5269d03..00000000 --- a/tests/zero_coupon_bond/test_asset_transfer.py +++ /dev/null @@ -1,260 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import CommonAppCallParams, LogicError, SigningAccount - -from smart_contracts import errors as err -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AssetTransferArgs, - GetAccountUnitsCurrentValueArgs, - ZeroCouponBondClient, -) -from tests.utils import DAsaAccount, DAsaConfig, time_warp - - -def test_pass_asset_transfer( - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_primary: ZeroCouponBondClient, - account_factory: Callable[..., DAsaAccount], - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account_a = account_with_units_factory(units=3) - account_b = account_factory(zero_coupon_bond_client_primary) - - asset_info = zero_coupon_bond_client_primary.state.global_state - maturity_period = asset_info.maturity_date - asset_info.issuance_date - - pre_transfer_units_a = account_a.units - pre_transfer_units_b = account_b.units - pre_transfer_unit_value_a = account_a.unit_value - pre_transfer_unit_value_b = account_b.unit_value - - assert pre_transfer_unit_value_a != pre_transfer_unit_value_b - assert pre_transfer_unit_value_b == 0 - - time_warp(asset_info.issuance_date + maturity_period // 10) - - transfer_1_units = 1 - accrued_interest_1 = ( - zero_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_1_units, - ) - ).abi_return.accrued_interest - ) - transferred_value_1 = zero_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_1_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_1_units_a = account_a.units - post_transfer_1_units_b = account_b.units - post_transfer_1_unit_value_a = account_a.unit_value - post_transfer_1_unit_value_b = account_b.unit_value - - assert ( - transferred_value_1 - == zero_coupon_bond_cfg.minimum_denomination * transfer_1_units - + accrued_interest_1 - ) - assert post_transfer_1_units_a == pre_transfer_units_a - transfer_1_units - assert post_transfer_1_units_b == pre_transfer_units_b + transfer_1_units - assert post_transfer_1_unit_value_a == post_transfer_1_unit_value_b - assert account_a.paid_coupons == account_b.paid_coupons - - time_warp(asset_info.issuance_date + maturity_period // 5) - - transfer_2_units = 1 - accrued_interest_2 = ( - zero_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_2_units, - ) - ).abi_return.accrued_interest - ) - transferred_value_2 = zero_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_2_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_2_units_a = account_a.units - post_transfer_2_units_b = account_b.units - post_transfer_2_unit_value_a = account_a.unit_value - post_transfer_2_unit_value_b = account_b.unit_value - - assert ( - transferred_value_2 - == zero_coupon_bond_cfg.minimum_denomination * transfer_2_units - + accrued_interest_2 - ) - assert post_transfer_2_units_a == post_transfer_1_units_a - transfer_2_units - assert post_transfer_2_units_b == post_transfer_1_units_b + transfer_2_units - assert post_transfer_2_unit_value_a == post_transfer_2_unit_value_b - assert account_a.paid_coupons == account_b.paid_coupons - - time_warp(asset_info.issuance_date + maturity_period // 2) - - transfer_3_units = 1 - accrued_interest_3 = ( - zero_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=transfer_3_units, - ) - ).abi_return.accrued_interest - ) - transferred_value_3 = zero_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=transfer_3_units, - ), - params=CommonAppCallParams(sender=account_a.address), - ).abi_return - - post_transfer_3_units_a = account_a.units - post_transfer_3_units_b = account_b.units - post_transfer_3_unit_value_a = account_a.unit_value - - assert ( - transferred_value_3 - == zero_coupon_bond_cfg.minimum_denomination * transfer_3_units - + accrued_interest_3 - ) - assert post_transfer_3_units_a == 0 - assert ( - post_transfer_3_units_b - == transfer_1_units + transfer_2_units + transfer_3_units - ) - assert post_transfer_3_unit_value_a == 0 - assert account_a.paid_coupons == 0 - - -def test_fail_secondary_market_not_open_yet( - zero_coupon_bond_client_primary: ZeroCouponBondClient, - account_a: DAsaAccount, - account_b: DAsaAccount, -) -> None: - with pytest.raises(LogicError, match=err.SECONDARY_MARKET_CLOSED): - zero_coupon_bond_client_primary.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -# TODO: test_fail_secondary_market_closed - - -def test_fail_unauthorized( - no_role_account: SigningAccount, - account_a: DAsaAccount, - account_b: DAsaAccount, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): - zero_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_suspended( - account_a: DAsaAccount, - account_b: DAsaAccount, - zero_coupon_bond_client_suspended: ZeroCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.SUSPENDED): - zero_coupon_bond_client_suspended.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_invalid_sender( - no_role_account: SigningAccount, - account_a: DAsaAccount, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - zero_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=no_role_account.address, - receiver_holding_address=account_a.holding_address, - units=1, - ), - params=CommonAppCallParams(sender=no_role_account.address), - ) - - -def test_fail_invalid_receiver( - no_role_account: SigningAccount, - account_a: DAsaAccount, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - zero_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=no_role_account.address, - units=1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended_sender() -> None: - pass # TODO - - -def test_fail_suspended_receiver() -> None: - pass # TODO - - -def test_fail_self_transfer() -> None: - pass # TODO - - -def test_fail_null_transfer() -> None: - pass # TODO - - -def test_fail_over_transfer( - account_a: DAsaAccount, - account_b: DAsaAccount, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.OVER_TRANSFER): - zero_coupon_bond_client_ongoing.send.asset_transfer( - AssetTransferArgs( - sender_holding_address=account_a.holding_address, - receiver_holding_address=account_b.holding_address, - units=account_a.units + 1, - ), - params=CommonAppCallParams(sender=account_a.address), - ) diff --git a/tests/zero_coupon_bond/test_get_account_units_current_value.py b/tests/zero_coupon_bond/test_get_account_units_current_value.py deleted file mode 100644 index 3b594a69..00000000 --- a/tests/zero_coupon_bond/test_get_account_units_current_value.py +++ /dev/null @@ -1,110 +0,0 @@ -from collections.abc import Callable -from typing import Final - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - GetAccountUnitsCurrentValueArgs, - ZeroCouponBondClient, -) -from tests.utils import DAsaAccount, DAsaConfig, get_latest_timestamp, time_warp - -D_ASA_TEST_UNITS: Final[int] = 3 - - -def test_account_units_value_during_primary( - zero_coupon_bond_client_primary: ZeroCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - state = zero_coupon_bond_client_primary.state.global_state - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - value = zero_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ) - ).abi_return - print("Primary distribution units value:") - print(value.__dict__) - assert ( - value.units_value - == account.principal * (sc_cst.BPS - state.principal_discount) // sc_cst.BPS - ) - assert value.accrued_interest == 0 - assert not value.day_count_factor.numerator - assert not value.day_count_factor.denominator - - -def test_account_units_value_at_issuance( - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_primary: ZeroCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - state = zero_coupon_bond_client_primary.state.global_state - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - time_warp(state.issuance_date) - issuance_date = get_latest_timestamp( - zero_coupon_bond_client_primary.algorand.client.algod - ) - assert issuance_date == state.issuance_date - - value = zero_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ) - ).abi_return - print("Primary distribution units value:") - print(value.__dict__) - - maturity_period = state.maturity_date - state.issuance_date - if zero_coupon_bond_cfg.day_count_convention == sc_cst.DCC_A_A: - maturity_period = maturity_period // sc_cst.DAY_2_SEC - - assert ( - value.units_value - == account.principal * (sc_cst.BPS - state.principal_discount) // sc_cst.BPS - ) - assert value.accrued_interest == 0 - assert value.day_count_factor.numerator == 0 - assert value.day_count_factor.denominator == maturity_period - - -def test_account_units_value_at_maturity( - zero_coupon_bond_client_primary: ZeroCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - state = zero_coupon_bond_client_primary.state.global_state - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - time_warp(state.maturity_date) - maturity_date = get_latest_timestamp( - zero_coupon_bond_client_primary.algorand.client.algod - ) - assert maturity_date == state.maturity_date - - value = zero_coupon_bond_client_primary.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account.holding_address, - units=D_ASA_TEST_UNITS, - ) - ).abi_return - print("Primary distribution units value:") - print(value.__dict__) - assert value.units_value == account.principal - assert value.accrued_interest == 0 - assert value.day_count_factor.numerator == 0 - assert value.day_count_factor.denominator == 0 - - -def test_fail_no_primary_distribution() -> None: - pass # TODO - - -def test_fail_invalid_holding_address() -> None: - pass # TODO - - -def test_fail_invalid_units() -> None: - pass # TODO diff --git a/tests/zero_coupon_bond/test_get_payment_amount.py b/tests/zero_coupon_bond/test_get_payment_amount.py deleted file mode 100644 index a1f3fc5b..00000000 --- a/tests/zero_coupon_bond/test_get_payment_amount.py +++ /dev/null @@ -1,63 +0,0 @@ -from collections.abc import Callable -from typing import Final - -import pytest -from algokit_utils import LogicError, SigningAccount - -from smart_contracts import constants as sc_cst -from smart_contracts import errors as err -from smart_contracts.artifacts.fixed_coupon_bond.fixed_coupon_bond_client import ( - FixedCouponBondClient, -) -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - GetPaymentAmountArgs, -) -from tests.utils import Currency, DAsaAccount, DAsaConfig - -D_ASA_TEST_UNITS: Final[int] = 3 - - -def test_pass_get_principal_payment_amount( - currency: Currency, - zero_coupon_bond_cfg: DAsaConfig, - zero_coupon_bond_client_primary: FixedCouponBondClient, - account_with_units_factory: Callable[..., DAsaAccount], -) -> None: - account = account_with_units_factory(units=D_ASA_TEST_UNITS) - - payment_amount = zero_coupon_bond_client_primary.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address) - ).abi_return - - print(f"Interest rate:\t\t{zero_coupon_bond_cfg.interest_rate / 100:.2f}%") - print(f"Principal amount:\t{account.principal * currency.asa_to_unit:.2f} EUR") - print( - f"Interest amount:\t{payment_amount.interest * currency.asa_to_unit:.2f} EUR\n" - ) - assert payment_amount.principal == account.principal - assert ( - payment_amount.interest - == account.principal * zero_coupon_bond_cfg.interest_rate // sc_cst.BPS - ) - - -def test_pass_not_configured( - zero_coupon_bond_client_empty: FixedCouponBondClient, - account_factory: Callable[..., DAsaAccount], -) -> None: - account = account_factory(zero_coupon_bond_client_empty) - payment_amount = zero_coupon_bond_client_empty.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=account.holding_address) - ).abi_return - assert payment_amount.interest == 0 - assert payment_amount.principal == 0 - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - zero_coupon_bond_client_primary: FixedCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - zero_coupon_bond_client_primary.send.get_payment_amount( - GetPaymentAmountArgs(holding_address=no_role_account.address) - ) diff --git a/tests/zero_coupon_bond/test_pay_principal.py b/tests/zero_coupon_bond/test_pay_principal.py deleted file mode 100644 index 90645ae7..00000000 --- a/tests/zero_coupon_bond/test_pay_principal.py +++ /dev/null @@ -1,142 +0,0 @@ -from collections.abc import Callable - -import pytest -from algokit_utils import ( - AlgorandClient, - LogicError, - SigningAccount, -) - -from smart_contracts import errors as err -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - AccountGetInfoArgs, - PayPrincipalArgs, - ZeroCouponBondClient, -) -from tests.utils import ( - Currency, - DAsaAccount, - get_latest_timestamp, -) - - -def test_pass_pay_principal( - algorand: AlgorandClient, - currency: Currency, - account_a: DAsaAccount, - zero_coupon_bond_client_at_maturity: ZeroCouponBondClient, -) -> None: - # Pre payment state - pre_payment_state = zero_coupon_bond_client_at_maturity.state.global_state - - pre_payment_account_info = ( - zero_coupon_bond_client_at_maturity.send.account_get_info( - AccountGetInfoArgs(holding_address=account_a.holding_address) - ).abi_return - ) - - pre_payment_account_principal = account_a.principal - - maturity_date = pre_payment_state.maturity_date - pre_payment_account_units = pre_payment_account_info.units - pre_payment_circulating_units = pre_payment_state.circulating_units - assert ( - get_latest_timestamp(zero_coupon_bond_client_at_maturity.algorand.client.algod) - >= maturity_date - ) - - # Principal payment - payment = zero_coupon_bond_client_at_maturity.send.pay_principal( - PayPrincipalArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ).abi_return - - assert payment.amount == pre_payment_account_principal - print( - f"Paid amount: {payment.amount * currency.asa_to_unit:.2f} EUR, Maturity date: {maturity_date}, " - f"Payment timestamp: {payment.timestamp}" - ) - - # Post payment state - post_payment_state = zero_coupon_bond_client_at_maturity.state.global_state - - post_payment_account_info = ( - zero_coupon_bond_client_at_maturity.send.account_get_info( - AccountGetInfoArgs(holding_address=account_a.holding_address) - ).abi_return - ) - - assert ( - post_payment_state.circulating_units - == pre_payment_circulating_units - pre_payment_account_units - ) - assert post_payment_account_info.units == 0 - # TODO: assert balance updates - # TODO: assert STATUS_ENDED - - -def test_pass_skip_suspended_account() -> None: - pass # TODO - - -def test_pass_skip_not_opted_in_account() -> None: - pass # TODO - - -def test_fail_unauthorized() -> None: - pass # TODO - - -def test_fail_unauthorized_status() -> None: - pass # TODO - - -def test_fail_defaulted_status() -> None: - pass # TODO - - -def test_fail_suspended() -> None: - pass # TODO - - -def test_fail_invalid_holding_address( - no_role_account: SigningAccount, - zero_coupon_bond_client_at_maturity: ZeroCouponBondClient, -) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - zero_coupon_bond_client_at_maturity.send.pay_principal( - PayPrincipalArgs( - holding_address=no_role_account.address, - payment_info=b"", - ) - ) - - -def test_fail_no_units( - account_factory: Callable[..., DAsaAccount], - zero_coupon_bond_client_primary: ZeroCouponBondClient, -) -> None: - account = account_factory(zero_coupon_bond_client_primary) - - with pytest.raises(LogicError, match=err.NO_UNITS): - zero_coupon_bond_client_primary.send.pay_principal( - PayPrincipalArgs( - holding_address=account.holding_address, - payment_info=b"", - ) - ) - - -def test_fail_not_mature( - zero_coupon_bond_client_primary: ZeroCouponBondClient, - account_a: DAsaAccount, -) -> None: - with pytest.raises(LogicError, match=err.NOT_MATURE): - zero_coupon_bond_client_primary.send.pay_principal( - PayPrincipalArgs( - holding_address=account_a.holding_address, - payment_info=b"", - ) - ) diff --git a/tests/zero_coupon_bond/test_sub_accrued_interest_amount.py b/tests/zero_coupon_bond/test_sub_accrued_interest_amount.py deleted file mode 100644 index 09222c6c..00000000 --- a/tests/zero_coupon_bond/test_sub_accrued_interest_amount.py +++ /dev/null @@ -1,87 +0,0 @@ -from typing import Final - -from algokit_utils import AlgorandClient - -from smart_contracts import constants as sc_cst -from smart_contracts.artifacts.zero_coupon_bond.zero_coupon_bond_client import ( - GetAccountUnitsCurrentValueArgs, - ZeroCouponBondClient, -) -from tests.utils import DAsaAccount, get_latest_timestamp, time_warp - -TEST_UNITS: Final[int] = 3 - - -def test_at_issuance( - algorand: AlgorandClient, - account_a: DAsaAccount, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> None: - issuance_date = get_latest_timestamp( - zero_coupon_bond_client_ongoing.algorand.client.algod - ) - state = zero_coupon_bond_client_ongoing.state.global_state - assert issuance_date == state.issuance_date - - value = zero_coupon_bond_client_ongoing.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ) - ).abi_return - print("Value at issuance:") - print(value.__dict__) - assert value.accrued_interest == 0 - - -def test_at_half_period( - algorand: AlgorandClient, - account_a: DAsaAccount, - zero_coupon_bond_client_ongoing: ZeroCouponBondClient, -) -> None: - issuance_date = get_latest_timestamp( - zero_coupon_bond_client_ongoing.algorand.client.algod - ) - state = zero_coupon_bond_client_ongoing.state.global_state - assert issuance_date == state.issuance_date - - maturity_period = state.maturity_date - issuance_date - - # Principal accrued half period - half_maturity_period = maturity_period // 2 - time_warp(issuance_date + half_maturity_period) - - value = zero_coupon_bond_client_ongoing.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ) - ).abi_return - print("Value at half period:") - print(value.__dict__) - assert ( - value.accrued_interest - == (account_a.principal * state.principal_discount // 2) // sc_cst.BPS - ) - - -def test_on_maturity_date( - algorand: AlgorandClient, - account_a: DAsaAccount, - zero_coupon_bond_client_at_maturity: ZeroCouponBondClient, -) -> None: - state = zero_coupon_bond_client_at_maturity.state.global_state - current_date = get_latest_timestamp( - zero_coupon_bond_client_at_maturity.algorand.client.algod - ) - assert current_date == state.maturity_date - - value = zero_coupon_bond_client_at_maturity.send.get_account_units_current_value( - GetAccountUnitsCurrentValueArgs( - holding_address=account_a.holding_address, - units=account_a.units, - ) - ).abi_return - print("Value at maturity:") - print(value.__dict__) - assert value.accrued_interest == 0