TW
Tripwire
Find contracts. Test them. Review real vulns.

Analysis Run

019d5666-b2b6-72b3-991d-f09cf3f2b2ec

failed
Chain ID
1
Address
Block Number
Created
Sat, Apr 4, 2026 2:51 AM
Review Summary

What survived the funnel

Open this run to answer one question: is this real attacker-relevant behavior with real impact, or just normal contract plumbing?

Confirmed
0
Validated
0
Source
Verified
Review Backing
Present
Best current signal
Authorization based on tx.origin
crit 0 high 0 direct contract
Review Checklist
1. Read the findings table first. Ignore raw jobs until the result looks real.
2. Confirm attacker control, not just the existence of a sink.
3. Confirm money or privilege impact.
4. Keep it if the behavior is real. Kill it if this is normal proxy, admin, or upgrade plumbing.

Processing Jobs

Status & attempts
ID Type Status Attempts Heartbeat
42932 artifact.fetch complete 1 / 3 1 week ago
42933 proxy.resolve complete 1 / 3 1 week ago
42934 tool.cast_disasm complete 1 / 3 1 week ago
42935 analysis.bundle complete 1 / 3 1 week ago
42936 capability.graph complete 1 / 3 1 week ago
42937 detector.run complete 1 / 3 1 week ago
42938 validation.fork complete 1 / 3 1 week ago
43004 report.consolidate complete 1 / 6 1 week ago
43005 tool.slither failed 2 / 2 1 week ago

Artifact

Runtime bytecode: available
Creation TX:
Deployer:
Proxy: no not_proxy
Implementation:
Verified Source: yes
Proxy evidence
{
    "status": "not_proxy"
}

Slither

tool.slither
Status
failed slither failed (exit 1): 'forge clean' running (wd: /tmp/slither-4ykhde_k) 'forge config --json' running 'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-4ykhde_k) 'forge' returned non-zero exit code 1 2026-04-04T04:34:08.343021Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/token/ERC20/SafeERC20.sol": No such file or directory (os error 2) stdout: 2026-04-04T04:34:08.343150Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/cryptography/ECDSA.sol": No such file or directory (os error 2) stdout: 2026-04-04T04:34:08.343323Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/utils/SafeCast.sol": No such file or directory (os error 2) stdout: 2026-04-04T04:34:08.343385Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/math/SignedSafeMath.sol": No such file or directory (os error 2) stdout: 2026-04-04T04:34:08.343504Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/math/SignedSafeMath.sol": No such file or directory (os error 2) stdout: 2026-04-04T04:34:08.343523Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/cryptography/ECDSA.sol": No such file or directory (os error 2) stdout: 2026-04-04T04:34:08.343538Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/token/ERC20/SafeERC20.sol": No such file or directory (os error 2) stdout: 2026-04-04T04:34:08.343566Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/math/SafeMath.sol": No such file or directory (os error 2) stdout: 2026-04-04T04:34:08.343787Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/token/ERC20/SafeERC20.sol": No such file or directory (os error 2) stdout: Unable to resolve imports: stdout: "@openzeppelin/contracts/math/SafeMath.sol" in "/tmp/slither-4ykhde_k/contracts/lib/UniversalERC20.sol" stdout: "@openzeppelin/contracts/token/ERC20/SafeERC20.sol" in "/tmp/slither-4ykhde_k/contracts/token/TimeLockRegistry.sol" stdout: "@openzeppelin/contracts/utils/SafeCast.sol" in "/tmp/slither-4ykhde_k/contracts/gardens/Garden.sol" stdout: "@openzeppelin/contracts/cryptography/ECDSA.sol" in "/tmp/slither-4ykhde_k/contracts/gardens/Garden.sol" stdout: "@openzeppelin/contracts/token/ERC20/SafeERC20.sol" in "/tmp/slither-4ykhde_k/contracts/gardens/Garden.sol" stdout: "@openzeppelin/contracts/math/SignedSafeMath.sol" in "/tmp/slither-4ykhde_k/contracts/gardens/Garden.sol" stdout: "@openzeppelin/contracts/cryptography/ECDSA.sol" in "/tmp/slither-4ykhde_k/contracts/lib/SignatureChecker.sol" stdout: "@openzeppelin/contracts/math/SignedSafeMath.sol" in "/tmp/slither-4ykhde_k/contracts/lib/PreciseUnitMath.sol" stdout: "@openzeppelin/contracts/token/ERC20/SafeERC20.sol" in "/tmp/slither-4ykhde_k/contracts/lib/UniversalERC20.sol" stdout: with remappings: stdout: openzeppelin-contracts/=/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/ stdout: @openzeppelin/contracts/=/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/ Error: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/utils/Address.sol: No solc version exists that matches the version requirement: ^0.8.20 stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/access/Ownable.sol: No solc version exists that matches the version requirement: ^0.8.20 stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/utils/Address.sol: No solc version exists that matches the version requirement: ^0.8.20 stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/access/Ownable.sol: No solc version exists that matches the version requirement: ^0.8.20 stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/proxy/Proxy.sol: No solc version exists that matches the version requirement: ^0.8.20 stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/access/Ownable.sol: No solc version exists that matches the version requirement: ^0.8.20 stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/access/Ownable.sol: No solc version exists that matches the version requirement: ^0.8.20 stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol: No solc version exists that matches the version requirement: ^0.8.20 Traceback (most recent call last): File "/var/www/tripwire/.venv/bin/slither", line 10, in <module> sys.exit(main()) ~~~~^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 776, in main main_impl(all_detector_classes=detectors, all_printer_classes=printers) ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 882, in main_impl ) = process_all(filename, args, detector_classes, printer_classes) ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 96, in process_all compilations = compile_all(target, **vars(args)) File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 722, in compile_all compilations.append(CryticCompile(target, **kwargs)) ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 211, in __init__ self._compile(**kwargs) ~~~~~~~~~~~~~^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 633, in _compile self._platform.compile(self, **kwargs) ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/foundry.py", line 102, in compile hardhat_like_parsing( ~~~~~~~~~~~~~~~~~~~~^ crytic_compile, str(self._target), build_directory, str(self._project_root) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/hardhat.py", line 52, in hardhat_like_parsing raise InvalidCompilation(txt) crytic_compile.platform.exceptions.InvalidCompilation: Compilation failed. Can you run build command? /tmp/slither-4ykhde_k/out/build-info is not a directory.
Attempts
2 / 2
Findings
0
Solc
View stderr
Traceback (most recent call last):
  File "/var/www/tripwire/worker/worker.py", line 198, in main
    payload = dispatch_job(job_type, job_id, job_meta, run_data, config, laravel_client)
  File "/var/www/tripwire/worker/worker.py", line 114, in dispatch_job
    return slither_run.run(job_id, job_meta, run_data, config, log, laravel_client)
           ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/worker/jobs/slither_run.py", line 1084, in run
    stdout_text, stderr_text, result_json = _run_slither(
                                            ~~~~~~~~~~~~^
        workspace,
        ^^^^^^^^^^
    ...<4 lines>...
        target_path=target_path,
        ^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/var/www/tripwire/worker/jobs/slither_run.py", line 958, in _run_slither
    raise RuntimeError(f"slither failed (exit {result.returncode}): {stderr_text or stdout_text}")
RuntimeError: slither failed (exit 1): 'forge clean' running (wd: /tmp/slither-4ykhde_k)
'forge config --json' running
'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-4ykhde_k)
'forge' returned non-zero exit code 1
2026-04-04T04:34:08.343021Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/token/ERC20/SafeERC20.sol": No such file or directory (os error 2)
stdout: 2026-04-04T04:34:08.343150Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/cryptography/ECDSA.sol": No such file or directory (os error 2)
stdout: 2026-04-04T04:34:08.343323Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/utils/SafeCast.sol": No such file or directory (os error 2)
stdout: 2026-04-04T04:34:08.343385Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/math/SignedSafeMath.sol": No such file or directory (os error 2)
stdout: 2026-04-04T04:34:08.343504Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/math/SignedSafeMath.sol": No such file or directory (os error 2)
stdout: 2026-04-04T04:34:08.343523Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/cryptography/ECDSA.sol": No such file or directory (os error 2)
stdout: 2026-04-04T04:34:08.343538Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/token/ERC20/SafeERC20.sol": No such file or directory (os error 2)
stdout: 2026-04-04T04:34:08.343566Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/math/SafeMath.sol": No such file or directory (os error 2)
stdout: 2026-04-04T04:34:08.343787Z ERROR foundry_compilers_artifacts_solc::sources: error="/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/token/ERC20/SafeERC20.sol": No such file or directory (os error 2)
stdout: Unable to resolve imports:
stdout:       "@openzeppelin/contracts/math/SafeMath.sol" in "/tmp/slither-4ykhde_k/contracts/lib/UniversalERC20.sol"
stdout:       "@openzeppelin/contracts/token/ERC20/SafeERC20.sol" in "/tmp/slither-4ykhde_k/contracts/token/TimeLockRegistry.sol"
stdout:       "@openzeppelin/contracts/utils/SafeCast.sol" in "/tmp/slither-4ykhde_k/contracts/gardens/Garden.sol"
stdout:       "@openzeppelin/contracts/cryptography/ECDSA.sol" in "/tmp/slither-4ykhde_k/contracts/gardens/Garden.sol"
stdout:       "@openzeppelin/contracts/token/ERC20/SafeERC20.sol" in "/tmp/slither-4ykhde_k/contracts/gardens/Garden.sol"
stdout:       "@openzeppelin/contracts/math/SignedSafeMath.sol" in "/tmp/slither-4ykhde_k/contracts/gardens/Garden.sol"
stdout:       "@openzeppelin/contracts/cryptography/ECDSA.sol" in "/tmp/slither-4ykhde_k/contracts/lib/SignatureChecker.sol"
stdout:       "@openzeppelin/contracts/math/SignedSafeMath.sol" in "/tmp/slither-4ykhde_k/contracts/lib/PreciseUnitMath.sol"
stdout:       "@openzeppelin/contracts/token/ERC20/SafeERC20.sol" in "/tmp/slither-4ykhde_k/contracts/lib/UniversalERC20.sol"
stdout: with remappings:
stdout:       openzeppelin-contracts/=/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/
stdout:       @openzeppelin/contracts/=/tmp/slither-4ykhde_k/lib/openzeppelin-contracts/contracts/
Error: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/utils/Address.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/access/Ownable.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/utils/Address.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/access/Ownable.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/proxy/Proxy.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/access/Ownable.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/access/Ownable.sol: No solc version exists that matches the version requirement: ^0.8.20
stderr: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol: No solc version exists that matches the version requirement: ^0.8.20
Traceback (most recent call last):
  File "/var/www/tripwire/.venv/bin/slither", line 10, in <module>
    sys.exit(main())
             ~~~~^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 776, in main
    main_impl(all_detector_classes=detectors, all_printer_classes=printers)
    ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 882, in main_impl
    ) = process_all(filename, args, detector_classes, printer_classes)
        ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 96, in process_all
    compilations = compile_all(target, **vars(args))
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 722, in compile_all
    compilations.append(CryticCompile(target, **kwargs))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 211, in __init__
    self._compile(**kwargs)
    ~~~~~~~~~~~~~^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 633, in _compile
    self._platform.compile(self, **kwargs)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/foundry.py", line 102, in compile
    hardhat_like_parsing(
    ~~~~~~~~~~~~~~~~~~~~^
        crytic_compile, str(self._target), build_directory, str(self._project_root)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/hardhat.py", line 52, in hardhat_like_parsing
    raise InvalidCompilation(txt)
crytic_compile.platform.exceptions.InvalidCompilation: Compilation failed. Can you run build command?
/tmp/slither-4ykhde_k/out/build-info is not a directory.

Codex

report.consolidate
Job Status
complete
Attempts
1 / 6
Findings
3
No findings?
no
Summary
Three material issues: keeper-supplied share prices can be ratcheted to steal TVL, stake-and-claim signatures replay across gardens, and the vesting registry can be seized before first initialization.
View stdout
{"no_findings":false,"summary":"Three material issues: keeper-supplied share prices can be ratcheted to steal TVL, stake-and-claim signatures replay across gardens, and the vesting registry can be seized before first initialization.","findings":[{"severity":"high","category":"oracle","title":"Keeper-controlled pricePerShare can be stair-stepped away from real NAV and used to overmint/overwithdraw","exploit_scenario":"A malicious keeper collaborates with an attacker contributor and submits a series of tiny `depositBySig` calls that each move `_pricePerShare` by the allowed 25% band. Because the contract only compares the new value to the last recorded value, the keeper can walk `lastPricePerShare` far below real NAV. The attacker then makes a large by-signature deposit at the fake low price, receives far too many garden shares, and later exits against the garden's real valuation, diluting and stealing reserve assets from existing contributors. The same weak check also affects by-signature withdrawals and Heart staking.","recommendation":"Do not trust keeper-supplied share prices. Recompute price per share on-chain for by-signature flows, or at minimum validate the supplied value against the current on-chain valuation within a tight per-transaction tolerance. Do not let historical user-supplied prices become the sole anchor for future pricing.","evidence":"`depositBySig`, `withdrawBySig`, and `stakeBySig` all accept an external `_pricePerShare`. `_checkLastPricePerShare` only bounds the new price against `lastPricePerShare` plus a decay-based slippage window, then overwrites the stored reference unconditionally; it never compares against the garden's actual current valuation.","locations":["contracts/gardens/Garden.sol:315","contracts/gardens/Garden.sol:427","contracts/gardens/Garden.sol:655","contracts/gardens/Garden.sol:1232"]},{"severity":"high","category":"auth","title":"`claimAndStakeRewardsBySig` signatures are replayable across different gardens","exploit_scenario":"A contributor who is in multiple gardens signs a stake-and-claim message for Garden A. A malicious keeper instead submits that same signature to Garden B where the contributor's garden nonce matches. Garden B accepts it because the signed hash is bound to `heartGarden` rather than `address(this)`, then `_sendRewardsInternal` pays out Garden B's reserve-asset rewards and BABL allocation. The attacker can choose whichever matching garden has the largest rewards set aside, draining funds from an unintended garden with a signature that was never scoped to it.","recommendation":"Bind the source garden into the signed payload and verification path. `claimAndStakeRewardsBySig` should hash `address(this)` (and ideally `chainid`) in addition to the Heart-garden context, or use separate signatures for source-garden reward claims and Heart staking.","evidence":"The signed type for staking rewards does not include a source garden field, and `claimAndStakeRewardsBySig` hashes `address(heartGarden)` instead of `address(this)`. Verification then checks only the contributor nonce of whichever garden executes the call, so the same signature is valid in any garden where that nonce matches.","locations":["contracts/gardens/Garden.sol:107","contracts/gardens/Garden.sol:576","contracts/gardens/Garden.sol:590","contracts/gardens/Garden.sol:605"]},{"severity":"medium","category":"access_control","title":"First `setTimeLockRegistry` call is permissionless, enabling vesting-registry takeover","exploit_scenario":"After deployment, if `timeLockRegistry` has not already been initialized in a constructor/initializer, any external account can call `setTimeLockRegistry` first and point it to an attacker-controlled contract. That attacker then becomes the permanent registry authority because future rotations are gated by `Ownable(timeLockRegistry).owner()`. With control of the registry, the attacker can disrupt claims and claw back still-locked team/advisor balances through the token's `onlyTimeLockRegistry` paths.","recommendation":"Make the registry immutable at deployment, or gate the first assignment with `onlyOwner`/a one-time initializer. Do not allow the zero-state registry check to bypass access control.","evidence":"`onlyTimeLockOwner` performs no authorization when `timeLockRegistry` is still zero. `setTimeLockRegistry` uses that modifier directly, so the initial registry assignment is unrestricted.","locations":["contracts/token/TimeLockedToken.sol:69","contracts/token/TimeLockedToken.sol:155","contracts/token/TimeLockedToken.sol:161"]}]}
View stderr
}

        return result;
    }
}

================================================================================
FILE: contracts/lib/SafeDecimalMath.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0

pragma solidity 0.7.6;

import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol';

import {LowGasSafeMath} from '../lib/LowGasSafeMath.sol';
import {UniversalERC20} from '../lib/UniversalERC20.sol';

library SafeDecimalMath {
    using LowGasSafeMath for uint256;
    using UniversalERC20 for IERC20;

    /* Number of decimal places in the representations. */
    uint8 internal constant decimals = 18;

    /* The number representing 1.0. */
    uint256 internal constant UNIT = 10**uint256(decimals);

    /**
     * @return Provides an interface to UNIT.
     */
    function unit() internal pure returns (uint256) {
        return UNIT;
    }

    /**
     * @return The result of multiplying x and y, interpreting the operands as fixed-point
     * decimals.
     *
     * @dev A unit factor is divided out after the product of x and y is evaluated,
     * so that product must be less than 2**256. As this is an integer division,

exec
/bin/bash -lc "sed -n '3601,4400p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
 succeeded in 0ms:
     * the internal division always rounds down. This helps save on gas. Rounding
     * is more expensive on gas.
     */
    function multiplyDecimal(uint256 x, uint256 y) internal pure returns (uint256) {
        /* Divide by UNIT to remove the extra factor introduced by the product. */
        return x.mul(y) / UNIT;
    }

    /**
     * @return The result of safely multiplying x and y, interpreting the operands
     * as fixed-point decimals of the specified precision unit.
     *
     * @dev The operands should be in the form of a the specified unit factor which will be
     * divided out after the product of x and y is evaluated, so that product must be
     * less than 2**256.
     *
     * Unlike multiplyDecimal, this function rounds the result to the nearest increment.
     * Rounding is useful when you need to retain fidelity for small decimal numbers
     * (eg. small fractions or percentages).
     */
    function _multiplyDecimalRound(
        uint256 x,
        uint256 y,
        uint256 precisionUnit
    ) private pure returns (uint256) {
        /* Divide by UNIT to remove the extra factor introduced by the product. */
        uint256 quotientTimesTen = x.mul(y) / (precisionUnit / 10);

        if (quotientTimesTen % 10 >= 5) {
            quotientTimesTen += 10;
        }

        return quotientTimesTen / 10;
    }

    /**
     * @return The result of safely multiplying x and y, interpreting the operands
     * as fixed-point decimals of a standard unit.
     *
     * @dev The operands should be in the standard unit factor which will be
     * divided out after the product of x and y is evaluated, so that product must be
     * less than 2**256.
     *
     * Unlike multiplyDecimal, this function rounds the result to the nearest increment.
     * Rounding is useful when you need to retain fidelity for small decimal numbers
     * (eg. small fractions or percentages).
     */
    function multiplyDecimalRound(uint256 x, uint256 y) internal pure returns (uint256) {
        return _multiplyDecimalRound(x, y, UNIT);
    }

    /**
     * @return The result of safely dividing x and y. The return value is a high
     * precision decimal.
     *
     * @dev y is divided after the product of x and the standard precision unit
     * is evaluated, so the product of x and UNIT must be less than 2**256. As
     * this is an integer division, the result is always rounded down.
     * This helps save on gas. Rounding is more expensive on gas.
     */
    function divideDecimal(uint256 x, uint256 y) internal pure returns (uint256) {
        /* Reintroduce the UNIT factor that will be divided out by y. */
        return x.mul(UNIT).div(y);
    }

    /**
     * @return The result of safely dividing x and y. The return value is as a rounded
     * decimal in the precision unit specified in the parameter.
     *
     * @dev y is divided after the product of x and the specified precision unit
     * is evaluated, so the product of x and the specified precision unit must
     * be less than 2**256. The result is rounded to the nearest increment.
     */
    function _divideDecimalRound(
        uint256 x,
        uint256 y,
        uint256 precisionUnit
    ) private pure returns (uint256) {
        uint256 resultTimesTen = x.mul(precisionUnit * 10).div(y);

        if (resultTimesTen % 10 >= 5) {
            resultTimesTen += 10;
        }

        return resultTimesTen / 10;
    }

    /**
     * @return The result of safely dividing x and y. The return value is as a rounded
     * standard precision decimal.
     *
     * @dev y is divided after the product of x and the standard precision unit
     * is evaluated, so the product of x and the standard precision unit must
     * be less than 2**256. The result is rounded to the nearest increment.
     */
    function divideDecimalRound(uint256 x, uint256 y) internal pure returns (uint256) {
        return _divideDecimalRound(x, y, UNIT);
    }

    /**
     * Normalizing amount decimals between tokens
     * @param _from       ERC20 asset address
     * @param _to     ERC20 asset address
     * @param _amount Value _to normalize (e.g. capital)
     */
    function normalizeAmountTokens(
        address _from,
        address _to,
        uint256 _amount
    ) internal view returns (uint256) {
        uint256 fromDecimals = IERC20(_from).universalDecimals();
        uint256 toDecimals = IERC20(_to).universalDecimals();

        if (fromDecimals == toDecimals) {
            return _amount;
        }
        if (toDecimals > fromDecimals) {
            return _amount.mul(10**(toDecimals - (fromDecimals)));
        }
        return _amount.div(10**(fromDecimals - (toDecimals)));
    }
}

================================================================================
FILE: contracts/lib/SignatureChecker.sol
================================================================================
// SPDX-License-Identifier: MIT

pragma solidity 0.7.6;

import {ECDSA} from '@openzeppelin/contracts/cryptography/ECDSA.sol';
import {Address} from '@openzeppelin/contracts/utils/Address.sol';

import {IERC1271} from '../interfaces/IERC1271.sol';

/**
 * @dev Signature verification helper: Provide a single mechanism to verify both private-key (EOA) ECDSA signature and
 * ERC1271 contract sigantures. Using this instead of ECDSA.recover in your contract will make them compatible with
 * smart contract wallets such as Argent and Gnosis.
 *
 * Note: unlike ECDSA signatures, contract signature's are revocable, and the outcome of this function can thus change
 * through time. It could return true at block N and false at block N+1 (or the opposite).
 *
 */

library SignatureChecker {
    function isValidSignatureNow(
        address signer,
        bytes32 hash,
        bytes memory signature
    ) internal view returns (bool) {
        if (Address.isContract(signer)) {
            try IERC1271(signer).isValidSignature(hash, signature) returns (bytes4 magicValue) {
                return magicValue == IERC1271(signer).isValidSignature.selector;
            } catch {
                return false;
            }
        } else {
            return ECDSA.recover(hash, signature) == signer;
        }
    }
}

================================================================================
FILE: contracts/lib/UniversalERC20.sol
================================================================================
// SPDX-License-Identifier: MIT

pragma solidity 0.7.6;

import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/SafeERC20.sol';
import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import {SafeMath} from '@openzeppelin/contracts/math/SafeMath.sol';

library UniversalERC20 {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    IERC20 private constant ZERO_ADDRESS = IERC20(0x0000000000000000000000000000000000000000);
    IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);

    function universalTransfer(
        IERC20 token,
        address to,
        uint256 amount
    ) internal returns (bool) {
        if (amount == 0) {
            return true;
        }

        if (isETH(token)) {
            address(uint160(to)).transfer(amount);
            return true;
        } else {
            token.safeTransfer(to, amount);
            return true;
        }
    }

    function universalTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        if (amount == 0) {
            return;
        }

        if (isETH(token)) {
            require(from == msg.sender && msg.value >= amount, 'msg.value is zero');
            if (to != address(this)) {
                address(uint160(to)).transfer(amount);
            }
            if (msg.value > amount) {
                msg.sender.transfer(msg.value.sub(amount));
            }
        } else {
            token.safeTransferFrom(from, to, amount);
        }
    }

    function universalApprove(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        if (!isETH(token)) {
            if (amount > 0 && token.allowance(address(this), to) > 0) {
                token.safeApprove(to, 0);
            }
            token.safeApprove(to, amount);
        }
    }

    function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) {
        if (isETH(token)) {
            return who.balance;
        } else {
            return token.balanceOf(who);
        }
    }

    function universalDecimals(IERC20 token) internal view returns (uint256) {
        if (isETH(token)) {
            return 18;
        }

        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSignature('decimals()'));

        return success ? abi.decode(data, (uint256)) : 18;
    }

    function isETH(IERC20 token) internal pure returns (bool) {
        return address(token) == address(ZERO_ADDRESS) || address(token) == address(ETH_ADDRESS);
    }
}

================================================================================
FILE: contracts/proxy/VTableBeacon.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0

pragma solidity 0.7.6;
pragma abicoder v2;

import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';

/**
 * @title VTableBeacon
 * @notice Redirects calls to an implementation based on the method signature
 */
contract VTableBeacon is Ownable {
    struct ModuleDefinition {
        address implementation;
        bytes4[] selectors;
    }

    bytes4 private constant _FALLBACK_SIGN = 0xffffffff;

    // Mapping of methods signatures to their implementations
    mapping(bytes4 => address) public delegates;

    event VTableUpdate(bytes4 indexed selector, address oldImplementation, address newImplementation);

    function implementation(bytes4 _selector) external view virtual returns (address module) {
        module = delegates[_selector];
        if (module != address(0)) return module;

        module = delegates[_FALLBACK_SIGN];
        if (module != address(0)) return module;

        revert('VTableBeacon: No implementation found');
    }

    /**
     * @dev Updates the vtable
     */
    function updateVTable(ModuleDefinition[] calldata modules) external onlyOwner {
        for (uint256 i = 0; i < modules.length; ++i) {
            ModuleDefinition memory module = modules[i];
            for (uint256 j = 0; j < module.selectors.length; ++j) {
                bytes4 selector = module.selectors[j];
                emit VTableUpdate(selector, delegates[selector], module.implementation);
                delegates[selector] = module.implementation;
            }
        }
    }
}

================================================================================
FILE: contracts/proxy/VTableBeaconProxy.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0

pragma solidity 0.7.6;
pragma abicoder v2;

import '@openzeppelin/contracts/proxy/Proxy.sol';

import './VTableBeacon.sol';

/**
 * @title VTableBeaconProxy
 */
contract VTableBeaconProxy is Proxy {
    VTableBeacon public immutable beacon;

    constructor(VTableBeacon _beacon) {
        beacon = _beacon;
    }

    function _implementation() internal view virtual override returns (address module) {
        return beacon.implementation(msg.sig);
    }
}

================================================================================
FILE: contracts/token/TimeLockRegistry.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0

pragma solidity 0.7.6;
pragma experimental ABIEncoderV2;
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
import {Address} from '@openzeppelin/contracts/utils/Address.sol';
import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/SafeERC20.sol';
import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol';

import {TimeLockedToken} from './TimeLockedToken.sol';
import {AddressArrayUtils} from '../lib/AddressArrayUtils.sol';

import {LowGasSafeMath} from '../lib/LowGasSafeMath.sol';

/**
 * @title TimeLockRegistry
 * @notice Register Lockups for TimeLocked ERC20 Token BABL (e.g. vesting)
 * @author Babylon Finance
 * @dev This contract allows owner to register distributions for a TimeLockedToken
 *
 * To register a distribution, register method should be called by the owner.
 * claim() should be called only by the BABL Token smartcontract (modifier onlyBABLToken)
 *  when any account registered to receive tokens make its own claim
 * If case of a mistake, owner can cancel registration before the claim is done by the account
 *
 * Note this contract address must be setup in the TimeLockedToken's contract pointing
 * to interact with (e.g. setTimeLockRegistry() function)
 */

contract TimeLockRegistry is Ownable {
    using LowGasSafeMath for uint256;
    using Address for address;
    using AddressArrayUtils for address[];

    /* ============ Events ============ */

    event Register(address receiver, uint256 distribution);
    event Cancel(address receiver, uint256 distribution);
    event Claim(address account, uint256 distribution);

    /* ============ Modifiers ============ */

    modifier onlyBABLToken() {
        require(msg.sender == address(token), 'only BABL Token');
        _;
    }

    /* ============ State Variables ============ */

    // time locked token
    TimeLockedToken public token;

    /**
     * @notice The profile of each token owner under vesting conditions and its special conditions
     * @param receiver Account being registered
     * @param investorType Indicates whether or not is a Team member (true = team member / advisor, false = private investor)
     * @param vestingStarting Date When the vesting begins for such token owner
     * @param distribution Tokens amount that receiver is due to get
     */
    struct Registration {
        address receiver;
        uint256 distribution;
        bool investorType;
        uint256 vestingStartingDate;
    }

    /**
     * @notice The profile of each token owner under vesting conditions and its special conditions
     * @param team Indicates whether or not is a Team member (true = team member / advisor, false = private investor)
     * @param vestingBegin When the vesting begins for such token owner
     * @param vestingEnd When the vesting ends for such token owner
     * @param lastClaim When the last claim was done
     */
    struct TokenVested {
        bool team;
        bool cliff;
        uint256 vestingBegin;
        uint256 vestingEnd;
        uint256 lastClaim;
    }

    /// @notice A record of token owners under vesting conditions for each account, by index
    mapping(address => TokenVested) public tokenVested;

    // mapping from token owners under vesting conditions to BABL due amount (e.g. SAFT addresses, team members, advisors)
    mapping(address => uint256) public registeredDistributions;

    // array of all registrations
    address[] public registrations;

    // total amount of tokens registered
    uint256 public totalTokens;

    // vesting for Team Members
    uint256 private constant teamVesting = 365 days * 4;

    // vesting for Investors and Advisors
    uint256 private constant investorVesting = 365 days * 3;

    /* ============ Functions ============ */

    /* ============ Constructor ============ */

    /**
     * @notice Construct a new Time Lock Registry and gives ownership to sender
     * @param _token TimeLockedToken contract to use in this registry
     */
    constructor(TimeLockedToken _token) {
        token = _token;
    }

    /* ============ External Functions ============ */

    /* ============ External Getter Functions ============ */

    /**
     * Gets registrations
     *
     * @return  address[]        Returns list of registrations
     */

    function getRegistrations() external view returns (address[] memory) {
        return registrations;
    }

    /* ===========  Token related Gov Functions ====== */

    /**
     * PRIVILEGED GOVERNANCE FUNCTION
     *
     * @notice Register multiple investors/team in a batch
     * @param _registrations Registrations to process
     */
    function registerBatch(Registration[] memory _registrations) external onlyOwner {
        for (uint256 i = 0; i < _registrations.length; i++) {
            register(
                _registrations[i].receiver,
                _registrations[i].distribution,
                _registrations[i].investorType,
                _registrations[i].vestingStartingDate
            );
        }
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION
     *
     * @notice Register new account under vesting conditions (Team, Advisors, Investors e.g. SAFT purchaser)
     * @param receiver Address belonging vesting conditions
     * @param distribution Tokens amount that receiver is due to get
     */
    function register(
        address receiver,
        uint256 distribution,
        bool investorType,
        uint256 vestingStartingDate
    ) public onlyOwner {
        require(receiver != address(0), 'TimeLockRegistry::register: cannot register the zero address');
        require(
            receiver != address(this),
            'TimeLockRegistry::register: Time Lock Registry contract cannot be an investor'
        );
        require(distribution != 0, 'TimeLockRegistry::register: Distribution = 0');
        require(
            registeredDistributions[receiver] == 0,
            'TimeLockRegistry::register:Distribution for this address is already registered'
        );
        require(vestingStartingDate >= 1614553200, 'Cannot register earlier than March 2021'); // 1614553200 is UNIX TIME of 2021 March the 1st
        require(
            vestingStartingDate <= block.timestamp.add(30 days),
            'Cannot register more than 30 days ahead in the future'
        );
        require(totalTokens.add(distribution) <= IERC20(token).balanceOf(address(this)), 'Not enough tokens');

        totalTokens = totalTokens.add(distribution);
        // register distribution
        registeredDistributions[receiver] = distribution;
        registrations.push(receiver);

        // register token vested conditions
        TokenVested storage newTokenVested = tokenVested[receiver];
        newTokenVested.team = investorType;
        newTokenVested.vestingBegin = vestingStartingDate;

        if (newTokenVested.team == true) {
            newTokenVested.vestingEnd = vestingStartingDate.add(teamVesting);
        } else {
            newTokenVested.vestingEnd = vestingStartingDate.add(investorVesting);
        }
        newTokenVested.lastClaim = vestingStartingDate;

        tokenVested[receiver] = newTokenVested;

        // emit register event
        emit Register(receiver, distribution);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Cancel distribution registration in case of mistake and before a claim is done
     *
     * @notice Cancel distribution registration
     * @dev A claim has not to be done earlier
     * @param receiver Address that should have it's distribution removed
     * @return Whether or not it succeeded
     */
    function cancelRegistration(address receiver) external onlyOwner returns (bool) {
        require(registeredDistributions[receiver] != 0, 'Not registered');

        // get amount from distributions
        uint256 amount = registeredDistributions[receiver];

        // set distribution mapping to 0
        delete registeredDistributions[receiver];

        // set tokenVested mapping to 0
        delete tokenVested[receiver];

        // remove from the list of all registrations
        registrations.remove(receiver);

        // decrease total tokens
        totalTokens = totalTokens.sub(amount);

        // emit cancel event
        emit Cancel(receiver, amount);

        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Cancel distribution registration in case of mistake and before a claim is done
     *
     * @notice Cancel already delivered tokens. It might only apply when non-completion of vesting period of Team members or Advisors
     * @dev An automatic override allowance is granted during the claim process
     * @param account Address that should have it's distribution removed
     * @return Whether or not it succeeded
     */
    function cancelDeliveredTokens(address account) external onlyOwner returns (bool) {
        uint256 loosingAmount = token.cancelVestedTokens(account);

        // emit cancel event
        emit Cancel(account, loosingAmount);
        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Recover tokens in Time Lock Registry smartcontract address by the owner
     *
     * @notice Send tokens from smartcontract address to the owner.
     * It might only apply after a cancellation of vested tokens
     * @param amount Amount to be recovered by the owner of the Time Lock Registry smartcontract from its balance
     * @return Whether or not it succeeded
     */
    function transferToOwner(uint256 amount) external onlyOwner returns (bool) {
        SafeERC20.safeTransfer(token, msg.sender, amount);
        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Claim locked tokens by the registered account
     *
     * @notice Claim tokens due amount.
     * @dev Claim is done by the user in the TimeLocked contract and the contract is the only allowed to call
     * this function on behalf of the user to make the claim
     * @return The amount of tokens registered and delivered after the claim
     */
    function claim(address _receiver) external onlyBABLToken returns (uint256) {
        require(registeredDistributions[_receiver] != 0, 'Not registered');

        // get amount from distributions
        uint256 amount = registeredDistributions[_receiver];
        TokenVested storage claimTokenVested = tokenVested[_receiver];

        claimTokenVested.lastClaim = block.timestamp;

        // set distribution mapping to 0
        delete registeredDistributions[_receiver];

        // decrease total tokens
        totalTokens = totalTokens.sub(amount);

        // register lockup in TimeLockedToken
        // this will transfer funds from this contract and lock them for sender
        token.registerLockup(
            _receiver,
            amount,
            claimTokenVested.team,
            claimTokenVested.vestingBegin,
            claimTokenVested.vestingEnd,
            claimTokenVested.lastClaim
        );

        // set tokenVested mapping to 0
        delete tokenVested[_receiver];

        // emit claim event
        emit Claim(_receiver, amount);

        return amount;
    }

    /* ============ Getter Functions ============ */

    function checkVesting(address address_)
        external
        view
        returns (
            bool team,
            uint256 start,
            uint256 end,
            uint256 last
        )
    {
        TokenVested storage checkTokenVested = tokenVested[address_];

        return (
            checkTokenVested.team,
            checkTokenVested.vestingBegin,
            checkTokenVested.vestingEnd,
            checkTokenVested.lastClaim
        );
    }

    function checkRegisteredDistribution(address address_) external view returns (uint256 amount) {
        return registeredDistributions[address_];
    }
}

================================================================================
FILE: contracts/token/TimeLockedToken.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0

pragma solidity 0.7.6;

import {IBabController} from '../interfaces/IBabController.sol';
import {TimeLockRegistry} from './TimeLockRegistry.sol';
import {IRewardsDistributor} from '../interfaces/IRewardsDistributor.sol';
import {VoteToken} from './VoteToken.sol';
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
import {Errors, _require} from '../lib/BabylonErrors.sol';
import {LowGasSafeMath} from '../lib/LowGasSafeMath.sol';
import {IBabController} from '../interfaces/IBabController.sol';

/**
 * @title TimeLockedToken
 * @notice Time Locked ERC20 Token
 * @author Babylon Finance
 * @dev Contract which gives the ability to time-lock tokens specially for vesting purposes usage
 *
 * By overriding the balanceOf() and transfer() functions in ERC20,
 * an account can show its full, post-distribution balance and use it for voting power
 * but only transfer or spend up to an allowed amount
 *
 * A portion of previously non-spendable tokens are allowed to be transferred
 * along the time depending on each vesting conditions, and after all epochs have passed, the full
 * account balance is unlocked. In case on non-completion vesting period, only the Time Lock Registry can cancel
 * the delivery of the pending tokens and only can cancel the remaining locked ones.
 */

abstract contract TimeLockedToken is VoteToken {
    using LowGasSafeMath for uint256;

    /* ============ Events ============ */

    /// @notice An event that emitted when a new lockout ocurr
    event NewLockout(
        address account,
        uint256 tokenslocked,
        bool isTeamOrAdvisor,
        uint256 startingVesting,
        uint256 endingVesting
    );

    /// @notice An event that emitted when a new Time Lock is registered
    event NewTimeLockRegistration(address previousAddress, address newAddress);

    /// @notice An event that emitted when a new Rewards Distributor is registered
    event NewRewardsDistributorRegistration(address previousAddress, address newAddress);

    /// @notice An event that emitted when a cancellation of Lock tokens is registered
    event Cancel(address account, uint256 amount);

    /// @notice An event that emitted when a claim of tokens are registered
    event Claim(address _receiver, uint256 amount);

    /// @notice An event that emitted when a lockedBalance query is done
    event LockedBalance(address _account, uint256 amount);

    /* ============ Modifiers ============ */

    modifier onlyTimeLockRegistry() {
        require(
            msg.sender == address(timeLockRegistry),
            'TimeLockedToken:: onlyTimeLockRegistry: can only be executed by TimeLockRegistry'
        );
        _;
    }

    modifier onlyTimeLockOwner() {
        if (address(timeLockRegistry) != address(0)) {
            require(
                msg.sender == Ownable(timeLockRegistry).owner(),
                'TimeLockedToken:: onlyTimeLockOwner: can only be executed by the owner of TimeLockRegistry'
            );
        }
        _;
    }
    modifier onlyUnpaused() {
        // Do not execute if Globally or individually paused
        _require(!IBabController(controller).isPaused(address(this)), Errors.ONLY_UNPAUSED);
        _;
    }

    /* ============ State Variables ============ */

    // represents total distribution for locked balances
    mapping(address => uint256) distribution;

    /// @notice The profile of each token owner under its particular vesting conditions
    /**
     * @param team Indicates whether or not is a Team member or Advisor (true = team member/advisor, false = private investor)
     * @param vestingBegin When the vesting begins for such token owner
     * @param vestingEnd When the vesting ends for such token owner
     * @param lastClaim When the last claim was done
     */
    struct VestedToken {
        bool teamOrAdvisor;
        uint256 vestingBegin;
        uint256 vestingEnd;
        uint256 lastClaim;
    }

    /// @notice A record of token owners under vesting conditions for each account, by index
    mapping(address => VestedToken) public vestedToken;

    // address of Time Lock Registry contract
    IBabController public controller;

    // address of Time Lock Registry contract
    TimeLockRegistry public timeLockRegistry;

    // address of Rewards Distriburor contract
    IRewardsDistributor public rewardsDistributor;

    // Enable Transfer of ERC20 BABL Tokens
    // Only Minting or transfers from/to TimeLockRegistry and Rewards Distributor can transfer tokens until the protocol is fully decentralized
    bool private tokenTransfersEnabled;
    bool private tokenTransfersWereDisabled;

    /* ============ Functions ============ */

    /* ============ Constructor ============ */

    constructor(string memory _name, string memory _symbol) VoteToken(_name, _symbol) {
        tokenTransfersEnabled = true;
    }

    /* ============ External Functions ============ */


exec
/bin/bash -lc "sed -n '4401,5200p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
 succeeded in 0ms:
    /* ===========  Token related Gov Functions ====== */

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Disables transfers of ERC20 BABL Tokens
     */
    function disableTokensTransfers() external onlyOwner {
        require(!tokenTransfersWereDisabled, 'BABL must flow');
        tokenTransfersEnabled = false;
        tokenTransfersWereDisabled = true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows transfers of ERC20 BABL Tokens
     * Can only happen after the protocol is fully decentralized.
     */
    function enableTokensTransfers() external onlyOwner {
        tokenTransfersEnabled = true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Set the Time Lock Registry contract to control token vesting conditions
     *
     * @notice Set the Time Lock Registry contract to control token vesting conditions
     * @param newTimeLockRegistry Address of TimeLockRegistry contract
     */
    function setTimeLockRegistry(TimeLockRegistry newTimeLockRegistry) external onlyTimeLockOwner returns (bool) {
        require(address(newTimeLockRegistry) != address(0), 'cannot be zero address');
        require(address(newTimeLockRegistry) != address(this), 'cannot be this contract');
        require(address(newTimeLockRegistry) != address(timeLockRegistry), 'must be new TimeLockRegistry');
        emit NewTimeLockRegistration(address(timeLockRegistry), address(newTimeLockRegistry));

        timeLockRegistry = newTimeLockRegistry;

        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Set the Rewards Distributor contract to control either BABL Mining or profit rewards
     *
     * @notice Set the Rewards Distriburor contract to control both types of rewards (profit and BABL Mining program)
     * @param newRewardsDistributor Address of Rewards Distributor contract
     */
    function setRewardsDistributor(IRewardsDistributor newRewardsDistributor) external onlyOwner returns (bool) {
        require(address(newRewardsDistributor) != address(0), 'cannot be zero address');
        require(address(newRewardsDistributor) != address(this), 'cannot be this contract');
        require(address(newRewardsDistributor) != address(rewardsDistributor), 'must be new Rewards Distributor');
        emit NewRewardsDistributorRegistration(address(rewardsDistributor), address(newRewardsDistributor));

        rewardsDistributor = newRewardsDistributor;

        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Register new token lockup conditions for vested tokens defined only by Time Lock Registry
     *
     * @notice Tokens are completely delivered during the registration however lockup conditions apply for vested tokens
     * locking them according to the distribution epoch periods and the type of recipient (Team, Advisor, Investor)
     * Emits a transfer event showing a transfer to the recipient
     * Only the registry can call this function
     * @param _receiver Address to receive the tokens
     * @param _amount Tokens to be transferred
     * @param _profile True if is a Team Member or Advisor
     * @param _vestingBegin Unix Time when the vesting for that particular address
     * @param _vestingEnd Unix Time when the vesting for that particular address
     * @param _lastClaim Unix Time when the claim was done from that particular address
     *
     */
    function registerLockup(
        address _receiver,
        uint256 _amount,
        bool _profile,
        uint256 _vestingBegin,
        uint256 _vestingEnd,
        uint256 _lastClaim
    ) external onlyTimeLockRegistry returns (bool) {
        require(balanceOf(msg.sender) >= _amount, 'insufficient balance');
        require(_receiver != address(0), 'cannot be zero address');
        require(_receiver != address(this), 'cannot be this contract');
        require(_receiver != address(timeLockRegistry), 'cannot be the TimeLockRegistry contract itself');
        require(_receiver != msg.sender, 'the owner cannot lockup itself');

        // update amount of locked distribution
        distribution[_receiver] = distribution[_receiver].add(_amount);

        VestedToken storage newVestedToken = vestedToken[_receiver];

        newVestedToken.teamOrAdvisor = _profile;
        newVestedToken.vestingBegin = _vestingBegin;
        newVestedToken.vestingEnd = _vestingEnd;
        newVestedToken.lastClaim = _lastClaim;

        // transfer tokens to the recipient
        _transfer(msg.sender, _receiver, _amount);
        emit NewLockout(_receiver, _amount, _profile, _vestingBegin, _vestingEnd);

        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Cancel and remove locked tokens due to non-completion of vesting period
     * applied only by Time Lock Registry and specifically to Team or Advisors as it does not apply to investors.
     *
     * @dev Cancel distribution registration
     * @param lockedAccount that should have its still locked distribution removed due to non-completion of its vesting period
     */
    function cancelVestedTokens(address lockedAccount) external onlyTimeLockRegistry returns (uint256) {
        return _cancelVestedTokensFromTimeLock(lockedAccount);
    }

    /**
     * GOVERNANCE FUNCTION. Each token owner can claim its own specific tokens with its own specific vesting conditions from the Time Lock Registry
     *
     * @dev Claim msg.sender tokens (if any available in the registry)
     */
    function claimMyTokens() external {
        // claim msg.sender tokens from timeLockRegistry
        uint256 amount = timeLockRegistry.claim(msg.sender);
        // After a proper claim, locked tokens of Team and Advisors profiles are under restricted special vesting conditions so they automatic grant
        // rights to the Time Lock Registry to only retire locked tokens if non-compliance vesting conditions take places along the vesting periods.
        // It does not apply to Investors under vesting (their locked tokens cannot be removed).
        if (vestedToken[msg.sender].teamOrAdvisor == true) {
            approve(address(timeLockRegistry), amount);
        }
        // emit claim event
        emit Claim(msg.sender, amount);
    }

    /**
     * GOVERNANCE FUNCTION. Get unlocked balance for an account
     *
     * @notice Get unlocked balance for an account
     * @param account Account to check
     * @return Amount that is unlocked and available eg. to transfer
     */
    function unlockedBalance(address account) public returns (uint256) {
        // totalBalance - lockedBalance
        return balanceOf(account).sub(lockedBalance(account));
    }

    /**
     * GOVERNANCE FUNCTION. View the locked balance for an account
     *
     * @notice View locked balance for an account
     * @param account Account to check
     * @return Amount locked in the time of checking
     */

    function viewLockedBalance(address account) public view returns (uint256) {
        // distribution of locked tokens
        // get amount from distributions

        uint256 amount = distribution[account];
        uint256 lockedAmount = amount;

        // Team and investors cannot transfer tokens in the first year
        if (vestedToken[account].vestingBegin.add(365 days) > block.timestamp && amount != 0) {
            return lockedAmount;
        }

        // in case of vesting has passed, all tokens are now available, if no vesting lock is 0 as well
        if (block.timestamp >= vestedToken[account].vestingEnd || amount == 0) {
            lockedAmount = 0;
        } else if (amount != 0) {
            // in case of still under vesting period, locked tokens are recalculated
            lockedAmount = amount.mul(vestedToken[account].vestingEnd.sub(block.timestamp)).div(
                vestedToken[account].vestingEnd.sub(vestedToken[account].vestingBegin)
            );
        }
        return lockedAmount;
    }

    /**
     * GOVERNANCE FUNCTION. Get locked balance for an account
     *
     * @notice Get locked balance for an account
     * @param account Account to check
     * @return Amount locked in the time of checking
     */
    function lockedBalance(address account) public returns (uint256) {
        // get amount from distributions locked tokens (if any)
        uint256 lockedAmount = viewLockedBalance(account);
        // in case of vesting has passed, all tokens are now available so we set mapping to 0 only for accounts under vesting
        if (
            block.timestamp >= vestedToken[account].vestingEnd &&
            msg.sender == account &&
            lockedAmount == 0 &&
            vestedToken[account].vestingEnd != 0
        ) {
            delete distribution[account];
        }
        emit LockedBalance(account, lockedAmount);
        return lockedAmount;
    }

    /**
     * PUBLIC FUNCTION. Get the address of Time Lock Registry
     *
     * @notice Get the address of Time Lock Registry
     * @return Address of the Time Lock Registry
     */
    function getTimeLockRegistry() external view returns (address) {
        return address(timeLockRegistry);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Override the Approval of allowances of ERC20 with special conditions for vesting
     *
     * @notice Override of "Approve" function to allow the `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender` except in the case of spender is Time Lock Registry
     * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint256 rawAmount) public override nonReentrant returns (bool) {
        require(spender != address(0), 'TimeLockedToken::approve: spender cannot be zero address');
        require(spender != msg.sender, 'TimeLockedToken::approve: spender cannot be the msg.sender');

        uint96 amount;
        if (rawAmount == uint256(-1)) {
            amount = uint96(-1);
        } else {
            amount = safe96(rawAmount, 'TimeLockedToken::approve: amount exceeds 96 bits');
        }

        // There is no option to decreaseAllowance to timeLockRegistry in case of vested tokens
        if ((spender == address(timeLockRegistry)) && (amount < allowance(msg.sender, address(timeLockRegistry)))) {
            amount = safe96(
                allowance(msg.sender, address(timeLockRegistry)),
                'TimeLockedToken::approve: cannot decrease allowance to timelockregistry'
            );
        }
        _approve(msg.sender, spender, amount);
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Override the Increase of allowances of ERC20 with special conditions for vesting
     *
     * @notice Atomically increases the allowance granted to `spender` by the caller.
     *
     * @dev This is an override with respect to the fulfillment of vesting conditions along the way
     * However an user can increase allowance many times, it will never be able to transfer locked tokens during vesting period
     * @return Whether or not the increaseAllowance succeeded
     */
    function increaseAllowance(address spender, uint256 addedValue) public override nonReentrant returns (bool) {
        require(
            unlockedBalance(msg.sender) >= allowance(msg.sender, spender).add(addedValue) ||
                spender == address(timeLockRegistry),
            'TimeLockedToken::increaseAllowance:Not enough unlocked tokens'
        );
        require(spender != address(0), 'TimeLockedToken::increaseAllowance:Spender cannot be zero address');
        require(spender != msg.sender, 'TimeLockedToken::increaseAllowance:Spender cannot be the msg.sender');
        _approve(msg.sender, spender, allowance(msg.sender, spender).add(addedValue));
        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Override the decrease of allowances of ERC20 with special conditions for vesting
     *
     * @notice Atomically decrease the allowance granted to `spender` by the caller.
     *
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     * This is an override with respect to the fulfillment of vesting conditions along the way
     * An user cannot decrease the allowance to the Time Lock Registry who is in charge of vesting conditions
     * @return Whether or not the decreaseAllowance succeeded
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public override nonReentrant returns (bool) {
        require(spender != address(0), 'TimeLockedToken::decreaseAllowance:Spender cannot be zero address');
        require(spender != msg.sender, 'TimeLockedToken::decreaseAllowance:Spender cannot be the msg.sender');
        require(
            allowance(msg.sender, spender) >= subtractedValue,
            'TimeLockedToken::decreaseAllowance:Underflow condition'
        );

        // There is no option to decreaseAllowance to timeLockRegistry in case of vested tokens
        require(
            address(spender) != address(timeLockRegistry),
            'TimeLockedToken::decreaseAllowance:cannot decrease allowance to timeLockRegistry'
        );

        _approve(msg.sender, spender, allowance(msg.sender, spender).sub(subtractedValue));
        return true;
    }

    /* ============ Internal Only Function ============ */

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Override the _transfer of ERC20 BABL tokens only allowing the transfer of unlocked tokens
     *
     * @dev Transfer function which includes only unlocked tokens
     * Locked tokens can always be transfered back to the returns address
     * Transferring to owner allows re-issuance of funds through registry
     *
     * @param _from The address to send tokens from
     * @param _to The address that will receive the tokens
     * @param _value The amount of tokens to be transferred
     */
    function _transfer(
        address _from,
        address _to,
        uint256 _value
    ) internal override onlyUnpaused {
        require(_from != address(0), 'TimeLockedToken:: _transfer: cannot transfer from the zero address');
        require(_to != address(0), 'TimeLockedToken:: _transfer: cannot transfer to the zero address');
        require(
            _to != address(this),
            'TimeLockedToken:: _transfer: do not transfer tokens to the token contract itself'
        );

        require(balanceOf(_from) >= _value, 'TimeLockedToken:: _transfer: insufficient balance');

        // check if enough unlocked balance to transfer
        require(unlockedBalance(_from) >= _value, 'TimeLockedToken:: _transfer: attempting to transfer locked funds');
        super._transfer(_from, _to, _value);
        // voting power
        _moveDelegates(
            delegates[_from],
            delegates[_to],
            safe96(_value, 'TimeLockedToken:: _transfer: uint96 overflow')
        );
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Disable BABL token transfer until certain conditions are met
     *
     * @dev Override the _beforeTokenTransfer of ERC20 BABL tokens until certain conditions are met:
     * Only allowing minting or transfers from Time Lock Registry and Rewards Distributor until transfers are allowed in the controller
     * Transferring to owner allows re-issuance of funds through registry
     *
     * @param _from The address to send tokens from
     * @param _to The address that will receive the tokens
     * @param _value The amount of tokens to be transferred
     */

    // Disable garden token transfers. Allow minting and burning.
    function _beforeTokenTransfer(
        address _from,
        address _to,
        uint256 _value
    ) internal virtual override {
        super._beforeTokenTransfer(_from, _to, _value);
        _require(
            _from == address(0) ||
                _from == address(timeLockRegistry) ||
                _from == address(rewardsDistributor) ||
                _to == address(timeLockRegistry) ||
                tokenTransfersEnabled,
            Errors.BABL_TRANSFERS_DISABLED
        );
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Cancel and remove locked tokens due to non-completion of  vesting period
     * applied only by Time Lock Registry and specifically to Team or Advisors
     *
     * @dev Cancel distribution registration
     * @param lockedAccount that should have its still locked distribution removed due to non-completion of its vesting period
     */
    function _cancelVestedTokensFromTimeLock(address lockedAccount) internal onlyTimeLockRegistry returns (uint256) {
        require(distribution[lockedAccount] != 0, 'TimeLockedToken::cancelTokens:Not registered');

        // get an update on locked amount from distributions at this precise moment
        uint256 loosingAmount = lockedBalance(lockedAccount);

        require(loosingAmount > 0, 'TimeLockedToken::cancelTokens:There are no more locked tokens');
        require(
            vestedToken[lockedAccount].teamOrAdvisor == true,
            'TimeLockedToken::cancelTokens:cannot cancel locked tokens to Investors'
        );

        // set distribution mapping to 0
        delete distribution[lockedAccount];

        // set tokenVested mapping to 0
        delete vestedToken[lockedAccount];

        // transfer only locked tokens back to TimeLockRegistry Owner (msg.sender)
        require(
            transferFrom(lockedAccount, address(timeLockRegistry), loosingAmount),
            'TimeLockedToken::cancelTokens:Transfer failed'
        );

        // emit cancel event
        emit Cancel(lockedAccount, loosingAmount);

        return loosingAmount;
    }
}

================================================================================
FILE: contracts/token/VoteToken.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0

pragma solidity 0.7.6;

import {ERC20} from '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import {IVoteToken} from '../interfaces/IVoteToken.sol';
import {ReentrancyGuard} from '@openzeppelin/contracts/utils/ReentrancyGuard.sol';
import {LowGasSafeMath} from '../lib/LowGasSafeMath.sol';
import {Context} from '@openzeppelin/contracts/utils/Context.sol';
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
import {Address} from '@openzeppelin/contracts/utils/Address.sol';

/**
 * @title VoteToken
 * @notice Custom token which tracks voting power for governance
 * @dev This is an abstraction of a fork of the Compound governance contract
 * VoteToken is used by BABL to allow tracking voting power
 * Checkpoints are created every time state is changed which record voting power
 * Inherits standard ERC20 behavior
 */

abstract contract VoteToken is Context, ERC20, Ownable, IVoteToken, ReentrancyGuard {
    using LowGasSafeMath for uint256;
    using Address for address;

    /* ============ Events ============ */

    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);

    /* ============ Modifiers ============ */

    /* ============ State Variables ============ */

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256('EIP712Domain(string name,uint256 chainId,address verifyingContract)');

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH =
        keccak256('Delegation(address delegatee,uint256 nonce,uint256 expiry)');

    /// @dev A record of votes checkpoints for each account, by index
    mapping(address => address) public delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint96 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping(address => uint32) public numCheckpoints;

    /// @notice A record of states for signing / validating signatures
    mapping(address => uint256) public nonces;

    /* ============ Functions ============ */

    /* ============ Constructor ============ */

    constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {}

    /* ============ External Functions ============ */

    /* ===========  Token related Gov Functions ====== */

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Delegating votes from msg.sender to delegatee
     *
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */

    function delegate(address delegatee) external override {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Delegate votes using signature to 'delegatee'
     *
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */

    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s,
        bool prefix
    ) external override {
        address signatory;
        bytes32 domainSeparator =
            keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this)));
        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
        bytes32 digest = keccak256(abi.encodePacked('\x19\x01', domainSeparator, structHash));
        if (prefix) {
            bytes32 digestHash = keccak256(abi.encodePacked('\x19Ethereum Signed Message:\n32', digest));
            signatory = ecrecover(digestHash, v, r, s);
        } else {
            signatory = ecrecover(digest, v, r, s);
        }

        require(balanceOf(signatory) > 0, 'VoteToken::delegateBySig: invalid delegator');
        require(signatory != address(0), 'VoteToken::delegateBySig: invalid signature');
        require(nonce == nonces[signatory], 'VoteToken::delegateBySig: invalid nonce');
        nonces[signatory]++;
        require(block.timestamp <= expiry, 'VoteToken::delegateBySig: signature expired');
        return _delegate(signatory, delegatee);
    }

    /**
     * GOVERNANCE FUNCTION. Check Delegate votes using signature to 'delegatee'
     *
     * @notice Get current voting power for an account
     * @param account Account to get voting power for
     * @return Voting power for an account
     */
    function getCurrentVotes(address account) external view virtual override returns (uint96) {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * GOVERNANCE FUNCTION. Get voting power at a specific block for an account
     *
     * @param account Account to get voting power for
     * @param blockNumber Block to get voting power at
     * @return Voting power for an account at specific block
     */
    function getPriorVotes(address account, uint256 blockNumber) external view virtual override returns (uint96) {
        require(blockNumber < block.number, 'BABLToken::getPriorVotes: not yet determined');
        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function getMyDelegatee() external view override returns (address) {
        return delegates[msg.sender];
    }

    function getDelegatee(address account) external view override returns (address) {
        return delegates[account];
    }

    function getCheckpoints(address account, uint32 id)
        external
        view
        override
        returns (uint32 fromBlock, uint96 votes)
    {
        Checkpoint storage getCheckpoint = checkpoints[account][id];
        return (getCheckpoint.fromBlock, getCheckpoint.votes);
    }

    function getNumberOfCheckpoints(address account) external view override returns (uint32) {
        return numCheckpoints[account];
    }

    /* ============ Internal Only Function ============ */

    /**
     * GOVERNANCE FUNCTION. Make a delegation
     *
     * @dev Internal function to delegate voting power to an account
     * @param delegator The address of the account delegating votes from
     * @param delegatee The address to delegate votes to
     */

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = delegates[delegator];
        uint96 delegatorBalance = safe96(_balanceOf(delegator), 'VoteToken::_delegate: uint96 overflow');
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _balanceOf(address account) internal view virtual returns (uint256) {
        return balanceOf(account);
    }

    /**
     * GOVERNANCE FUNCTION. Move the delegates
     *
     * @dev Internal function to move delegates between accounts
     * @param srcRep The address of the account delegating votes from
     * @param dstRep The address of the account delegating votes to
     * @param amount The voting power to move
     */
    function _moveDelegates(
        address srcRep,
        address dstRep,
        uint96 amount
    ) internal {
        if (srcRep != dstRep && amount > 0) {
            // It must not revert but do nothing in cases of address(0) being part of the move
            // Sub voting amount to source in case it is not the zero address (e.g. transfers)
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint96 srcRepNew = sub96(srcRepOld, amount, 'VoteToken::_moveDelegates: vote amount underflows');
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }
            if (dstRep != address(0)) {
                // Add it to destination in case it is not the zero address (e.g. any transfer of tokens or delegations except a first mint to a specific address)
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint96 dstRepNew = add96(dstRepOld, amount, 'VoteToken::_moveDelegates: vote amount overflows');
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    /**
     * GOVERNANCE FUNCTION. Internal function to write a checkpoint for voting power
     *
     * @dev internal function to write a checkpoint for voting power
     * @param delegatee The address of the account delegating votes to
     * @param nCheckpoints The num checkpoint
     * @param oldVotes The previous voting power
     * @param newVotes The new voting power
     */
    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint96 oldVotes,
        uint96 newVotes
    ) internal {
        uint32 blockNumber = safe32(block.number, 'VoteToken::_writeCheckpoint: block number exceeds 32 bits');

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    /**
     * INTERNAL FUNCTION. Internal function to convert from uint256 to uint32
     *
     * @dev internal function to convert from uint256 to uint32
     */
    function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    /**
     * INTERNAL FUNCTION. Internal function to convert from uint256 to uint96
     *
     * @dev internal function to convert from uint256 to uint96
     */
    function safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) {
        require(n < 2**96, errorMessage);
        return uint96(n);
    }

    /**
     * INTERNAL FUNCTION. Internal function to add two uint96 numbers
     *
     * @dev internal safe math function to add two uint96 numbers
     */
    function add96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        uint96 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    /**
     * INTERNAL FUNCTION. Internal function to subtract two uint96 numbers
     *
     * @dev internal safe math function to subtract two uint96 numbers
     */
    function sub96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * INTERNAL FUNCTION. Internal function to get chain ID
     *
     * @dev internal function to get chain ID
     */
    function getChainId() internal pure returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }
}

================================================================================
FILE: hardhat/console.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {

exec
/bin/bash -lc "sed -n '4401,4700p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
 succeeded in 0ms:
    /* ===========  Token related Gov Functions ====== */

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Disables transfers of ERC20 BABL Tokens
     */
    function disableTokensTransfers() external onlyOwner {
        require(!tokenTransfersWereDisabled, 'BABL must flow');
        tokenTransfersEnabled = false;
        tokenTransfersWereDisabled = true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows transfers of ERC20 BABL Tokens
     * Can only happen after the protocol is fully decentralized.
     */
    function enableTokensTransfers() external onlyOwner {
        tokenTransfersEnabled = true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Set the Time Lock Registry contract to control token vesting conditions
     *
     * @notice Set the Time Lock Registry contract to control token vesting conditions
     * @param newTimeLockRegistry Address of TimeLockRegistry contract
     */
    function setTimeLockRegistry(TimeLockRegistry newTimeLockRegistry) external onlyTimeLockOwner returns (bool) {
        require(address(newTimeLockRegistry) != address(0), 'cannot be zero address');
        require(address(newTimeLockRegistry) != address(this), 'cannot be this contract');
        require(address(newTimeLockRegistry) != address(timeLockRegistry), 'must be new TimeLockRegistry');
        emit NewTimeLockRegistration(address(timeLockRegistry), address(newTimeLockRegistry));

        timeLockRegistry = newTimeLockRegistry;

        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Set the Rewards Distributor contract to control either BABL Mining or profit rewards
     *
     * @notice Set the Rewards Distriburor contract to control both types of rewards (profit and BABL Mining program)
     * @param newRewardsDistributor Address of Rewards Distributor contract
     */
    function setRewardsDistributor(IRewardsDistributor newRewardsDistributor) external onlyOwner returns (bool) {
        require(address(newRewardsDistributor) != address(0), 'cannot be zero address');
        require(address(newRewardsDistributor) != address(this), 'cannot be this contract');
        require(address(newRewardsDistributor) != address(rewardsDistributor), 'must be new Rewards Distributor');
        emit NewRewardsDistributorRegistration(address(rewardsDistributor), address(newRewardsDistributor));

        rewardsDistributor = newRewardsDistributor;

        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Register new token lockup conditions for vested tokens defined only by Time Lock Registry
     *
     * @notice Tokens are completely delivered during the registration however lockup conditions apply for vested tokens
     * locking them according to the distribution epoch periods and the type of recipient (Team, Advisor, Investor)
     * Emits a transfer event showing a transfer to the recipient
     * Only the registry can call this function
     * @param _receiver Address to receive the tokens
     * @param _amount Tokens to be transferred
     * @param _profile True if is a Team Member or Advisor
     * @param _vestingBegin Unix Time when the vesting for that particular address
     * @param _vestingEnd Unix Time when the vesting for that particular address
     * @param _lastClaim Unix Time when the claim was done from that particular address
     *
     */
    function registerLockup(
        address _receiver,
        uint256 _amount,
        bool _profile,
        uint256 _vestingBegin,
        uint256 _vestingEnd,
        uint256 _lastClaim
    ) external onlyTimeLockRegistry returns (bool) {
        require(balanceOf(msg.sender) >= _amount, 'insufficient balance');
        require(_receiver != address(0), 'cannot be zero address');
        require(_receiver != address(this), 'cannot be this contract');
        require(_receiver != address(timeLockRegistry), 'cannot be the TimeLockRegistry contract itself');
        require(_receiver != msg.sender, 'the owner cannot lockup itself');

        // update amount of locked distribution
        distribution[_receiver] = distribution[_receiver].add(_amount);

        VestedToken storage newVestedToken = vestedToken[_receiver];

        newVestedToken.teamOrAdvisor = _profile;
        newVestedToken.vestingBegin = _vestingBegin;
        newVestedToken.vestingEnd = _vestingEnd;
        newVestedToken.lastClaim = _lastClaim;

        // transfer tokens to the recipient
        _transfer(msg.sender, _receiver, _amount);
        emit NewLockout(_receiver, _amount, _profile, _vestingBegin, _vestingEnd);

        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Cancel and remove locked tokens due to non-completion of vesting period
     * applied only by Time Lock Registry and specifically to Team or Advisors as it does not apply to investors.
     *
     * @dev Cancel distribution registration
     * @param lockedAccount that should have its still locked distribution removed due to non-completion of its vesting period
     */
    function cancelVestedTokens(address lockedAccount) external onlyTimeLockRegistry returns (uint256) {
        return _cancelVestedTokensFromTimeLock(lockedAccount);
    }

    /**
     * GOVERNANCE FUNCTION. Each token owner can claim its own specific tokens with its own specific vesting conditions from the Time Lock Registry
     *
     * @dev Claim msg.sender tokens (if any available in the registry)
     */
    function claimMyTokens() external {
        // claim msg.sender tokens from timeLockRegistry
        uint256 amount = timeLockRegistry.claim(msg.sender);
        // After a proper claim, locked tokens of Team and Advisors profiles are under restricted special vesting conditions so they automatic grant
        // rights to the Time Lock Registry to only retire locked tokens if non-compliance vesting conditions take places along the vesting periods.
        // It does not apply to Investors under vesting (their locked tokens cannot be removed).
        if (vestedToken[msg.sender].teamOrAdvisor == true) {
            approve(address(timeLockRegistry), amount);
        }
        // emit claim event
        emit Claim(msg.sender, amount);
    }

    /**
     * GOVERNANCE FUNCTION. Get unlocked balance for an account
     *
     * @notice Get unlocked balance for an account
     * @param account Account to check
     * @return Amount that is unlocked and available eg. to transfer
     */
    function unlockedBalance(address account) public returns (uint256) {
        // totalBalance - lockedBalance
        return balanceOf(account).sub(lockedBalance(account));
    }

    /**
     * GOVERNANCE FUNCTION. View the locked balance for an account
     *
     * @notice View locked balance for an account
     * @param account Account to check
     * @return Amount locked in the time of checking
     */

    function viewLockedBalance(address account) public view returns (uint256) {
        // distribution of locked tokens
        // get amount from distributions

        uint256 amount = distribution[account];
        uint256 lockedAmount = amount;

        // Team and investors cannot transfer tokens in the first year
        if (vestedToken[account].vestingBegin.add(365 days) > block.timestamp && amount != 0) {
            return lockedAmount;
        }

        // in case of vesting has passed, all tokens are now available, if no vesting lock is 0 as well
        if (block.timestamp >= vestedToken[account].vestingEnd || amount == 0) {
            lockedAmount = 0;
        } else if (amount != 0) {
            // in case of still under vesting period, locked tokens are recalculated
            lockedAmount = amount.mul(vestedToken[account].vestingEnd.sub(block.timestamp)).div(
                vestedToken[account].vestingEnd.sub(vestedToken[account].vestingBegin)
            );
        }
        return lockedAmount;
    }

    /**
     * GOVERNANCE FUNCTION. Get locked balance for an account
     *
     * @notice Get locked balance for an account
     * @param account Account to check
     * @return Amount locked in the time of checking
     */
    function lockedBalance(address account) public returns (uint256) {
        // get amount from distributions locked tokens (if any)
        uint256 lockedAmount = viewLockedBalance(account);
        // in case of vesting has passed, all tokens are now available so we set mapping to 0 only for accounts under vesting
        if (
            block.timestamp >= vestedToken[account].vestingEnd &&
            msg.sender == account &&
            lockedAmount == 0 &&
            vestedToken[account].vestingEnd != 0
        ) {
            delete distribution[account];
        }
        emit LockedBalance(account, lockedAmount);
        return lockedAmount;
    }

    /**
     * PUBLIC FUNCTION. Get the address of Time Lock Registry
     *
     * @notice Get the address of Time Lock Registry
     * @return Address of the Time Lock Registry
     */
    function getTimeLockRegistry() external view returns (address) {
        return address(timeLockRegistry);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Override the Approval of allowances of ERC20 with special conditions for vesting
     *
     * @notice Override of "Approve" function to allow the `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender` except in the case of spender is Time Lock Registry
     * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint256 rawAmount) public override nonReentrant returns (bool) {
        require(spender != address(0), 'TimeLockedToken::approve: spender cannot be zero address');
        require(spender != msg.sender, 'TimeLockedToken::approve: spender cannot be the msg.sender');

        uint96 amount;
        if (rawAmount == uint256(-1)) {
            amount = uint96(-1);
        } else {
            amount = safe96(rawAmount, 'TimeLockedToken::approve: amount exceeds 96 bits');
        }

        // There is no option to decreaseAllowance to timeLockRegistry in case of vested tokens
        if ((spender == address(timeLockRegistry)) && (amount < allowance(msg.sender, address(timeLockRegistry)))) {
            amount = safe96(
                allowance(msg.sender, address(timeLockRegistry)),
                'TimeLockedToken::approve: cannot decrease allowance to timelockregistry'
            );
        }
        _approve(msg.sender, spender, amount);
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Override the Increase of allowances of ERC20 with special conditions for vesting
     *
     * @notice Atomically increases the allowance granted to `spender` by the caller.
     *
     * @dev This is an override with respect to the fulfillment of vesting conditions along the way
     * However an user can increase allowance many times, it will never be able to transfer locked tokens during vesting period
     * @return Whether or not the increaseAllowance succeeded
     */
    function increaseAllowance(address spender, uint256 addedValue) public override nonReentrant returns (bool) {
        require(
            unlockedBalance(msg.sender) >= allowance(msg.sender, spender).add(addedValue) ||
                spender == address(timeLockRegistry),
            'TimeLockedToken::increaseAllowance:Not enough unlocked tokens'
        );
        require(spender != address(0), 'TimeLockedToken::increaseAllowance:Spender cannot be zero address');
        require(spender != msg.sender, 'TimeLockedToken::increaseAllowance:Spender cannot be the msg.sender');
        _approve(msg.sender, spender, allowance(msg.sender, spender).add(addedValue));
        return true;
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Override the decrease of allowances of ERC20 with special conditions for vesting
     *
     * @notice Atomically decrease the allowance granted to `spender` by the caller.
     *
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     * This is an override with respect to the fulfillment of vesting conditions along the way
     * An user cannot decrease the allowance to the Time Lock Registry who is in charge of vesting conditions
     * @return Whether or not the decreaseAllowance succeeded
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public override nonReentrant returns (bool) {
        require(spender != address(0), 'TimeLockedToken::decreaseAllowance:Spender cannot be zero address');
        require(spender != msg.sender, 'TimeLockedToken::decreaseAllowance:Spender cannot be the msg.sender');
        require(
            allowance(msg.sender, spender) >= subtractedValue,
            'TimeLockedToken::decreaseAllowance:Underflow condition'
        );

        // There is no option to decreaseAllowance to timeLockRegistry in case of vested tokens
        require(
            address(spender) != address(timeLockRegistry),
            'TimeLockedToken::decreaseAllowance:cannot decrease allowance to timeLockRegistry'
        );

        _approve(msg.sender, spender, allowance(msg.sender, spender).sub(subtractedValue));
        return true;
    }

    /* ============ Internal Only Function ============ */

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Override the _transfer of ERC20 BABL tokens only allowing the transfer of unlocked tokens
     *
     * @dev Transfer function which includes only unlocked tokens
     * Locked tokens can always be transfered back to the returns address
     * Transferring to owner allows re-issuance of funds through registry
     *
     * @param _from The address to send tokens from
     * @param _to The address that will receive the tokens
     * @param _value The amount of tokens to be transferred
     */

exec
/bin/bash -lc "sed -n '4701,4900p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
 succeeded in 0ms:
    function _transfer(
        address _from,
        address _to,
        uint256 _value
    ) internal override onlyUnpaused {
        require(_from != address(0), 'TimeLockedToken:: _transfer: cannot transfer from the zero address');
        require(_to != address(0), 'TimeLockedToken:: _transfer: cannot transfer to the zero address');
        require(
            _to != address(this),
            'TimeLockedToken:: _transfer: do not transfer tokens to the token contract itself'
        );

        require(balanceOf(_from) >= _value, 'TimeLockedToken:: _transfer: insufficient balance');

        // check if enough unlocked balance to transfer
        require(unlockedBalance(_from) >= _value, 'TimeLockedToken:: _transfer: attempting to transfer locked funds');
        super._transfer(_from, _to, _value);
        // voting power
        _moveDelegates(
            delegates[_from],
            delegates[_to],
            safe96(_value, 'TimeLockedToken:: _transfer: uint96 overflow')
        );
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Disable BABL token transfer until certain conditions are met
     *
     * @dev Override the _beforeTokenTransfer of ERC20 BABL tokens until certain conditions are met:
     * Only allowing minting or transfers from Time Lock Registry and Rewards Distributor until transfers are allowed in the controller
     * Transferring to owner allows re-issuance of funds through registry
     *
     * @param _from The address to send tokens from
     * @param _to The address that will receive the tokens
     * @param _value The amount of tokens to be transferred
     */

    // Disable garden token transfers. Allow minting and burning.
    function _beforeTokenTransfer(
        address _from,
        address _to,
        uint256 _value
    ) internal virtual override {
        super._beforeTokenTransfer(_from, _to, _value);
        _require(
            _from == address(0) ||
                _from == address(timeLockRegistry) ||
                _from == address(rewardsDistributor) ||
                _to == address(timeLockRegistry) ||
                tokenTransfersEnabled,
            Errors.BABL_TRANSFERS_DISABLED
        );
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Cancel and remove locked tokens due to non-completion of  vesting period
     * applied only by Time Lock Registry and specifically to Team or Advisors
     *
     * @dev Cancel distribution registration
     * @param lockedAccount that should have its still locked distribution removed due to non-completion of its vesting period
     */
    function _cancelVestedTokensFromTimeLock(address lockedAccount) internal onlyTimeLockRegistry returns (uint256) {
        require(distribution[lockedAccount] != 0, 'TimeLockedToken::cancelTokens:Not registered');

        // get an update on locked amount from distributions at this precise moment
        uint256 loosingAmount = lockedBalance(lockedAccount);

        require(loosingAmount > 0, 'TimeLockedToken::cancelTokens:There are no more locked tokens');
        require(
            vestedToken[lockedAccount].teamOrAdvisor == true,
            'TimeLockedToken::cancelTokens:cannot cancel locked tokens to Investors'
        );

        // set distribution mapping to 0
        delete distribution[lockedAccount];

        // set tokenVested mapping to 0
        delete vestedToken[lockedAccount];

        // transfer only locked tokens back to TimeLockRegistry Owner (msg.sender)
        require(
            transferFrom(lockedAccount, address(timeLockRegistry), loosingAmount),
            'TimeLockedToken::cancelTokens:Transfer failed'
        );

        // emit cancel event
        emit Cancel(lockedAccount, loosingAmount);

        return loosingAmount;
    }
}

================================================================================
FILE: contracts/token/VoteToken.sol
================================================================================
// SPDX-License-Identifier: Apache-2.0

pragma solidity 0.7.6;

import {ERC20} from '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import {IVoteToken} from '../interfaces/IVoteToken.sol';
import {ReentrancyGuard} from '@openzeppelin/contracts/utils/ReentrancyGuard.sol';
import {LowGasSafeMath} from '../lib/LowGasSafeMath.sol';
import {Context} from '@openzeppelin/contracts/utils/Context.sol';
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
import {Address} from '@openzeppelin/contracts/utils/Address.sol';

/**
 * @title VoteToken
 * @notice Custom token which tracks voting power for governance
 * @dev This is an abstraction of a fork of the Compound governance contract
 * VoteToken is used by BABL to allow tracking voting power
 * Checkpoints are created every time state is changed which record voting power
 * Inherits standard ERC20 behavior
 */

abstract contract VoteToken is Context, ERC20, Ownable, IVoteToken, ReentrancyGuard {
    using LowGasSafeMath for uint256;
    using Address for address;

    /* ============ Events ============ */

    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);

    /* ============ Modifiers ============ */

    /* ============ State Variables ============ */

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256('EIP712Domain(string name,uint256 chainId,address verifyingContract)');

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH =
        keccak256('Delegation(address delegatee,uint256 nonce,uint256 expiry)');

    /// @dev A record of votes checkpoints for each account, by index
    mapping(address => address) public delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint96 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping(address => uint32) public numCheckpoints;

    /// @notice A record of states for signing / validating signatures
    mapping(address => uint256) public nonces;

    /* ============ Functions ============ */

    /* ============ Constructor ============ */

    constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {}

    /* ============ External Functions ============ */

    /* ===========  Token related Gov Functions ====== */

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Delegating votes from msg.sender to delegatee
     *
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */

    function delegate(address delegatee) external override {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Delegate votes using signature to 'delegatee'
     *
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */

    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s,
        bool prefix
    ) external override {
        address signatory;
        bytes32 domainSeparator =
            keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this)));

exec
/bin/bash -lc "sed -n '4901,5600p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
 succeeded in 0ms:
        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
        bytes32 digest = keccak256(abi.encodePacked('\x19\x01', domainSeparator, structHash));
        if (prefix) {
            bytes32 digestHash = keccak256(abi.encodePacked('\x19Ethereum Signed Message:\n32', digest));
            signatory = ecrecover(digestHash, v, r, s);
        } else {
            signatory = ecrecover(digest, v, r, s);
        }

        require(balanceOf(signatory) > 0, 'VoteToken::delegateBySig: invalid delegator');
        require(signatory != address(0), 'VoteToken::delegateBySig: invalid signature');
        require(nonce == nonces[signatory], 'VoteToken::delegateBySig: invalid nonce');
        nonces[signatory]++;
        require(block.timestamp <= expiry, 'VoteToken::delegateBySig: signature expired');
        return _delegate(signatory, delegatee);
    }

    /**
     * GOVERNANCE FUNCTION. Check Delegate votes using signature to 'delegatee'
     *
     * @notice Get current voting power for an account
     * @param account Account to get voting power for
     * @return Voting power for an account
     */
    function getCurrentVotes(address account) external view virtual override returns (uint96) {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * GOVERNANCE FUNCTION. Get voting power at a specific block for an account
     *
     * @param account Account to get voting power for
     * @param blockNumber Block to get voting power at
     * @return Voting power for an account at specific block
     */
    function getPriorVotes(address account, uint256 blockNumber) external view virtual override returns (uint96) {
        require(blockNumber < block.number, 'BABLToken::getPriorVotes: not yet determined');
        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function getMyDelegatee() external view override returns (address) {
        return delegates[msg.sender];
    }

    function getDelegatee(address account) external view override returns (address) {
        return delegates[account];
    }

    function getCheckpoints(address account, uint32 id)
        external
        view
        override
        returns (uint32 fromBlock, uint96 votes)
    {
        Checkpoint storage getCheckpoint = checkpoints[account][id];
        return (getCheckpoint.fromBlock, getCheckpoint.votes);
    }

    function getNumberOfCheckpoints(address account) external view override returns (uint32) {
        return numCheckpoints[account];
    }

    /* ============ Internal Only Function ============ */

    /**
     * GOVERNANCE FUNCTION. Make a delegation
     *
     * @dev Internal function to delegate voting power to an account
     * @param delegator The address of the account delegating votes from
     * @param delegatee The address to delegate votes to
     */

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = delegates[delegator];
        uint96 delegatorBalance = safe96(_balanceOf(delegator), 'VoteToken::_delegate: uint96 overflow');
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _balanceOf(address account) internal view virtual returns (uint256) {
        return balanceOf(account);
    }

    /**
     * GOVERNANCE FUNCTION. Move the delegates
     *
     * @dev Internal function to move delegates between accounts
     * @param srcRep The address of the account delegating votes from
     * @param dstRep The address of the account delegating votes to
     * @param amount The voting power to move
     */
    function _moveDelegates(
        address srcRep,
        address dstRep,
        uint96 amount
    ) internal {
        if (srcRep != dstRep && amount > 0) {
            // It must not revert but do nothing in cases of address(0) being part of the move
            // Sub voting amount to source in case it is not the zero address (e.g. transfers)
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint96 srcRepNew = sub96(srcRepOld, amount, 'VoteToken::_moveDelegates: vote amount underflows');
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }
            if (dstRep != address(0)) {
                // Add it to destination in case it is not the zero address (e.g. any transfer of tokens or delegations except a first mint to a specific address)
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint96 dstRepNew = add96(dstRepOld, amount, 'VoteToken::_moveDelegates: vote amount overflows');
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    /**
     * GOVERNANCE FUNCTION. Internal function to write a checkpoint for voting power
     *
     * @dev internal function to write a checkpoint for voting power
     * @param delegatee The address of the account delegating votes to
     * @param nCheckpoints The num checkpoint
     * @param oldVotes The previous voting power
     * @param newVotes The new voting power
     */
    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint96 oldVotes,
        uint96 newVotes
    ) internal {
        uint32 blockNumber = safe32(block.number, 'VoteToken::_writeCheckpoint: block number exceeds 32 bits');

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    /**
     * INTERNAL FUNCTION. Internal function to convert from uint256 to uint32
     *
     * @dev internal function to convert from uint256 to uint32
     */
    function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    /**
     * INTERNAL FUNCTION. Internal function to convert from uint256 to uint96
     *
     * @dev internal function to convert from uint256 to uint96
     */
    function safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) {
        require(n < 2**96, errorMessage);
        return uint96(n);
    }

    /**
     * INTERNAL FUNCTION. Internal function to add two uint96 numbers
     *
     * @dev internal safe math function to add two uint96 numbers
     */
    function add96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        uint96 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    /**
     * INTERNAL FUNCTION. Internal function to subtract two uint96 numbers
     *
     * @dev internal safe math function to subtract two uint96 numbers
     */
    function sub96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * INTERNAL FUNCTION. Internal function to get chain ID
     *
     * @dev internal function to get chain ID
     */
    function getChainId() internal pure returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }
}

================================================================================
FILE: hardhat/console.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {

exec
/bin/bash -lc "sed -n '5601,6300p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
 succeeded in 0ms:
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {

exec
/bin/bash -lc "sed -n '6301,6673p' AUDIT_BUNDLE.txt" in /tmp/codex-3hez4cop
 succeeded in 0ms:
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}


exec
/bin/bash -lc 'rg -n "function _beforeTokenTransfer|function initialize|function makeGardenPublic|delegateBySig|_cancelVestedTokensFromTimeLock|claimMyTokens|claimAndStakeRewardsBySig|stakeBySig|withdrawBySig|depositBySig|onlyTimeLockOwner|updateUserLock|mintShares|isValidSignature" contracts/gardens/Garden.sol contracts/token/TimeLockedToken.sol contracts/token/VoteToken.sol contracts/proxy/VTableBeacon.sol contracts/proxy/VTableBeaconProxy.sol contracts/token/TimeLockRegistry.sol' in /tmp/codex-3hez4cop
 succeeded in 0ms:
contracts/token/VoteToken.sol:94:    function delegateBySig(
contracts/token/VoteToken.sol:115:        require(balanceOf(signatory) > 0, 'VoteToken::delegateBySig: invalid delegator');
contracts/token/VoteToken.sol:116:        require(signatory != address(0), 'VoteToken::delegateBySig: invalid signature');
contracts/token/VoteToken.sol:117:        require(nonce == nonces[signatory], 'VoteToken::delegateBySig: invalid nonce');
contracts/token/VoteToken.sol:119:        require(block.timestamp <= expiry, 'VoteToken::delegateBySig: signature expired');
contracts/token/TimeLockedToken.sol:69:    modifier onlyTimeLockOwner() {
contracts/token/TimeLockedToken.sol:73:                'TimeLockedToken:: onlyTimeLockOwner: can only be executed by the owner of TimeLockRegistry'
contracts/token/TimeLockedToken.sol:155:    function setTimeLockRegistry(TimeLockRegistry newTimeLockRegistry) external onlyTimeLockOwner returns (bool) {
contracts/token/TimeLockedToken.sol:237:        return _cancelVestedTokensFromTimeLock(lockedAccount);
contracts/token/TimeLockedToken.sol:245:    function claimMyTokens() external {
contracts/token/TimeLockedToken.sol:468:    function _beforeTokenTransfer(
contracts/token/TimeLockedToken.sol:491:    function _cancelVestedTokensFromTimeLock(address lockedAccount) internal onlyTimeLockRegistry returns (uint256) {
contracts/gardens/Garden.sol:260:        _require(_signer.isValidSignatureNow(_hash, _signature), Errors.INVALID_SIGNER);
contracts/gardens/Garden.sol:283:     *   of gas ~2kk. Use `depositBySig` for gas efficiency.
contracts/gardens/Garden.sol:315:    function depositBySig(
contracts/gardens/Garden.sol:427:    function withdrawBySig(
contracts/gardens/Garden.sol:547:    function mintShares(address[] calldata _tos, uint256[] calldata _shares) external {
contracts/gardens/Garden.sol:576:    function claimAndStakeRewardsBySig(
contracts/gardens/Garden.sol:620:        heartGarden.stakeBySig(
contracts/gardens/Garden.sol:655:    function stakeBySig(
contracts/gardens/Garden.sol:713:    function updateUserLock(
contracts/gardens/Garden.sol:747:    function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4 magicValue) {
contracts/gardens/Garden.sol:750:                ? this.isValidSignature.selector
contracts/gardens/Garden.sol:861:     *   See withdraw and withdrawBySig for params and comments.
contracts/gardens/Garden.sol:1065:    function _beforeTokenTransfer(

exec
/bin/bash -lc "nl -ba contracts/token/TimeLockedToken.sol | sed -n '60,180p'
nl -ba contracts/gardens/Garden.sol | sed -n '300,380p'
nl -ba contracts/gardens/Garden.sol | sed -n '420,500p'
nl -ba contracts/gardens/Garden.sol | sed -n '1120,1170p'
nl -ba contracts/gardens/Garden.sol | sed -n '560,700p'
nl -ba contracts/token/VoteToken.sol | sed -n '90,130p'" in /tmp/codex-3hez4cop
 succeeded in 0ms:
    60	
    61	    modifier onlyTimeLockRegistry() {
    62	        require(
    63	            msg.sender == address(timeLockRegistry),
    64	            'TimeLockedToken:: onlyTimeLockRegistry: can only be executed by TimeLockRegistry'
    65	        );
    66	        _;
    67	    }
    68	
    69	    modifier onlyTimeLockOwner() {
    70	        if (address(timeLockRegistry) != address(0)) {
    71	            require(
    72	                msg.sender == Ownable(timeLockRegistry).owner(),
    73	                'TimeLockedToken:: onlyTimeLockOwner: can only be executed by the owner of TimeLockRegistry'
    74	            );
    75	        }
    76	        _;
    77	    }
    78	    modifier onlyUnpaused() {
    79	        // Do not execute if Globally or individually paused
    80	        _require(!IBabController(controller).isPaused(address(this)), Errors.ONLY_UNPAUSED);
    81	        _;
    82	    }
    83	
    84	    /* ============ State Variables ============ */
    85	
    86	    // represents total distribution for locked balances
    87	    mapping(address => uint256) distribution;
    88	
    89	    /// @notice The profile of each token owner under its particular vesting conditions
    90	    /**
    91	     * @param team Indicates whether or not is a Team member or Advisor (true = team member/advisor, false = private investor)
    92	     * @param vestingBegin When the vesting begins for such token owner
    93	     * @param vestingEnd When the vesting ends for such token owner
    94	     * @param lastClaim When the last claim was done
    95	     */
    96	    struct VestedToken {
    97	        bool teamOrAdvisor;
    98	        uint256 vestingBegin;
    99	        uint256 vestingEnd;
   100	        uint256 lastClaim;
   101	    }
   102	
   103	    /// @notice A record of token owners under vesting conditions for each account, by index
   104	    mapping(address => VestedToken) public vestedToken;
   105	
   106	    // address of Time Lock Registry contract
   107	    IBabController public controller;
   108	
   109	    // address of Time Lock Registry contract
   110	    TimeLockRegistry public timeLockRegistry;
   111	
   112	    // address of Rewards Distriburor contract
   113	    IRewardsDistributor public rewardsDistributor;
   114	
   115	    // Enable Transfer of ERC20 BABL Tokens
   116	    // Only Minting or transfers from/to TimeLockRegistry and Rewards Distributor can transfer tokens until the protocol is fully decentralized
   117	    bool private tokenTransfersEnabled;
   118	    bool private tokenTransfersWereDisabled;
   119	
   120	    /* ============ Functions ============ */
   121	
   122	    /* ============ Constructor ============ */
   123	
   124	    constructor(string memory _name, string memory _symbol) VoteToken(_name, _symbol) {
   125	        tokenTransfersEnabled = true;
   126	    }
   127	
   128	    /* ============ External Functions ============ */
   129	
   130	    /* ===========  Token related Gov Functions ====== */
   131	
   132	    /**
   133	     * PRIVILEGED GOVERNANCE FUNCTION. Disables transfers of ERC20 BABL Tokens
   134	     */
   135	    function disableTokensTransfers() external onlyOwner {
   136	        require(!tokenTransfersWereDisabled, 'BABL must flow');
   137	        tokenTransfersEnabled = false;
   138	        tokenTransfersWereDisabled = true;
   139	    }
   140	
   141	    /**
   142	     * PRIVILEGED GOVERNANCE FUNCTION. Allows transfers of ERC20 BABL Tokens
   143	     * Can only happen after the protocol is fully decentralized.
   144	     */
   145	    function enableTokensTransfers() external onlyOwner {
   146	        tokenTransfersEnabled = true;
   147	    }
   148	
   149	    /**
   150	     * PRIVILEGED GOVERNANCE FUNCTION. Set the Time Lock Registry contract to control token vesting conditions
   151	     *
   152	     * @notice Set the Time Lock Registry contract to control token vesting conditions
   153	     * @param newTimeLockRegistry Address of TimeLockRegistry contract
   154	     */
   155	    function setTimeLockRegistry(TimeLockRegistry newTimeLockRegistry) external onlyTimeLockOwner returns (bool) {
   156	        require(address(newTimeLockRegistry) != address(0), 'cannot be zero address');
   157	        require(address(newTimeLockRegistry) != address(this), 'cannot be this contract');
   158	        require(address(newTimeLockRegistry) != address(timeLockRegistry), 'must be new TimeLockRegistry');
   159	        emit NewTimeLockRegistration(address(timeLockRegistry), address(newTimeLockRegistry));
   160	
   161	        timeLockRegistry = newTimeLockRegistry;
   162	
   163	        return true;
   164	    }
   165	
   166	    /**
   167	     * PRIVILEGED GOVERNANCE FUNCTION. Set the Rewards Distributor contract to control either BABL Mining or profit rewards
   168	     *
   169	     * @notice Set the Rewards Distriburor contract to control both types of rewards (profit and BABL Mining program)
   170	     * @param newRewardsDistributor Address of Rewards Distributor contract
   171	     */
   172	    function setRewardsDistributor(IRewardsDistributor newRewardsDistributor) external onlyOwner returns (bool) {
   173	        require(address(newRewardsDistributor) != address(0), 'cannot be zero address');
   174	        require(address(newRewardsDistributor) != address(this), 'cannot be this contract');
   175	        require(address(newRewardsDistributor) != address(rewardsDistributor), 'must be new Rewards Distributor');
   176	        emit NewRewardsDistributorRegistration(address(rewardsDistributor), address(newRewardsDistributor));
   177	
   178	        rewardsDistributor = newRewardsDistributor;
   179	
   180	        return true;
   300	     *   Deposits the _amountIn in reserve asset into the garden. Gurantee to
   301	     *   recieve at least _minAmountOut.
   302	     * @param _amountIn               Amount of the reserve asset that is received from contributor.
   303	     * @param _minAmountOut           Min amount of Garden shares to receive by contributor.
   304	     * @param _nonce                  Current nonce to prevent replay attacks.
   305	     * @param _maxFee                 Max fee user is willing to pay keeper. Fee is
   306	     *                                substracted from the withdrawn amount. Fee is
   307	     *                                expressed in reserve asset.
   308	     * @param _pricePerShare          Price per share of the garden calculated off-chain by Keeper.
   309	     * @param _to                     Address to mint shares to.
   310	     * @param _fee                    Actual fee keeper demands. Have to be less than _maxFee.
   311	     * @param _signer                 The user to who signed the signature.
   312	     * @param _referrer               The user that referred the deposit
   313	     * @param _signature              Signature by the user to verify deposit parmas.
   314	     */
   315	    function depositBySig(
   316	        uint256 _amountIn,
   317	        uint256 _minAmountOut,
   318	        uint256 _nonce,
   319	        uint256 _maxFee,
   320	        address _to,
   321	        uint256 _pricePerShare,
   322	        uint256 _fee,
   323	        address _signer,
   324	        address _referrer,
   325	        bytes memory _signature
   326	    ) external override nonReentrant {
   327	        _onlyKeeperAndFee(_fee, _maxFee);
   328	
   329	        bytes32 hash =
   330	            keccak256(
   331	                abi.encode(
   332	                    DEPOSIT_BY_SIG_TYPEHASH,
   333	                    address(this),
   334	                    _amountIn,
   335	                    _minAmountOut,
   336	                    _nonce,
   337	                    _maxFee,
   338	                    _to,
   339	                    _referrer
   340	                )
   341	            )
   342	                .toEthSignedMessageHash();
   343	        _onlyValidSigner(_signer, _to, _nonce, hash, _signature);
   344	
   345	        // If a Keeper fee is greater than zero then reduce user shares to
   346	        // exchange and pay keeper the fee.
   347	        if (_fee > 0) {
   348	            // account for non 18 decimals ERC20 tokens, e.g. USDC
   349	            uint256 feeShares = _reserveToShares(_fee, _pricePerShare);
   350	            _internalDeposit(
   351	                _amountIn.sub(_fee),
   352	                _minAmountOut.sub(feeShares),
   353	                _to,
   354	                _signer,
   355	                _pricePerShare,
   356	                minContribution > _fee ? minContribution.sub(_fee) : 0,
   357	                _referrer
   358	            );
   359	            // pay Keeper the fee
   360	            IERC20(reserveAsset).safeTransferFrom(_signer, msg.sender, _fee);
   361	        } else {
   362	            _internalDeposit(_amountIn, _minAmountOut, _to, _signer, _pricePerShare, minContribution, _referrer);
   363	        }
   364	    }
   365	
   366	    /**
   367	     * @notice
   368	     *   Exchanges a contributor gardens shares for at least minimum amount in reserve asset.
   369	     * @dev
   370	     *   ATTENTION. Do not call withPenalty unless certain. If penalty is set,
   371	     *   it will be applied regardless of the garden state.
   372	     *   It is advised to first try to withdraw with no penalty and it this
   373	     *   reverts then try to with penalty.
   374	     * @param _amountIn         Quantity of the garden token to withdrawal
   375	     * @param _minAmountOut     Min quantity of reserve asset to receive
   376	     * @param _to               Address to send component assets to
   377	     * @param _withPenalty      Whether or not this is an immediate withdrawal
   378	     * @param _unwindStrategy   Strategy to unwind
   379	     */
   380	    function withdraw(
   420	     * @param _unwindStrategy  Strategy to unwind
   421	     * @param _pricePerShare   Price per share of the garden calculated off-chain by Keeper.
   422	     * @param _strategyNAV     NAV of the strategy to unwind.
   423	     * @param _fee             Actual fee keeper demands. Have to be less than _maxFee.
   424	     * @param _signer          The user to who signed the signature
   425	     * @param _signature       Signature by the user to verify withdraw parmas.
   426	     */
   427	    function withdrawBySig(
   428	        uint256 _amountIn,
   429	        uint256 _minAmountOut,
   430	        uint256 _nonce,
   431	        uint256 _maxFee,
   432	        bool _withPenalty,
   433	        address _unwindStrategy,
   434	        uint256 _pricePerShare,
   435	        uint256 _strategyNAV,
   436	        uint256 _fee,
   437	        address _signer,
   438	        bytes memory _signature
   439	    ) external override nonReentrant {
   440	        _onlyKeeperAndFee(_fee, _maxFee);
   441	
   442	        bytes32 hash =
   443	            keccak256(
   444	                abi.encode(
   445	                    WITHDRAW_BY_SIG_TYPEHASH,
   446	                    address(this),
   447	                    _amountIn,
   448	                    _minAmountOut,
   449	                    _nonce,
   450	                    _maxFee,
   451	                    _withPenalty
   452	                )
   453	            )
   454	                .toEthSignedMessageHash();
   455	
   456	        _onlyValidSigner(_signer, _signer, _nonce, hash, _signature);
   457	
   458	        _withdrawInternal(
   459	            _amountIn,
   460	            _minAmountOut.sub(_maxFee),
   461	            payable(_signer),
   462	            _withPenalty,
   463	            _unwindStrategy,
   464	            _pricePerShare,
   465	            _strategyNAV,
   466	            _fee
   467	        );
   468	    }
   469	
   470	    /**
   471	     * @notice
   472	     *   Claims a contributor rewards in BABL and reserve asset.
   473	     * @param _finalizedStrategies  Finalized strategies to process
   474	     */
   475	    function claimReturns(address[] calldata _finalizedStrategies) external override nonReentrant {
   476	        _onlyNonDuplicateStrategies(_finalizedStrategies);
   477	        uint256[] memory rewards = new uint256[](8);
   478	        rewards = rewardsDistributor.getRewards(address(this), msg.sender, _finalizedStrategies);
   479	        _sendRewardsInternal(msg.sender, rewards[5], rewards[6], false);
   480	    }
   481	
   482	    /**
   483	     * @notice
   484	     *   User can claim the rewards from the strategies that his principal was
   485	     *   invested in and stake BABL into Heart Garden
   486	     * @param _minAmountOut         Minimum hBABL as part of the Heart garden BABL staking
   487	     * @param _finalizedStrategies  Finalized strategies to process
   488	     */
   489	    function claimAndStakeReturns(uint256 _minAmountOut, address[] calldata _finalizedStrategies)
   490	        external
   491	        override
   492	        nonReentrant
   493	    {
   494	        _onlyNonDuplicateStrategies(_finalizedStrategies);
   495	        uint256[] memory rewards = new uint256[](8);
   496	        rewards = rewardsDistributor.getRewards(address(this), msg.sender, _finalizedStrategies);
   497	        IGarden heartGarden = IGarden(address(IHeart(controller.heart()).heartGarden()));
   498	        // User non BABL rewards are sent to user wallet (_profits)
   499	        // User BABL rewards are sent to this garden from RD to stake them into Heart Garden
   500	        // on behalf of user
  1120	     * @notice
  1121	     *   Approves spending of BABL token to an address
  1122	     * @dev
  1123	     *   Approves BABL staking amount for claim and stake rewards
  1124	     *   Only used to approve Heart Garden to stake
  1125	     * @param _to             Address to approve to
  1126	     * @param _amount         Amount of allowance
  1127	     */
  1128	    function _approveBABL(address _to, uint256 _amount) internal {
  1129	        IERC20(BABL).safeApprove(_to, _amount);
  1130	    }
  1131	
  1132	    /**
  1133	     * @notice                  Updates the contributor data upon deposit
  1134	     * @param _contributor      Contributor to update
  1135	     * @param _previousBalance  Previous balance of the contributor
  1136	     * @param _amountIn         Amount deposited in reserve asset
  1137	     * @param _sharesToMint     Amount of garden shares to mint
  1138	     */
  1139	    function _updateContributorDepositInfo(
  1140	        address _contributor,
  1141	        uint256 _previousBalance,
  1142	        uint256 _amountIn,
  1143	        uint256 _sharesToMint
  1144	    ) private {
  1145	        IGarden.Contributor storage contributor = contributors[_contributor];
  1146	        // If new contributor, create one, increment count, and set the current TS
  1147	        if (_previousBalance == 0 || contributor.initialDepositAt == 0) {
  1148	            totalContributors = totalContributors.add(1);
  1149	            contributor.initialDepositAt = block.timestamp;
  1150	        }
  1151	        // We make checkpoints around contributor deposits to give the right rewards afterwards
  1152	        contributor.totalDeposits = contributor.totalDeposits.add(_amountIn);
  1153	        contributor.lastDepositAt = block.timestamp;
  1154	        // RD checkpoint for accurate rewards
  1155	        rewardsDistributor.updateGardenPowerAndContributor(
  1156	            address(this),
  1157	            _contributor,
  1158	            _previousBalance,
  1159	            _sharesToMint,
  1160	            true // true = deposit , false = withdraw
  1161	        );
  1162	    }
  1163	
  1164	    /**
  1165	     * @notice                  Updates the contributor data upon withdrawal
  1166	     * @param _contributor      Contributor to update
  1167	     * @param _amountOut        Amount withdrawn in reserve asset
  1168	     * @param _previousBalance  Previous balance of the contributor
  1169	     * @param _balance          New balance
  1170	     * @param _amountToBurn     Amount of garden shares to burn
   560	     *   Should be called instead of the `claimAndStakeReturns` to save gas due
   561	     *   to getRewards caculated off-chain. The Keeper fee is paid out of user's
   562	     *   reserveAsset and it is calculated off-chain.
   563	     * @param _babl            BABL rewards from mining program.
   564	     * @param _profits         Profit rewards in reserve asset.
   565	     * @param _minAmountOut    Minimum hBABL as part of the Heart Garden BABL staking
   566	     * @param _nonce           Current nonce of user in the claiming garden at to prevent replay attacks.
   567	     * @param _nonceHeart      Current nonce of user in Heart Garden to prevent replay attacks.
   568	     * @param _maxFee          Max fee user is willing to pay keeper. Fee is
   569	     *                         substracted from user wallet in reserveAsset. Fee is
   570	     *                         expressed in reserve asset.
   571	     * @param _fee             Actual fee keeper demands. Have to be less than _maxFee.
   572	     * @param _pricePerShare   Price per share of Heart Garden
   573	     * @param _signer          Signer of the tx
   574	     * @param _signature       Signature of signer
   575	     */
   576	    function claimAndStakeRewardsBySig(
   577	        uint256 _babl,
   578	        uint256 _profits,
   579	        uint256 _minAmountOut,
   580	        uint256 _nonce,
   581	        uint256 _nonceHeart,
   582	        uint256 _maxFee,
   583	        uint256 _pricePerShare,
   584	        uint256 _fee,
   585	        address _signer,
   586	        bytes memory _signature
   587	    ) external override nonReentrant {
   588	        _onlyKeeperAndFee(_fee, _maxFee);
   589	        IGarden heartGarden = IHeart(controller.heart()).heartGarden();
   590	        bytes32 hash =
   591	            keccak256(
   592	                abi.encode(
   593	                    STAKE_REWARDS_BY_SIG_TYPEHASH,
   594	                    address(heartGarden),
   595	                    _babl,
   596	                    _profits,
   597	                    _minAmountOut,
   598	                    _nonce,
   599	                    _nonceHeart,
   600	                    _maxFee,
   601	                    _signer
   602	                )
   603	            )
   604	                .toEthSignedMessageHash();
   605	        _onlyValidSigner(_signer, _signer, _nonce, hash, _signature);
   606	        _require(_fee > 0, Errors.FEE_TOO_LOW);
   607	        _require(_babl <= CLAIM_BY_SIG_CAP, Errors.MAX_BABL_CAP_REACHED);
   608	
   609	        // pay to Keeper the fee to execute the tx on behalf
   610	        IERC20(reserveAsset).safeTransferFrom(_signer, msg.sender, _fee);
   611	
   612	        // User non BABL rewards are sent to user wallet (_profits)
   613	        // User BABL rewards are sent to this garden from RD to later stake them into Heart Garden
   614	        // on behalf of the user
   615	        _sendRewardsInternal(_signer, _babl, _profits, true); // true = stake babl rewards, false = no stake
   616	        _approveBABL(address(heartGarden), _babl);
   617	        // grant permission to deposit
   618	        signer = _signer;
   619	        // Now this garden makes a deposit on Heart Garden on behalf of user
   620	        heartGarden.stakeBySig(
   621	            _babl,
   622	            _profits,
   623	            _minAmountOut,
   624	            _nonce,
   625	            _nonceHeart,
   626	            _maxFee,
   627	            _signer,
   628	            _pricePerShare,
   629	            address(this),
   630	            _signature
   631	        );
   632	        // revoke permission to deposit
   633	        signer = address(0);
   634	        emit StakeBABLRewards(_signer, _babl);
   635	    }
   636	
   637	    /**
   638	     * @notice
   639	     *   Stakes _amountIn of BABL into the Heart garden.
   640	     * @dev
   641	     *   Staking is in practical terms is depositing BABL into Heart garden.
   642	     * @param _amountIn               Amount of the reserve asset that is received from contributor.
   643	     * @param _profits                Amount of the reserve asset that is received from contributor.
   644	     * @param _minAmountOut           Min amount of Garden shares to receive by contributor.
   645	     * @param _nonce                  Current nonce to prevent replay attacks.
   646	     * @param _nonceHeart             Current nonce of the Heart garden to prevent replay attacks.
   647	     * @param _maxFee                 Max fee user is willing to pay keeper. Fee is
   648	     *                                substracted from the withdrawn amount. Fee is
   649	     *                                expressed in reserve asset.
   650	     * @param _pricePerShare          Price per share of the garden calculated off-chain by Keeper.
   651	     * @param _to                     Address to mint shares to.
   652	     * @param _signer                 The user to who signed the signature.
   653	     * @param _signature              Signature by the user to verify deposit params.
   654	     */
   655	    function stakeBySig(
   656	        uint256 _amountIn,
   657	        uint256 _profits,
   658	        uint256 _minAmountOut,
   659	        uint256 _nonce,
   660	        uint256 _nonceHeart,
   661	        uint256 _maxFee,
   662	        address _to,
   663	        uint256 _pricePerShare,
   664	        address _signer,
   665	        bytes memory _signature
   666	    ) external override nonReentrant {
   667	        _require(controller.isGarden(msg.sender), Errors.ONLY_ACTIVE_GARDEN);
   668	        _require(address(this) == address(IHeart(controller.heart()).heartGarden()), Errors.ONLY_HEART_GARDEN);
   669	
   670	        bytes32 hash =
   671	            keccak256(
   672	                abi.encode(
   673	                    STAKE_REWARDS_BY_SIG_TYPEHASH,
   674	                    address(this),
   675	                    _amountIn,
   676	                    _profits,
   677	                    _minAmountOut,
   678	                    _nonce,
   679	                    _nonceHeart,
   680	                    _maxFee,
   681	                    _to
   682	                )
   683	            )
   684	                .toEthSignedMessageHash();
   685	        _onlyValidSigner(_signer, _to, _nonceHeart, hash, _signature);
   686	
   687	        // Keeper fee must have been paid in the original garden
   688	        _internalDeposit(_amountIn, _minAmountOut, _to, _signer, _pricePerShare, minContribution, address(0));
   689	    }
   690	
   691	    /**
   692	     * Allows a contributor to claim an NFT.
   693	     */
   694	    function claimNFT() external override {
   695	        // minContribution is in reserve asset while balance of contributor in
   696	        // garden shares which can lead to undesired results if reserve assets
   697	        // decimals are not 18
   698	        _require(balanceOf(msg.sender) >= minContribution, Errors.ONLY_CONTRIBUTOR);
   699	        IGarden.Contributor storage contributor = contributors[msg.sender];
   700	        _require(
    90	     * @param r Half of the ECDSA signature pair
    91	     * @param s Half of the ECDSA signature pair
    92	     */
    93	
    94	    function delegateBySig(
    95	        address delegatee,
    96	        uint256 nonce,
    97	        uint256 expiry,
    98	        uint8 v,
    99	        bytes32 r,
   100	        bytes32 s,
   101	        bool prefix
   102	    ) external override {
   103	        address signatory;
   104	        bytes32 domainSeparator =
   105	            keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this)));
   106	        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
   107	        bytes32 digest = keccak256(abi.encodePacked('\x19\x01', domainSeparator, structHash));
   108	        if (prefix) {
   109	            bytes32 digestHash = keccak256(abi.encodePacked('\x19Ethereum Signed Message:\n32', digest));
   110	            signatory = ecrecover(digestHash, v, r, s);
   111	        } else {
   112	            signatory = ecrecover(digest, v, r, s);
   113	        }
   114	
   115	        require(balanceOf(signatory) > 0, 'VoteToken::delegateBySig: invalid delegator');
   116	        require(signatory != address(0), 'VoteToken::delegateBySig: invalid signature');
   117	        require(nonce == nonces[signatory], 'VoteToken::delegateBySig: invalid nonce');
   118	        nonces[signatory]++;
   119	        require(block.timestamp <= expiry, 'VoteToken::delegateBySig: signature expired');
   120	        return _delegate(signatory, delegatee);
   121	    }
   122	
   123	    /**
   124	     * GOVERNANCE FUNCTION. Check Delegate votes using signature to 'delegatee'
   125	     *
   126	     * @notice Get current voting power for an account
   127	     * @param account Account to get voting power for
   128	     * @return Voting power for an account
   129	     */
   130	    function getCurrentVotes(address account) external view virtual override returns (uint96) {

exec
/bin/bash -lc "nl -ba contracts/gardens/Garden.sol | sed -n '1180,1245p'" in /tmp/codex-3hez4cop
 succeeded in 0ms:
  1180	        // If withdrawn everything
  1181	        if (_balance == 0) {
  1182	            contributor.lastDepositAt = 0;
  1183	            contributor.initialDepositAt = 0;
  1184	            contributor.withdrawnSince = 0;
  1185	            contributor.totalDeposits = 0;
  1186	            userLock[_contributor] = 0;
  1187	            totalContributors = totalContributors.sub(1);
  1188	        } else {
  1189	            contributor.withdrawnSince = contributor.withdrawnSince.add(_amountOut);
  1190	        }
  1191	        // RD checkpoint for accurate rewards
  1192	        rewardsDistributor.updateGardenPowerAndContributor(
  1193	            address(this),
  1194	            _contributor,
  1195	            _previousBalance,
  1196	            _amountToBurn,
  1197	            false // true = deposit , false = withdraw
  1198	        );
  1199	    }
  1200	
  1201	    /**
  1202	     * @notice          Checks if an address is a creator
  1203	     * @param _creator  Creator address
  1204	     * @return          True if creator
  1205	     */
  1206	    function _isCreator(address _creator) private view returns (bool) {
  1207	        return
  1208	            _creator != address(0) &&
  1209	            (extraCreators[0] == _creator ||
  1210	                extraCreators[1] == _creator ||
  1211	                extraCreators[2] == _creator ||
  1212	                extraCreators[3] == _creator ||
  1213	                _creator == creator);
  1214	    }
  1215	
  1216	    /**
  1217	     * @notice
  1218	     *   Validates that pricePerShare is within acceptable range; if not reverts
  1219	     * @dev
  1220	     *   Allowed slippage between deposits and withdrawals in terms of the garden price per share is:
  1221	     *
  1222	     *     slippage = lastPricePerShare % (pricePerShareDelta + timePast * pricePerShareDecayRate);
  1223	     *
  1224	     *   For example, if lastPricePerShare is 1e18 and slippage is 10% then deposits with pricePerShare between
  1225	     *   9e17 and 11e17 allowed immediately. After one year (100% change in time) and with a decay rate 1x;
  1226	     *   deposits between 5e17 and 2e18 are possible. Different gardens should have different settings for
  1227	     *   slippage and decay rate due to various volatility of the strategies. For example, stable gardens
  1228	     *   would have low slippage and decay rate while some moonshot gardens may have both of them
  1229	     *   as high as 100% and 10x.
  1230	     * @param _pricePerShare  Price of the graden share to validate against historical data
  1231	     */
  1232	    function _checkLastPricePerShare(uint256 _pricePerShare) private {
  1233	        uint256 slippage = pricePerShareDelta > 0 ? pricePerShareDelta : 25e16;
  1234	        uint256 decay = pricePerShareDecayRate > 0 ? pricePerShareDecayRate : 1e18;
  1235	        // if no previous record then just pass the check
  1236	        if (lastPricePerShare != 0) {
  1237	            slippage = slippage.add(block.timestamp.sub(lastPricePerShareTS).preciseDiv(365 days).preciseMul(decay));
  1238	            if (_pricePerShare > lastPricePerShare) {
  1239	                _require(
  1240	                    _pricePerShare.sub(lastPricePerShare) <= lastPricePerShare.preciseMul(slippage),
  1241	                    Errors.PRICE_PER_SHARE_WRONG
  1242	                );
  1243	            } else {
  1244	                _require(
  1245	                    lastPricePerShare.sub(_pricePerShare) <=

exec
/bin/bash -lc "nl -ba contracts/gardens/Garden.sol | sed -n '1245,1265p'" in /tmp/codex-3hez4cop
 succeeded in 0ms:
  1245	                    lastPricePerShare.sub(_pricePerShare) <=
  1246	                        lastPricePerShare.sub(lastPricePerShare.preciseDiv(slippage.add(1e18))),
  1247	                    Errors.PRICE_PER_SHARE_WRONG
  1248	                );
  1249	            }
  1250	        }
  1251	        lastPricePerShare = _pricePerShare;
  1252	        lastPricePerShareTS = block.timestamp;
  1253	    }
  1254	
  1255	    /**
  1256	     * @notice     Returns last timestamp of the last contributor deposit
  1257	     * @param _to  Contributor address
  1258	     * @return     Timestamp of the last contributor desposit
  1259	     */
  1260	    function _getLastDepositAt(address _to) private view returns (uint256) {
  1261	        return hardlockStartsAt > contributors[_to].lastDepositAt ? hardlockStartsAt : contributors[_to].lastDepositAt;
  1262	    }
  1263	
  1264	    /**
  1265	     * @notice     Returns the hardlock in seconds for this user

exec
/bin/bash -lc "rg -n \"controller\\s*=|timeLockRegistry\\s*=|rewardsDistributor\\s*=\" contracts/token/TimeLockedToken.sol contracts/token/VoteToken.sol contracts/token/TimeLockRegistry.sol contracts/gardens/Garden.sol" in /tmp/codex-3hez4cop
 succeeded in 0ms:
contracts/token/TimeLockedToken.sol:161:        timeLockRegistry = newTimeLockRegistry;
contracts/token/TimeLockedToken.sol:178:        rewardsDistributor = newRewardsDistributor;

exec
/bin/bash -lc "rg -n \"registrations\\b|\\.remove\\(\" contracts/token/TimeLockRegistry.sol contracts/gardens/Garden.sol contracts/lib/AddressArrayUtils.sol" in /tmp/codex-3hez4cop
 succeeded in 0ms:
contracts/token/TimeLockRegistry.sol:88:    // array of all registrations
contracts/token/TimeLockRegistry.sol:89:    address[] public registrations;
contracts/token/TimeLockRegistry.sol:117:     * Gets registrations
contracts/token/TimeLockRegistry.sol:119:     * @return  address[]        Returns list of registrations
contracts/token/TimeLockRegistry.sol:123:        return registrations;
contracts/token/TimeLockRegistry.sol:132:     * @param _registrations Registrations to process
contracts/token/TimeLockRegistry.sol:134:    function registerBatch(Registration[] memory _registrations) external onlyOwner {
contracts/token/TimeLockRegistry.sol:135:        for (uint256 i = 0; i < _registrations.length; i++) {
contracts/token/TimeLockRegistry.sol:137:                _registrations[i].receiver,
contracts/token/TimeLockRegistry.sol:138:                _registrations[i].distribution,
contracts/token/TimeLockRegistry.sol:139:                _registrations[i].investorType,
contracts/token/TimeLockRegistry.sol:140:                _registrations[i].vestingStartingDate
contracts/token/TimeLockRegistry.sol:178:        registrations.push(receiver);
contracts/token/TimeLockRegistry.sol:218:        // remove from the list of all registrations
contracts/token/TimeLockRegistry.sol:219:        registrations.remove(receiver);

exec
/bin/bash -lc "nl -ba contracts/gardens/Garden.sol | sed -n '90,115p'
nl -ba contracts/token/TimeLockRegistry.sol | sed -n '208,222p'" in /tmp/codex-3hez4cop
 succeeded in 0ms:
    90	    uint256 private constant MAX_COOLDOWN_PERIOD = 7 days;
    91	
    92	    uint8 private constant MAX_EXTRA_CREATORS = 4;
    93	    uint256 private constant EARLY_WITHDRAWAL_PENALTY = 25e15;
    94	    uint256 private constant TEN_PERCENT = 1e17;
    95	
    96	    bytes32 private constant DEPOSIT_BY_SIG_TYPEHASH =
    97	        keccak256(
    98	            'DepositBySig(uint256 _amountIn,uint256 _minAmountOut,uint256 _nonce,uint256 _maxFee,address _to,address _referrer)'
    99	        );
   100	    bytes32 private constant WITHDRAW_BY_SIG_TYPEHASH =
   101	        keccak256(
   102	            'WithdrawBySig(uint256 _amountIn,uint256 _minAmountOut,uint256,_nonce,uint256 _maxFee,uint256 _withPenalty)'
   103	        );
   104	    bytes32 private constant REWARDS_BY_SIG_TYPEHASH =
   105	        keccak256('RewardsBySig(uint256 _babl,uint256 _profits,uint256 _nonce,uint256 _maxFee)');
   106	
   107	    bytes32 private constant STAKE_REWARDS_BY_SIG_TYPEHASH =
   108	        keccak256(
   109	            'StakeRewardsBySig(uint256 _babl,uint256 _profits,uint256 _minAmountOut,uint256 _nonce,uint256 _nonceHeart,uint256 _maxFee,address _to)'
   110	        );
   111	
   112	    uint256 private constant CLAIM_BY_SIG_CAP = 5_500e18; // 5.5K BABL cap per user per bySig tx
   113	
   114	    uint256 private constant MAX_HEART_LOCK_VALUE = 4 * 365 days;
   115	
   208	
   209	        // get amount from distributions
   210	        uint256 amount = registeredDistributions[receiver];
   211	
   212	        // set distribution mapping to 0
   213	        delete registeredDistributions[receiver];
   214	
   215	        // set tokenVested mapping to 0
   216	        delete tokenVested[receiver];
   217	
   218	        // remove from the list of all registrations
   219	        registrations.remove(receiver);
   220	
   221	        // decrease total tokens
   222	        totalTokens = totalTokens.sub(amount);

exec
/bin/bash -lc "rg -n \"is TimeLockedToken|extends TimeLockedToken|new TimeLockRegistry|setTimeLockRegistry|constructor\\(.*TimeLockedToken|contract .* is .*TimeLockedToken\" contracts -g '*.sol'" in /tmp/codex-3hez4cop
 succeeded in 0ms:
contracts/token/TimeLockedToken.sol:155:    function setTimeLockRegistry(TimeLockRegistry newTimeLockRegistry) external onlyTimeLockOwner returns (bool) {
contracts/token/TimeLockedToken.sol:158:        require(address(newTimeLockRegistry) != address(timeLockRegistry), 'must be new TimeLockRegistry');
contracts/token/TimeLockRegistry.sol:27: * to interact with (e.g. setTimeLockRegistry() function)
contracts/token/TimeLockRegistry.sol:108:    constructor(TimeLockedToken _token) {

  ✓ Inspect workspace and read AUDIT_BUNDLE.txt in full
  ✓ Analyze first-party Solidity for exploitable issues in requested categories
  → Produce JSON audit report with concrete findings or no-findings summary
codex
{"no_findings":false,"summary":"Three material issues: keeper-supplied share prices can be ratcheted to steal TVL, stake-and-claim signatures replay across gardens, and the vesting registry can be seized before first initialization.","findings":[{"severity":"high","category":"oracle","title":"Keeper-controlled pricePerShare can be stair-stepped away from real NAV and used to overmint/overwithdraw","exploit_scenario":"A malicious keeper collaborates with an attacker contributor and submits a series of tiny `depositBySig` calls that each move `_pricePerShare` by the allowed 25% band. Because the contract only compares the new value to the last recorded value, the keeper can walk `lastPricePerShare` far below real NAV. The attacker then makes a large by-signature deposit at the fake low price, receives far too many garden shares, and later exits against the garden's real valuation, diluting and stealing reserve assets from existing contributors. The same weak check also affects by-signature withdrawals and Heart staking.","recommendation":"Do not trust keeper-supplied share prices. Recompute price per share on-chain for by-signature flows, or at minimum validate the supplied value against the current on-chain valuation within a tight per-transaction tolerance. Do not let historical user-supplied prices become the sole anchor for future pricing.","evidence":"`depositBySig`, `withdrawBySig`, and `stakeBySig` all accept an external `_pricePerShare`. `_checkLastPricePerShare` only bounds the new price against `lastPricePerShare` plus a decay-based slippage window, then overwrites the stored reference unconditionally; it never compares against the garden's actual current valuation.","locations":["contracts/gardens/Garden.sol:315","contracts/gardens/Garden.sol:427","contracts/gardens/Garden.sol:655","contracts/gardens/Garden.sol:1232"]},{"severity":"high","category":"auth","title":"`claimAndStakeRewardsBySig` signatures are replayable across different gardens","exploit_scenario":"A contributor who is in multiple gardens signs a stake-and-claim message for Garden A. A malicious keeper instead submits that same signature to Garden B where the contributor's garden nonce matches. Garden B accepts it because the signed hash is bound to `heartGarden` rather than `address(this)`, then `_sendRewardsInternal` pays out Garden B's reserve-asset rewards and BABL allocation. The attacker can choose whichever matching garden has the largest rewards set aside, draining funds from an unintended garden with a signature that was never scoped to it.","recommendation":"Bind the source garden into the signed payload and verification path. `claimAndStakeRewardsBySig` should hash `address(this)` (and ideally `chainid`) in addition to the Heart-garden context, or use separate signatures for source-garden reward claims and Heart staking.","evidence":"The signed type for staking rewards does not include a source garden field, and `claimAndStakeRewardsBySig` hashes `address(heartGarden)` instead of `address(this)`. Verification then checks only the contributor nonce of whichever garden executes the call, so the same signature is valid in any garden where that nonce matches.","locations":["contracts/gardens/Garden.sol:107","contracts/gardens/Garden.sol:576","contracts/gardens/Garden.sol:590","contracts/gardens/Garden.sol:605"]},{"severity":"medium","category":"access_control","title":"First `setTimeLockRegistry` call is permissionless, enabling vesting-registry takeover","exploit_scenario":"After deployment, if `timeLockRegistry` has not already been initialized in a constructor/initializer, any external account can call `setTimeLockRegistry` first and point it to an attacker-controlled contract. That attacker then becomes the permanent registry authority because future rotations are gated by `Ownable(timeLockRegistry).owner()`. With control of the registry, the attacker can disrupt claims and claw back still-locked team/advisor balances through the token's `onlyTimeLockRegistry` paths.","recommendation":"Make the registry immutable at deployment, or gate the first assignment with `onlyOwner`/a one-time initializer. Do not allow the zero-state registry check to bypass access control.","evidence":"`onlyTimeLockOwner` performs no authorization when `timeLockRegistry` is still zero. `setTimeLockRegistry` uses that modifier directly, so the initial registry assignment is unrestricted.","locations":["contracts/token/TimeLockedToken.sol:69","contracts/token/TimeLockedToken.sol:155","contracts/token/TimeLockedToken.sol:161"]}]}
tokens used
125,681
Metadata
{
    "codex": {
        "ran_at": "2026-04-04T04:13:48.661988+00:00",
        "returncode": 0
    },
    "project": {
        "mode": "source",
        "file_count": 57,
        "import_count": 68,
        "first_party_contracts_count": 37
    },
    "summary": "Three material issues: keeper-supplied share prices can be ratcheted to steal TVL, stake-and-claim signatures replay across gardens, and the vesting registry can be seized before first initialization.",
    "raw_final": {
        "summary": "Three material issues: keeper-supplied share prices can be ratcheted to steal TVL, stake-and-claim signatures replay across gardens, and the vesting registry can be seized before first initialization.",
        "findings": [
            {
                "title": "Keeper-controlled pricePerShare can be stair-stepped away from real NAV and used to overmint/overwithdraw",
                "category": "oracle",
                "evidence": "`depositBySig`, `withdrawBySig`, and `stakeBySig` all accept an external `_pricePerShare`. `_checkLastPricePerShare` only bounds the new price against `lastPricePerShare` plus a decay-based slippage window, then overwrites the stored reference unconditionally; it never compares against the garden's actual current valuation.",
                "severity": "high",
                "locations": [
                    "contracts/gardens/Garden.sol:315",
                    "contracts/gardens/Garden.sol:427",
                    "contracts/gardens/Garden.sol:655",
                    "contracts/gardens/Garden.sol:1232"
                ],
                "recommendation": "Do not trust keeper-supplied share prices. Recompute price per share on-chain for by-signature flows, or at minimum validate the supplied value against the current on-chain valuation within a tight per-transaction tolerance. Do not let historical user-supplied prices become the sole anchor for future pricing.",
                "exploit_scenario": "A malicious keeper collaborates with an attacker contributor and submits a series of tiny `depositBySig` calls that each move `_pricePerShare` by the allowed 25% band. Because the contract only compares the new value to the last recorded value, the keeper can walk `lastPricePerShare` far below real NAV. The attacker then makes a large by-signature deposit at the fake low price, receives far too many garden shares, and later exits against the garden's real valuation, diluting and stealing reserve assets from existing contributors. The same weak check also affects by-signature withdrawals and Heart staking."
            },
            {
                "title": "`claimAndStakeRewardsBySig` signatures are replayable across different gardens",
                "category": "auth",
                "evidence": "The signed type for staking rewards does not include a source garden field, and `claimAndStakeRewardsBySig` hashes `address(heartGarden)` instead of `address(this)`. Verification then checks only the contributor nonce of whichever garden executes the call, so the same signature is valid in any garden where that nonce matches.",
                "severity": "high",
                "locations": [
                    "contracts/gardens/Garden.sol:107",
                    "contracts/gardens/Garden.sol:576",
                    "contracts/gardens/Garden.sol:590",
                    "contracts/gardens/Garden.sol:605"
                ],
                "recommendation": "Bind the source garden into the signed payload and verification path. `claimAndStakeRewardsBySig` should hash `address(this)` (and ideally `chainid`) in addition to the Heart-garden context, or use separate signatures for source-garden reward claims and Heart staking.",
                "exploit_scenario": "A contributor who is in multiple gardens signs a stake-and-claim message for Garden A. A malicious keeper instead submits that same signature to Garden B where the contributor's garden nonce matches. Garden B accepts it because the signed hash is bound to `heartGarden` rather than `address(this)`, then `_sendRewardsInternal` pays out Garden B's reserve-asset rewards and BABL allocation. The attacker can choose whichever matching garden has the largest rewards set aside, draining funds from an unintended garden with a signature that was never scoped to it."
            },
            {
                "title": "First `setTimeLockRegistry` call is permissionless, enabling vesting-registry takeover",
                "category": "access_control",
                "evidence": "`onlyTimeLockOwner` performs no authorization when `timeLockRegistry` is still zero. `setTimeLockRegistry` uses that modifier directly, so the initial registry assignment is unrestricted.",
                "severity": "medium",
                "locations": [
                    "contracts/token/TimeLockedToken.sol:69",
                    "contracts/token/TimeLockedToken.sol:155",
                    "contracts/token/TimeLockedToken.sol:161"
                ],
                "recommendation": "Make the registry immutable at deployment, or gate the first assignment with `onlyOwner`/a one-time initializer. Do not allow the zero-state registry check to bypass access control.",
                "exploit_scenario": "After deployment, if `timeLockRegistry` has not already been initialized in a constructor/initializer, any external account can call `setTimeLockRegistry` first and point it to an attacker-controlled contract. That attacker then becomes the permanent registry authority because future rotations are gated by `Ownable(timeLockRegistry).owner()`. With control of the registry, the attacker can disrupt claims and claw back still-locked team/advisor balances through the token's `onlyTimeLockRegistry` paths."
            }
        ],
        "no_findings": false
    },
    "no_findings": false,
    "schema_version": 1
}

Opcode Heuristics

tool.cast_disasm
Delegatecall
2
Selfdestruct
0
CREATE2
0
CALL-family (heavy)
45
EXT*/BALANCE
46
Total opcodes
15541
Flags
delegatecall_present heavy_ext_balance_usage call_family_heavy
View cast disassembly output
00000000: PUSH1 0x80
00000002: PUSH1 0x40
00000004: MSTORE
00000005: PUSH1 0x04
00000007: CALLDATASIZE
00000008: LT
00000009: PUSH2 0x03bc
0000000c: JUMPI
0000000d: PUSH1 0x00
0000000f: CALLDATALOAD
00000010: PUSH1 0xe0
00000012: SHR
00000013: DUP1
00000014: PUSH4 0x77e7ff3c
00000019: GT
0000001a: PUSH2 0x01f2
0000001d: JUMPI
0000001e: DUP1
0000001f: PUSH4 0xb1b75867
00000024: GT
00000025: PUSH2 0x010d
00000028: JUMPI
00000029: DUP1
0000002a: PUSH4 0xcb12233b
0000002f: GT
00000030: PUSH2 0x00a0
00000033: JUMPI
00000034: DUP1
00000035: PUSH4 0xdd62ed3e
0000003a: GT
0000003b: PUSH2 0x006f
0000003e: JUMPI
0000003f: DUP1
00000040: PUSH4 0xdd62ed3e
00000045: EQ
00000046: PUSH2 0x12db
00000049: JUMPI
0000004a: DUP1
0000004b: PUSH4 0xf251fc8c
00000050: EQ
00000051: PUSH2 0x1316
00000054: JUMPI
00000055: DUP1
00000056: PUSH4 0xf77c4791
0000005b: EQ
0000005c: PUSH2 0x132b
0000005f: JUMPI
00000060: DUP1
00000061: PUSH4 0xf85cb5c8
00000066: EQ
00000067: PUSH2 0x1340
0000006a: JUMPI
0000006b: PUSH2 0x03cb
0000006e: JUMP
0000006f: JUMPDEST
00000070: DUP1
00000071: PUSH4 0xcb12233b
00000076: EQ
00000077: PUSH2 0x115c
0000007a: JUMPI
0000007b: DUP1
0000007c: PUSH4 0xd360386c
00000081: EQ
00000082: PUSH2 0x1171
00000085: JUMPI
00000086: DUP1
00000087: PUSH4 0xd6888eab
0000008c: EQ
0000008d: PUSH2 0x1275
00000090: JUMPI
00000091: DUP1
00000092: PUSH4 0xdaeffcca
00000097: EQ
00000098: PUSH2 0x128a
0000009b: JUMPI
0000009c: PUSH2 0x03cb
0000009f: JUMP
000000a0: JUMPDEST
000000a1: DUP1
000000a2: PUSH4 0xb63c44e7
000000a7: GT
000000a8: PUSH2 0x00dc
000000ab: JUMPI
000000ac: DUP1
000000ad: PUSH4 0xb63c44e7
000000b2: EQ
000000b3: PUSH2 0x1005
000000b6: JUMPI
000000b7: DUP1
000000b8: PUSH4 0xb9e67539
000000bd: EQ
000000be: PUSH2 0x101a
000000c1: JUMPI
000000c2: DUP1
000000c3: PUSH4 0xbb4d4436
000000c8: EQ
000000c9: PUSH2 0x102f
000000cc: JUMPI
000000cd: DUP1
000000ce: PUSH4 0xbe546f5e
000000d3: EQ
000000d4: PUSH2 0x1062
000000d7: JUMPI
000000d8: PUSH2 0x03cb
000000db: JUMP
000000dc: JUMPDEST
000000dd: DUP1
000000de: PUSH4 0xb1b75867
000000e3: EQ
000000e4: PUSH2 0x0ea7
000000e7: JUMPI
000000e8: DUP1
000000e9: PUSH4 0xb1e3f40c
000000ee: EQ
000000ef: PUSH2 0x0ebc
000000f2: JUMPI
000000f3: DUP1
000000f4: PUSH4 0xb304b815
000000f9: EQ
000000fa: PUSH2 0x0f8b
000000fd: JUMPI
000000fe: DUP1
000000ff: PUSH4 0xb49a60bb
00000104: EQ
00000105: PUSH2 0x0ff0
00000108: JUMPI
00000109: PUSH2 0x03cb
0000010c: JUMP
0000010d: JUMPDEST
0000010e: DUP1
0000010f: PUSH4 0x95cdbedb
00000114: GT
00000115: PUSH2 0x0185
00000118: JUMPI
00000119: DUP1
0000011a: PUSH4 0xa63c643d
0000011f: GT
00000120: PUSH2 0x0154
00000123: JUMPI
00000124: DUP1
00000125: PUSH4 0xa63c643d
0000012a: EQ
0000012b: PUSH2 0x0e2f
0000012e: JUMPI
0000012f: DUP1
00000130: PUSH4 0xa9059cbb
00000135: EQ
00000136: PUSH2 0x0e44
00000139: JUMPI
0000013a: DUP1
0000013b: PUSH4 0xaaffadf3
00000140: EQ
00000141: PUSH2 0x0e7d
00000144: JUMPI
00000145: DUP1
00000146: PUSH4 0xac9dc9e8
0000014b: EQ
0000014c: PUSH2 0x0e92
0000014f: JUMPI
00000150: PUSH2 0x03cb
00000153: JUMP
00000154: JUMPDEST
00000155: DUP1
00000156: PUSH4 0x95cdbedb
0000015b: EQ
0000015c: PUSH2 0x0db7
0000015f: JUMPI
00000160: DUP1
00000161: PUSH4 0x95d89b41
00000166: EQ
00000167: PUSH2 0x0dcc
0000016a: JUMPI
0000016b: DUP1
0000016c: PUSH4 0xa06931f9
00000171: EQ
00000172: PUSH2 0x0de1
00000175: JUMPI
00000176: DUP1
00000177: PUSH4 0xa457c2d7
0000017c: EQ
0000017d: PUSH2 0x0df6
00000180: JUMPI
00000181: PUSH2 0x03cb
00000184: JUMP
00000185: JUMPDEST
00000186: DUP1
00000187: PUSH4 0x8b0e9f3f
0000018c: GT
0000018d: PUSH2 0x01c1
00000190: JUMPI
00000191: DUP1
00000192: PUSH4 0x8b0e9f3f
00000197: EQ
00000198: PUSH2 0x0bb6
0000019b: JUMPI
0000019c: DUP1
0000019d: PUSH4 0x8bbde0fd
000001a2: EQ
000001a3: PUSH2 0x0bcb
000001a6: JUMPI
000001a7: DUP1
000001a8: PUSH4 0x8fa3eab1
000001ad: EQ
000001ae: PUSH2 0x0be0
000001b1: JUMPI
000001b2: DUP1
000001b3: PUSH4 0x94bd87ac
000001b8: EQ
000001b9: PUSH2 0x0cc0
000001bc: JUMPI
000001bd: PUSH2 0x03cb
000001c0: JUMP
000001c1: JUMPDEST
000001c2: DUP1
000001c3: PUSH4 0x77e7ff3c
000001c8: EQ
000001c9: PUSH2 0x0b3d
000001cc: JUMPI
000001cd: DUP1
000001ce: PUSH4 0x792e42e2
000001d3: EQ
000001d4: PUSH2 0x0b52
000001d7: JUMPI
000001d8: DUP1
000001d9: PUSH4 0x7fab0dd4
000001de: EQ
000001df: PUSH2 0x0b67
000001e2: JUMPI
000001e3: DUP1
000001e4: PUSH4 0x84715b11
000001e9: EQ
000001ea: PUSH2 0x0b7c
000001ed: JUMPI
000001ee: PUSH2 0x03cb
000001f1: JUMP
000001f2: JUMPDEST
000001f3: DUP1
000001f4: PUSH4 0x3a821925
000001f9: GT
000001fa: PUSH2 0x02e2
000001fd: JUMPI
000001fe: DUP1
000001ff: PUSH4 0x59659e90
00000204: GT
00000205: PUSH2 0x0275
00000208: JUMPI
00000209: DUP1
0000020a: PUSH4 0x672756ad
0000020f: GT
00000210: PUSH2 0x0244
00000213: JUMPI
00000214: DUP1
00000215: PUSH4 0x672756ad
0000021a: EQ
0000021b: PUSH2 0x0aa1
0000021e: JUMPI
0000021f: DUP1
00000220: PUSH4 0x7071d1a4
00000225: EQ
00000226: PUSH2 0x0ab6
00000229: JUMPI
0000022a: DUP1
0000022b: PUSH4 0x70a08231
00000230: EQ
00000231: PUSH2 0x0af5
00000234: JUMPI
00000235: DUP1
00000236: PUSH4 0x7550ed18
0000023b: EQ
0000023c: PUSH2 0x0b28
0000023f: JUMPI
00000240: PUSH2 0x03cb
00000243: JUMP
00000244: JUMPDEST
00000245: DUP1
00000246: PUSH4 0x59659e90
0000024b: EQ
0000024c: PUSH2 0x0a38
0000024f: JUMPI
00000250: DUP1
00000251: PUSH4 0x5a16656a
00000256: EQ
00000257: PUSH2 0x0a4d
0000025a: JUMPI
0000025b: DUP1
0000025c: PUSH4 0x60d442ca
00000261: EQ
00000262: PUSH2 0x0a62
00000265: JUMPI
00000266: DUP1
00000267: PUSH4 0x63f568b9
0000026c: EQ
0000026d: PUSH2 0x0a77
00000270: JUMPI
00000271: PUSH2 0x03cb
00000274: JUMP
00000275: JUMPDEST
00000276: DUP1
00000277: PUSH4 0x3deddb3f
0000027c: GT
0000027d: PUSH2 0x02b1
00000280: JUMPI
00000281: DUP1
00000282: PUSH4 0x3deddb3f
00000287: EQ
00000288: PUSH2 0x0957
0000028b: JUMPI
0000028c: DUP1
0000028d: PUSH4 0x4961a279
00000292: EQ
00000293: PUSH2 0x096c
00000296: JUMPI
00000297: DUP1
00000298: PUSH4 0x550c2b7f
0000029d: EQ
0000029e: PUSH2 0x09f0
000002a1: JUMPI
000002a2: DUP1
000002a3: PUSH4 0x5617a6e8
000002a8: EQ
000002a9: PUSH2 0x0a05
000002ac: JUMPI
000002ad: PUSH2 0x03cb
000002b0: JUMP
000002b1: JUMPDEST
000002b2: DUP1
000002b3: PUSH4 0x3a821925
000002b8: EQ
000002b9: PUSH2 0x0818
000002bc: JUMPI
000002bd: DUP1
000002be: PUSH4 0x3aa1f9ed
000002c3: EQ
000002c4: PUSH2 0x084b
000002c7: JUMPI
000002c8: DUP1
000002c9: PUSH4 0x3ad8d04d
000002ce: EQ
000002cf: PUSH2 0x0860
000002d2: JUMPI
000002d3: DUP1
000002d4: PUSH4 0x3d8270f5
000002d9: EQ
000002da: PUSH2 0x08dd
000002dd: JUMPI
000002de: PUSH2 0x03cb
000002e1: JUMP
000002e2: JUMPDEST
000002e3: DUP1
000002e4: PUSH4 0x18160ddd
000002e9: GT
000002ea: PUSH2 0x035a
000002ed: JUMPI
000002ee: DUP1
000002ef: PUSH4 0x30869d87
000002f4: GT
000002f5: PUSH2 0x0329
000002f8: JUMPI
000002f9: DUP1
000002fa: PUSH4 0x30869d87
000002ff: EQ
00000300: PUSH2 0x078a
00000303: JUMPI
00000304: DUP1
00000305: PUSH4 0x313ce567
0000030a: EQ
0000030b: PUSH2 0x079f
0000030e: JUMPI
0000030f: DUP1
00000310: PUSH4 0x38e45bc3
00000315: EQ
00000316: PUSH2 0x07ca
00000319: JUMPI
0000031a: DUP1
0000031b: PUSH4 0x39509351
00000320: EQ
00000321: PUSH2 0x07df
00000324: JUMPI
00000325: PUSH2 0x03cb
00000328: JUMP
00000329: JUMPDEST
0000032a: DUP1
0000032b: PUSH4 0x18160ddd
00000330: EQ
00000331: PUSH2 0x060f
00000334: JUMPI
00000335: DUP1
00000336: PUSH4 0x23b872dd
0000033b: EQ
0000033c: PUSH2 0x0636
0000033f: JUMPI
00000340: DUP1
00000341: PUSH4 0x297ce598
00000346: EQ
00000347: PUSH2 0x0679
0000034a: JUMPI
0000034b: DUP1
0000034c: PUSH4 0x2f214efc
00000351: EQ
00000352: PUSH2 0x068e
00000355: JUMPI
00000356: PUSH2 0x03cb
00000359: JUMP
0000035a: JUMPDEST
0000035b: DUP1
0000035c: PUSH4 0x095ea7b3
00000361: GT
00000362: PUSH2 0x0396
00000365: JUMPI
00000366: DUP1
00000367: PUSH4 0x095ea7b3
0000036c: EQ
0000036d: PUSH2 0x04d5
00000370: JUMPI
00000371: DUP1
00000372: PUSH4 0x0b33dbd6
00000377: EQ
00000378: PUSH2 0x050e
0000037b: JUMPI
0000037c: DUP1
0000037d: PUSH4 0x1626ba7e
00000382: EQ
00000383: PUSH2 0x0523
00000386: JUMPI
00000387: DUP1
00000388: PUSH4 0x1780998b
0000038d: EQ
0000038e: PUSH2 0x05fa
00000391: JUMPI
00000392: PUSH2 0x03cb
00000395: JUMP
00000396: JUMPDEST
00000397: DUP1
00000398: PUSH4 0x02d05d3f
0000039d: EQ
0000039e: PUSH2 0x03d3
000003a1: JUMPI
000003a2: DUP1
000003a3: PUSH4 0x06061dfa
000003a8: EQ
000003a9: PUSH2 0x0404
000003ac: JUMPI
000003ad: DUP1
000003ae: PUSH4 0x06fdde03
000003b3: EQ
000003b4: PUSH2 0x044b
000003b7: JUMPI
000003b8: PUSH2 0x03cb
000003bb: JUMP
000003bc: JUMPDEST
000003bd: CALLDATASIZE
000003be: PUSH2 0x03cb
000003c1: JUMPI
000003c2: PUSH2 0x03c9
000003c5: PUSH2 0x1355
000003c8: JUMP
000003c9: JUMPDEST
000003ca: STOP
000003cb: JUMPDEST
000003cc: PUSH2 0x03c9
000003cf: PUSH2 0x1355
000003d2: JUMP
000003d3: JUMPDEST
000003d4: CALLVALUE
000003d5: DUP1
000003d6: ISZERO
000003d7: PUSH2 0x03df
000003da: JUMPI
000003db: PUSH1 0x00
000003dd: DUP1
000003de: REVERT
000003df: JUMPDEST
000003e0: POP
000003e1: PUSH2 0x03e8
000003e4: PUSH2 0x136f
000003e7: JUMP
000003e8: JUMPDEST
000003e9: PUSH1 0x40
000003eb: DUP1
000003ec: MLOAD
000003ed: PUSH1 0x01
000003ef: PUSH1 0x01
000003f1: PUSH1 0xa0
000003f3: SHL
000003f4: SUB
000003f5: SWAP1
000003f6: SWAP3
000003f7: AND
000003f8: DUP3
000003f9: MSTORE
000003fa: MLOAD
000003fb: SWAP1
000003fc: DUP2
000003fd: SWAP1
000003fe: SUB
000003ff: PUSH1 0x20
00000401: ADD
00000402: SWAP1
00000403: RETURN
00000404: JUMPDEST
00000405: CALLVALUE
00000406: DUP1
00000407: ISZERO
00000408: PUSH2 0x0410
0000040b: JUMPI
0000040c: PUSH1 0x00
0000040e: DUP1
0000040f: REVERT
00000410: JUMPDEST
00000411: POP
00000412: PUSH2 0x0437
00000415: PUSH1 0x04
00000417: DUP1
00000418: CALLDATASIZE
00000419: SUB
0000041a: PUSH1 0x20
0000041c: DUP2
0000041d: LT
0000041e: ISZERO
0000041f: PUSH2 0x0427
00000422: JUMPI
00000423: PUSH1 0x00
00000425: DUP1
00000426: REVERT
00000427: JUMPDEST
00000428: POP
00000429: CALLDATALOAD
0000042a: PUSH1 0x01
0000042c: PUSH1 0x01
0000042e: PUSH1 0xa0
00000430: SHL
00000431: SUB
00000432: AND
00000433: PUSH2 0x137e
00000436: JUMP
00000437: JUMPDEST
00000438: PUSH1 0x40
0000043a: DUP1
0000043b: MLOAD
0000043c: SWAP2
0000043d: ISZERO
0000043e: ISZERO
0000043f: DUP3
00000440: MSTORE
00000441: MLOAD
00000442: SWAP1
00000443: DUP2
00000444: SWAP1
00000445: SUB
00000446: PUSH1 0x20
00000448: ADD
00000449: SWAP1
0000044a: RETURN
0000044b: JUMPDEST
0000044c: CALLVALUE
0000044d: DUP1
0000044e: ISZERO
0000044f: PUSH2 0x0457
00000452: JUMPI
00000453: PUSH1 0x00
00000455: DUP1
00000456: REVERT
00000457: JUMPDEST
00000458: POP
00000459: PUSH2 0x0460
0000045c: PUSH2 0x1393
0000045f: JUMP
00000460: JUMPDEST
00000461: PUSH1 0x40
00000463: DUP1
00000464: MLOAD
00000465: PUSH1 0x20
00000467: DUP1
00000468: DUP3
00000469: MSTORE
0000046a: DUP4
0000046b: MLOAD
0000046c: DUP2
0000046d: DUP4
0000046e: ADD
0000046f: MSTORE
00000470: DUP4
00000471: MLOAD
00000472: SWAP2
00000473: SWAP3
00000474: DUP4
00000475: SWAP3
00000476: SWAP1
00000477: DUP4
00000478: ADD
00000479: SWAP2
0000047a: DUP6
0000047b: ADD
0000047c: SWAP1
0000047d: DUP1
0000047e: DUP4
0000047f: DUP4
00000480: PUSH1 0x00
00000482: JUMPDEST
00000483: DUP4
00000484: DUP2
00000485: LT
00000486: ISZERO
00000487: PUSH2 0x049a
0000048a: JUMPI
0000048b: DUP2
0000048c: DUP2
0000048d: ADD
0000048e: MLOAD
0000048f: DUP4
00000490: DUP3
00000491: ADD
00000492: MSTORE
00000493: PUSH1 0x20
00000495: ADD
00000496: PUSH2 0x0482
00000499: JUMP
0000049a: JUMPDEST
0000049b: POP
0000049c: POP
0000049d: POP
0000049e: POP
0000049f: SWAP1
000004a0: POP
000004a1: SWAP1
000004a2: DUP2
000004a3: ADD
000004a4: SWAP1
000004a5: PUSH1 0x1f
000004a7: AND
000004a8: DUP1
000004a9: ISZERO
000004aa: PUSH2 0x04c7
000004ad: JUMPI
000004ae: DUP1
000004af: DUP3
000004b0: SUB
000004b1: DUP1
000004b2: MLOAD
000004b3: PUSH1 0x01
000004b5: DUP4
000004b6: PUSH1 0x20
000004b8: SUB
000004b9: PUSH2 0x0100
000004bc: EXP
000004bd: SUB
000004be: NOT
000004bf: AND
000004c0: DUP2
000004c1: MSTORE
000004c2: PUSH1 0x20
000004c4: ADD
000004c5: SWAP2
000004c6: POP
000004c7: JUMPDEST
000004c8: POP
000004c9: SWAP3
000004ca: POP
000004cb: POP
000004cc: POP
000004cd: PUSH1 0x40
000004cf: MLOAD
000004d0: DUP1
000004d1: SWAP2
000004d2: SUB
000004d3: SWAP1
000004d4: RETURN
000004d5: JUMPDEST
000004d6: CALLVALUE
000004d7: DUP1
000004d8: ISZERO
000004d9: PUSH2 0x04e1
000004dc: JUMPI
000004dd: PUSH1 0x00
000004df: DUP1
000004e0: REVERT
000004e1: JUMPDEST
000004e2: POP
000004e3: PUSH2 0x0437
000004e6: PUSH1 0x04
000004e8: DUP1
000004e9: CALLDATASIZE
000004ea: SUB
000004eb: PUSH1 0x40
000004ed: DUP2
000004ee: LT
000004ef: ISZERO
000004f0: PUSH2 0x04f8
000004f3: JUMPI
000004f4: PUSH1 0x00
000004f6: DUP1
000004f7: REVERT
000004f8: JUMPDEST
000004f9: POP
000004fa: PUSH1 0x01
000004fc: PUSH1 0x01
000004fe: PUSH1 0xa0
00000500: SHL
00000501: SUB
00000502: DUP2
00000503: CALLDATALOAD
00000504: AND
00000505: SWAP1
00000506: PUSH1 0x20
00000508: ADD
00000509: CALLDATALOAD
0000050a: PUSH2 0x142a
0000050d: JUMP
0000050e: JUMPDEST
0000050f: CALLVALUE
00000510: DUP1
00000511: ISZERO
00000512: PUSH2 0x051a
00000515: JUMPI
00000516: PUSH1 0x00
00000518: DUP1
00000519: REVERT
0000051a: JUMPDEST
0000051b: POP
0000051c: PUSH2 0x0437
0000051f: PUSH2 0x1448
00000522: JUMP
00000523: JUMPDEST
00000524: CALLVALUE
00000525: DUP1
00000526: ISZERO
00000527: PUSH2 0x052f
0000052a: JUMPI
0000052b: PUSH1 0x00
0000052d: DUP1
0000052e: REVERT
0000052f: JUMPDEST
00000530: POP
00000531: PUSH2 0x05dd
00000534: PUSH1 0x04
00000536: DUP1
00000537: CALLDATASIZE
00000538: SUB
00000539: PUSH1 0x40
0000053b: DUP2
0000053c: LT
0000053d: ISZERO
0000053e: PUSH2 0x0546
00000541: JUMPI
00000542: PUSH1 0x00
00000544: DUP1
00000545: REVERT
00000546: JUMPDEST
00000547: DUP2
00000548: CALLDATALOAD
00000549: SWAP2
0000054a: SWAP1
0000054b: DUP2
0000054c: ADD
0000054d: SWAP1
0000054e: PUSH1 0x40
00000550: DUP2
00000551: ADD
00000552: PUSH1 0x20
00000554: DUP3
00000555: ADD
00000556: CALLDATALOAD
00000557: PUSH5 0x0100000000
0000055d: DUP2
0000055e: GT
0000055f: ISZERO
00000560: PUSH2 0x0568
00000563: JUMPI
00000564: PUSH1 0x00
00000566: DUP1
00000567: REVERT
00000568: JUMPDEST
00000569: DUP3
0000056a: ADD
0000056b: DUP4
0000056c: PUSH1 0x20
0000056e: DUP3
0000056f: ADD
00000570: GT
00000571: ISZERO
00000572: PUSH2 0x057a
00000575: JUMPI
00000576: PUSH1 0x00
00000578: DUP1
00000579: REVERT
0000057a: JUMPDEST
0000057b: DUP1
0000057c: CALLDATALOAD
0000057d: SWAP1
0000057e: PUSH1 0x20
00000580: ADD
00000581: SWAP2
00000582: DUP5
00000583: PUSH1 0x01
00000585: DUP4
00000586: MUL
00000587: DUP5
00000588: ADD
00000589: GT
0000058a: PUSH5 0x0100000000
00000590: DUP4
00000591: GT
00000592: OR
00000593: ISZERO
00000594: PUSH2 0x059c
00000597: JUMPI
00000598: PUSH1 0x00
0000059a: DUP1
0000059b: REVERT
0000059c: JUMPDEST
0000059d: SWAP2
0000059e: SWAP1
0000059f: DUP1
000005a0: DUP1
000005a1: PUSH1 0x1f
000005a3: ADD
000005a4: PUSH1 0x20
000005a6: DUP1
000005a7: SWAP2
000005a8: DIV
000005a9: MUL
000005aa: PUSH1 0x20
000005ac: ADD
000005ad: PUSH1 0x40
000005af: MLOAD
000005b0: SWAP1
000005b1: DUP2
000005b2: ADD
000005b3: PUSH1 0x40
000005b5: MSTORE
000005b6: DUP1
000005b7: SWAP4
000005b8: SWAP3
000005b9: SWAP2
000005ba: SWAP1
000005bb: DUP2
000005bc: DUP2
000005bd: MSTORE
000005be: PUSH1 0x20
000005c0: ADD
000005c1: DUP4
000005c2: DUP4
000005c3: DUP1
000005c4: DUP3
000005c5: DUP5
000005c6: CALLDATACOPY
000005c7: PUSH1 0x00
000005c9: SWAP3
000005ca: ADD
000005cb: SWAP2
000005cc: SWAP1
000005cd: SWAP2
000005ce: MSTORE
000005cf: POP
000005d0: SWAP3
000005d1: SWAP6
000005d2: POP
000005d3: PUSH2 0x1451
000005d6: SWAP5
000005d7: POP
000005d8: POP
000005d9: POP
000005da: POP
000005db: POP
000005dc: JUMP
000005dd: JUMPDEST
000005de: PUSH1 0x40
000005e0: DUP1
000005e1: MLOAD
000005e2: PUSH1 0x01
000005e4: PUSH1 0x01
000005e6: PUSH1 0xe0
000005e8: SHL
000005e9: SUB
000005ea: NOT
000005eb: SWAP1
000005ec: SWAP3
000005ed: AND
000005ee: DUP3
000005ef: MSTORE
000005f0: MLOAD
000005f1: SWAP1
000005f2: DUP2
000005f3: SWAP1
000005f4: SUB
000005f5: PUSH1 0x20
000005f7: ADD
000005f8: SWAP1
000005f9: RETURN
000005fa: JUMPDEST
000005fb: CALLVALUE
000005fc: DUP1
000005fd: ISZERO
000005fe: PUSH2 0x0606
00000601: JUMPI
00000602: PUSH1 0x00
00000604: DUP1
00000605: REVERT
00000606: JUMPDEST
00000607: POP
00000608: PUSH2 0x0437
0000060b: PUSH2 0x14a5
0000060e: JUMP
0000060f: JUMPDEST
00000610: CALLVALUE
00000611: DUP1
00000612: ISZERO
00000613: PUSH2 0x061b
00000616: JUMPI
00000617: PUSH1 0x00
00000619: DUP1
0000061a: REVERT
0000061b: JUMPDEST
0000061c: POP
0000061d: PUSH2 0x0624
00000620: PUSH2 0x14ae
00000623: JUMP
00000624: JUMPDEST
00000625: PUSH1 0x40
00000627: DUP1
00000628: MLOAD
00000629: SWAP2
0000062a: DUP3
0000062b: MSTORE
0000062c: MLOAD
0000062d: SWAP1
0000062e: DUP2
0000062f: SWAP1
00000630: SUB
00000631: PUSH1 0x20
00000633: ADD
00000634: SWAP1
00000635: RETURN
00000636: JUMPDEST
00000637: CALLVALUE
00000638: DUP1
00000639: ISZERO
0000063a: PUSH2 0x0642
0000063d: JUMPI
0000063e: PUSH1 0x00
00000640: DUP1
00000641: REVERT
00000642: JUMPDEST
00000643: POP
00000644: PUSH2 0x0437
00000647: PUSH1 0x04
00000649: DUP1
0000064a: CALLDATASIZE
0000064b: SUB
0000064c: PUSH1 0x60
0000064e: DUP2
0000064f: LT
00000650: ISZERO
00000651: PUSH2 0x0659
00000654: JUMPI
00000655: PUSH1 0x00
00000657: DUP1
00000658: REVERT
00000659: JUMPDEST
0000065a: POP
0000065b: PUSH1 0x01
0000065d: PUSH1 0x01
0000065f: PUSH1 0xa0
00000661: SHL
00000662: SUB
00000663: DUP2
00000664: CALLDATALOAD
00000665: DUP2
00000666: AND
00000667: SWAP2
00000668: PUSH1 0x20
0000066a: DUP2
0000066b: ADD
0000066c: CALLDATALOAD
0000066d: SWAP1
0000066e: SWAP2
0000066f: AND
00000670: SWAP1
00000671: PUSH1 0x40
00000673: ADD
00000674: CALLDATALOAD
00000675: PUSH2 0x14b4
00000678: JUMP
00000679: JUMPDEST
0000067a: CALLVALUE
0000067b: DUP1
0000067c: ISZERO
0000067d: PUSH2 0x0685
00000680: JUMPI
00000681: PUSH1 0x00
00000683: DUP1
00000684: REVERT
00000685: JUMPDEST
00000686: POP
00000687: PUSH2 0x0624
0000068a: PUSH2 0x153b
0000068d: JUMP
0000068e: JUMPDEST
0000068f: CALLVALUE
00000690: DUP1
00000691: ISZERO
00000692: PUSH2 0x069a
00000695: JUMPI
00000696: PUSH1 0x00
00000698: DUP1
00000699: REVERT
0000069a: JUMPDEST
0000069b: POP
0000069c: PUSH2 0x03c9
0000069f: PUSH1 0x04
000006a1: DUP1
000006a2: CALLDATASIZE
000006a3: SUB
000006a4: PUSH2 0x0140
000006a7: DUP2
000006a8: LT
000006a9: ISZERO
000006aa: PUSH2 0x06b2
000006ad: JUMPI
000006ae: PUSH1 0x00
000006b0: DUP1
000006b1: REVERT
000006b2: JUMPDEST
000006b3: DUP2
000006b4: CALLDATALOAD
000006b5: SWAP2
000006b6: PUSH1 0x20
000006b8: DUP2
000006b9: ADD
000006ba: CALLDATALOAD
000006bb: SWAP2
000006bc: PUSH1 0x40
000006be: DUP3
000006bf: ADD
000006c0: CALLDATALOAD
000006c1: SWAP2
000006c2: PUSH1 0x60
000006c4: DUP2
000006c5: ADD
000006c6: CALLDATALOAD
000006c7: SWAP2
000006c8: PUSH1 0x01
000006ca: PUSH1 0x01
000006cc: PUSH1 0xa0
000006ce: SHL
000006cf: SUB
000006d0: PUSH1 0x80
000006d2: DUP4
000006d3: ADD
000006d4: CALLDATALOAD
000006d5: DUP2
000006d6: AND
000006d7: SWAP3
000006d8: PUSH1 0xa0
000006da: DUP2
000006db: ADD
000006dc: CALLDATALOAD
000006dd: SWAP3
000006de: PUSH1 0xc0
000006e0: DUP3
000006e1: ADD
000006e2: CALLDATALOAD
000006e3: SWAP3
000006e4: PUSH1 0xe0
000006e6: DUP4
000006e7: ADD
000006e8: CALLDATALOAD
000006e9: DUP2
000006ea: AND
000006eb: SWAP3
000006ec: PUSH2 0x0100
000006ef: DUP2
000006f0: ADD
000006f1: CALLDATALOAD
000006f2: SWAP1
000006f3: SWAP2
000006f4: AND
000006f5: SWAP2
000006f6: DUP2
000006f7: ADD
000006f8: SWAP1
000006f9: PUSH2 0x0140
000006fc: DUP2
000006fd: ADD
000006fe: PUSH2 0x0120
00000701: DUP3
00000702: ADD
00000703: CALLDATALOAD
00000704: PUSH5 0x0100000000
0000070a: DUP2
0000070b: GT
0000070c: ISZERO
0000070d: PUSH2 0x0715
00000710: JUMPI
00000711: PUSH1 0x00
00000713: DUP1
00000714: REVERT
00000715: JUMPDEST
00000716: DUP3
00000717: ADD
00000718: DUP4
00000719: PUSH1 0x20
0000071b: DUP3
0000071c: ADD
0000071d: GT
0000071e: ISZERO
0000071f: PUSH2 0x0727
00000722: JUMPI
00000723: PUSH1 0x00
00000725: DUP1
00000726: REVERT
00000727: JUMPDEST
00000728: DUP1
00000729: CALLDATALOAD
0000072a: SWAP1
0000072b: PUSH1 0x20
0000072d: ADD
0000072e: SWAP2
0000072f: DUP5
00000730: PUSH1 0x01
00000732: DUP4
00000733: MUL
00000734: DUP5
00000735: ADD
00000736: GT
00000737: PUSH5 0x0100000000
0000073d: DUP4
0000073e: GT
0000073f: OR
00000740: ISZERO
00000741: PUSH2 0x0749
00000744: JUMPI
00000745: PUSH1 0x00
00000747: DUP1
00000748: REVERT
00000749: JUMPDEST
0000074a: SWAP2
0000074b: SWAP1
0000074c: DUP1
0000074d: DUP1
0000074e: PUSH1 0x1f
00000750: ADD
00000751: PUSH1 0x20
00000753: DUP1
00000754: SWAP2
00000755: DIV
00000756: MUL
00000757: PUSH1 0x20
00000759: ADD
0000075a: PUSH1 0x40
0000075c: MLOAD
0000075d: SWAP1
0000075e: DUP2
0000075f: ADD
00000760: PUSH1 0x40
00000762: MSTORE
00000763: DUP1
00000764: SWAP4
00000765: SWAP3
00000766: SWAP2
00000767: SWAP1
00000768: DUP2
00000769: DUP2
0000076a: MSTORE
0000076b: PUSH1 0x20
0000076d: ADD
0000076e: DUP4
0000076f: DUP4
00000770: DUP1
00000771: DUP3
00000772: DUP5
00000773: CALLDATACOPY
00000774: PUSH1 0x00
00000776: SWAP3
00000777: ADD
00000778: SWAP2
00000779: SWAP1
0000077a: SWAP2
0000077b: MSTORE
0000077c: POP
0000077d: SWAP3
0000077e: SWAP6
0000077f: POP
00000780: PUSH2 0x1541
00000783: SWAP5
00000784: POP
00000785: POP
00000786: POP
00000787: POP
00000788: POP
00000789: JUMP
0000078a: JUMPDEST
0000078b: CALLVALUE
0000078c: DUP1
0000078d: ISZERO
0000078e: PUSH2 0x0796
00000791: JUMPI
00000792: PUSH1 0x00
00000794: DUP1
00000795: REVERT
00000796: JUMPDEST
00000797: POP
00000798: PUSH2 0x0624
0000079b: PUSH2 0x16d8
0000079e: JUMP
0000079f: JUMPDEST
000007a0: CALLVALUE
000007a1: DUP1
000007a2: ISZERO
000007a3: PUSH2 0x07ab
000007a6: JUMPI
000007a7: PUSH1 0x00
000007a9: DUP1
000007aa: REVERT
000007ab: JUMPDEST
000007ac: POP
000007ad: PUSH2 0x07b4
000007b0: PUSH2 0x16de
000007b3: JUMP
000007b4: JUMPDEST
000007b5: PUSH1 0x40
000007b7: DUP1
000007b8: MLOAD
000007b9: PUSH1 0xff
000007bb: SWAP1
000007bc: SWAP3
000007bd: AND
000007be: DUP3
000007bf: MSTORE
000007c0: MLOAD
000007c1: SWAP1
000007c2: DUP2
000007c3: SWAP1
000007c4: SUB
000007c5: PUSH1 0x20
000007c7: ADD
000007c8: SWAP1
000007c9: RETURN
000007ca: JUMPDEST
000007cb: CALLVALUE
000007cc: DUP1
000007cd: ISZERO
000007ce: PUSH2 0x07d6
000007d1: JUMPI
000007d2: PUSH1 0x00
000007d4: DUP1
000007d5: REVERT
000007d6: JUMPDEST
000007d7: POP
000007d8: PUSH2 0x0624
000007db: PUSH2 0x16e7
000007de: JUMP
000007df: JUMPDEST
000007e0: CALLVALUE
000007e1: DUP1
000007e2: ISZERO
000007e3: PUSH2 0x07eb
000007e6: JUMPI
000007e7: PUSH1 0x00
000007e9: DUP1
000007ea: REVERT
000007eb: JUMPDEST
000007ec: POP
000007ed: PUSH2 0x0437
000007f0: PUSH1 0x04
000007f2: DUP1
000007f3: CALLDATASIZE
000007f4: SUB
000007f5: PUSH1 0x40
000007f7: DUP2
000007f8: LT
000007f9: ISZERO
000007fa: PUSH2 0x0802
000007fd: JUMPI
000007fe: PUSH1 0x00
00000800: DUP1
00000801: REVERT
00000802: JUMPDEST
00000803: POP
00000804: PUSH1 0x01
00000806: PUSH1 0x01
00000808: PUSH1 0xa0
0000080a: SHL
0000080b: SUB
0000080c: DUP2
0000080d: CALLDATALOAD
0000080e: AND
0000080f: SWAP1
00000810: PUSH1 0x20
00000812: ADD
00000813: CALLDATALOAD
00000814: PUSH2 0x16ed
00000817: JUMP
00000818: JUMPDEST
00000819: CALLVALUE
0000081a: DUP1
0000081b: ISZERO
0000081c: PUSH2 0x0824
0000081f: JUMPI
00000820: PUSH1 0x00
00000822: DUP1
00000823: REVERT
00000824: JUMPDEST
00000825: POP
00000826: PUSH2 0x0437
00000829: PUSH1 0x04
0000082b: DUP1
0000082c: CALLDATASIZE
0000082d: SUB
0000082e: PUSH1 0x20
00000830: DUP2
00000831: LT
00000832: ISZERO
00000833: PUSH2 0x083b
00000836: JUMPI
00000837: PUSH1 0x00
00000839: DUP1
0000083a: REVERT
0000083b: JUMPDEST
0000083c: POP
0000083d: CALLDATALOAD
0000083e: PUSH1 0x01
00000840: PUSH1 0x01
00000842: PUSH1 0xa0
00000844: SHL
00000845: SUB
00000846: AND
00000847: PUSH2 0x173b
0000084a: JUMP
0000084b: JUMPDEST
0000084c: CALLVALUE
0000084d: DUP1
0000084e: ISZERO
0000084f: PUSH2 0x0857
00000852: JUMPI
00000853: PUSH1 0x00
00000855: DUP1
00000856: REVERT
00000857: JUMPDEST
00000858: POP
00000859: PUSH2 0x0624
0000085c: PUSH2 0x1750
0000085f: JUMP
00000860: JUMPDEST
00000861: CALLVALUE
00000862: DUP1
00000863: ISZERO
00000864: PUSH2 0x086c
00000867: JUMPI
00000868: PUSH1 0x00
0000086a: DUP1
0000086b: REVERT
0000086c: JUMPDEST
0000086d: POP
0000086e: PUSH2 0x03c9
00000871: PUSH1 0x04
00000873: DUP1
00000874: CALLDATASIZE
00000875: SUB
00000876: PUSH1 0x20
00000878: DUP2
00000879: LT
0000087a: ISZERO
0000087b: PUSH2 0x0883
0000087e: JUMPI
0000087f: PUSH1 0x00
00000881: DUP1
00000882: REVERT
00000883: JUMPDEST
00000884: DUP2
00000885: ADD
00000886: SWAP1
00000887: PUSH1 0x20
00000889: DUP2
0000088a: ADD
0000088b: DUP2
0000088c: CALLDATALOAD
0000088d: PUSH5 0x0100000000
00000893: DUP2
00000894: GT
00000895: ISZERO
00000896: PUSH2 0x089e
00000899: JUMPI
0000089a: PUSH1 0x00
0000089c: DUP1
0000089d: REVERT
0000089e: JUMPDEST
0000089f: DUP3
000008a0: ADD
000008a1: DUP4
000008a2: PUSH1 0x20
000008a4: DUP3
000008a5: ADD
000008a6: GT
000008a7: ISZERO
000008a8: PUSH2 0x08b0
000008ab: JUMPI
000008ac: PUSH1 0x00
000008ae: DUP1
000008af: REVERT
000008b0: JUMPDEST
000008b1: DUP1
000008b2: CALLDATALOAD
000008b3: SWAP1
000008b4: PUSH1 0x20
000008b6: ADD
000008b7: SWAP2
000008b8: DUP5
000008b9: PUSH1 0x20
000008bb: DUP4
000008bc: MUL
000008bd: DUP5
000008be: ADD
000008bf: GT
000008c0: PUSH5 0x0100000000
000008c6: DUP4
000008c7: GT
000008c8: OR
000008c9: ISZERO
000008ca: PUSH2 0x08d2
000008cd: JUMPI
000008ce: PUSH1 0x00
000008d0: DUP1
000008d1: REVERT
000008d2: JUMPDEST
000008d3: POP
000008d4: SWAP1
000008d5: SWAP3
000008d6: POP
000008d7: SWAP1
000008d8: POP
000008d9: PUSH2 0x1756
000008dc: JUMP
000008dd: JUMPDEST
000008de: CALLVALUE
000008df: DUP1
000008e0: ISZERO
000008e1: PUSH2 0x08e9
000008e4: JUMPI
000008e5: PUSH1 0x00
000008e7: DUP1
000008e8: REVERT
000008e9: JUMPDEST
000008ea: POP
000008eb: PUSH2 0x0910
000008ee: PUSH1 0x04
000008f0: DUP1
000008f1: CALLDATASIZE
000008f2: SUB
000008f3: PUSH1 0x20
000008f5: DUP2
000008f6: LT
000008f7: ISZERO
000008f8: PUSH2 0x0900
000008fb: JUMPI
000008fc: PUSH1 0x00
000008fe: DUP1
000008ff: REVERT
00000900: JUMPDEST
00000901: POP
00000902: CALLDATALOAD
00000903: PUSH1 0x01
00000905: PUSH1 0x01
00000907: PUSH1 0xa0
00000909: SHL
0000090a: SUB
0000090b: AND
0000090c: PUSH2 0x1978
0000090f: JUMP
00000910: JUMPDEST
00000911: PUSH1 0x40
00000913: DUP1
00000914: MLOAD
00000915: SWAP10
00000916: DUP11
00000917: MSTORE
00000918: PUSH1 0x20
0000091a: DUP11
0000091b: ADD
0000091c: SWAP9
0000091d: SWAP1
0000091e: SWAP9
0000091f: MSTORE
00000920: DUP9
00000921: DUP9
00000922: ADD
00000923: SWAP7
00000924: SWAP1
00000925: SWAP7
00000926: MSTORE
00000927: PUSH1 0x60
00000929: DUP9
0000092a: ADD
0000092b: SWAP5
0000092c: SWAP1
0000092d: SWAP5
0000092e: MSTORE
0000092f: PUSH1 0x80
00000931: DUP8
00000932: ADD
00000933: SWAP3
00000934: SWAP1
00000935: SWAP3
00000936: MSTORE
00000937: PUSH1 0xa0
00000939: DUP7
0000093a: ADD
0000093b: MSTORE
0000093c: PUSH1 0xc0
0000093e: DUP6
0000093f: ADD
00000940: MSTORE
00000941: PUSH1 0xe0
00000943: DUP5
00000944: ADD
00000945: MSTORE
00000946: PUSH2 0x0100
00000949: DUP4
0000094a: ADD
0000094b: MSTORE
0000094c: MLOAD
0000094d: SWAP1
0000094e: DUP2
0000094f: SWAP1
00000950: SUB
00000951: PUSH2 0x0120
00000954: ADD
00000955: SWAP1
00000956: RETURN
00000957: JUMPDEST
00000958: CALLVALUE
00000959: DUP1
0000095a: ISZERO
0000095b: PUSH2 0x0963
0000095e: JUMPI
0000095f: PUSH1 0x00
00000961: DUP1
00000962: REVERT
00000963: JUMPDEST
00000964: POP
00000965: PUSH2 0x0624
00000968: PUSH2 0x1a10
0000096b: JUMP
0000096c: JUMPDEST
0000096d: CALLVALUE
0000096e: DUP1
0000096f: ISZERO
00000970: PUSH2 0x0978
00000973: JUMPI
00000974: PUSH1 0x00
00000976: DUP1
00000977: REVERT
00000978: JUMPDEST
00000979: POP
0000097a: PUSH2 0x03c9
0000097d: PUSH1 0x04
0000097f: DUP1
00000980: CALLDATASIZE
00000981: SUB
00000982: PUSH1 0x40
00000984: DUP2
00000985: LT
00000986: ISZERO
00000987: PUSH2 0x098f
0000098a: JUMPI
0000098b: PUSH1 0x00
0000098d: DUP1
0000098e: REVERT
0000098f: JUMPDEST
00000990: DUP2
00000991: CALLDATALOAD
00000992: SWAP2
00000993: SWAP1
00000994: DUP2
00000995: ADD
00000996: SWAP1
00000997: PUSH1 0x40
00000999: DUP2
0000099a: ADD
0000099b: PUSH1 0x20
0000099d: DUP3
0000099e: ADD
0000099f: CALLDATALOAD
000009a0: PUSH5 0x0100000000
000009a6: DUP2
000009a7: GT
000009a8: ISZERO
000009a9: PUSH2 0x09b1
000009ac: JUMPI
000009ad: PUSH1 0x00
000009af: DUP1
000009b0: REVERT
000009b1: JUMPDEST
000009b2: DUP3
000009b3: ADD
000009b4: DUP4
000009b5: PUSH1 0x20
000009b7: DUP3
000009b8: ADD
000009b9: GT
000009ba: ISZERO
000009bb: PUSH2 0x09c3
000009be: JUMPI
000009bf: PUSH1 0x00
000009c1: DUP1
000009c2: REVERT
000009c3: JUMPDEST
000009c4: DUP1
000009c5: CALLDATALOAD
000009c6: SWAP1
000009c7: PUSH1 0x20
000009c9: ADD
000009ca: SWAP2
000009cb: DUP5
000009cc: PUSH1 0x20
000009ce: DUP4
000009cf: MUL
000009d0: DUP5
000009d1: ADD
000009d2: GT
000009d3: PUSH5 0x0100000000
000009d9: DUP4
000009da: GT
000009db: OR
000009dc: ISZERO
000009dd: PUSH2 0x09e5
000009e0: JUMPI
000009e1: PUSH1 0x00
000009e3: DUP1
000009e4: REVERT
000009e5: JUMPDEST
000009e6: POP
000009e7: SWAP1
000009e8: SWAP3
000009e9: POP
000009ea: SWAP1
000009eb: POP
000009ec: PUSH2 0x1a16
000009ef: JUMP
000009f0: JUMPDEST
000009f1: CALLVALUE
000009f2: DUP1
000009f3: ISZERO
000009f4: PUSH2 0x09fc
000009f7: JUMPI
000009f8: PUSH1 0x00
000009fa: DUP1
000009fb: REVERT
000009fc: JUMPDEST
000009fd: POP
000009fe: PUSH2 0x0437
00000a01: PUSH2 0x1e3b
00000a04: JUMP
00000a05: JUMPDEST
00000a06: CALLVALUE
00000a07: DUP1
00000a08: ISZERO
00000a09: PUSH2 0x0a11
00000a0c: JUMPI
00000a0d: PUSH1 0x00
00000a0f: DUP1
00000a10: REVERT
00000a11: JUMPDEST
00000a12: POP
00000a13: PUSH2 0x0624
00000a16: PUSH1 0x04
00000a18: DUP1
00000a19: CALLDATASIZE
00000a1a: SUB
00000a1b: PUSH1 0x20
00000a1d: DUP2
00000a1e: LT
00000a1f: ISZERO
00000a20: PUSH2 0x0a28
00000a23: JUMPI
00000a24: PUSH1 0x00
00000a26: DUP1
00000a27: REVERT
00000a28: JUMPDEST
00000a29: POP
00000a2a: CALLDATALOAD
00000a2b: PUSH1 0x01
00000a2d: PUSH1 0x01
00000a2f: PUSH1 0xa0
00000a31: SHL
00000a32: SUB
00000a33: AND
00000a34: PUSH2 0x1e4b
00000a37: JUMP
00000a38: JUMPDEST
00000a39: CALLVALUE
00000a3a: DUP1
00000a3b: ISZERO
00000a3c: PUSH2 0x0a44
00000a3f: JUMPI
00000a40: PUSH1 0x00
00000a42: DUP1
00000a43: REVERT
00000a44: JUMPDEST
00000a45: POP
00000a46: PUSH2 0x03e8
00000a49: PUSH2 0x1e5d
00000a4c: JUMP
00000a4d: JUMPDEST
00000a4e: CALLVALUE
00000a4f: DUP1
00000a50: ISZERO
00000a51: PUSH2 0x0a59
00000a54: JUMPI
00000a55: PUSH1 0x00
00000a57: DUP1
00000a58: REVERT
00000a59: JUMPDEST
00000a5a: POP
00000a5b: PUSH2 0x0624
00000a5e: PUSH2 0x1e81
00000a61: JUMP
00000a62: JUMPDEST
00000a63: CALLVALUE
00000a64: DUP1
00000a65: ISZERO
00000a66: PUSH2 0x0a6e
00000a69: JUMPI
00000a6a: PUSH1 0x00
00000a6c: DUP1
00000a6d: REVERT
00000a6e: JUMPDEST
00000a6f: POP
00000a70: PUSH2 0x0624
00000a73: PUSH2 0x1e87
00000a76: JUMP
00000a77: JUMPDEST
00000a78: CALLVALUE
00000a79: DUP1
00000a7a: ISZERO
00000a7b: PUSH2 0x0a83
00000a7e: JUMPI
00000a7f: PUSH1 0x00
00000a81: DUP1
00000a82: REVERT
00000a83: JUMPDEST
00000a84: POP
00000a85: PUSH2 0x03e8
00000a88: PUSH1 0x04
00000a8a: DUP1
00000a8b: CALLDATASIZE
00000a8c: SUB
00000a8d: PUSH1 0x20
00000a8f: DUP2
00000a90: LT
00000a91: ISZERO
00000a92: PUSH2 0x0a9a
00000a95: JUMPI
00000a96: PUSH1 0x00
00000a98: DUP1
00000a99: REVERT
00000a9a: JUMPDEST
00000a9b: POP
00000a9c: CALLDATALOAD
00000a9d: PUSH2 0x1e8d
00000aa0: JUMP
00000aa1: JUMPDEST
00000aa2: CALLVALUE
00000aa3: DUP1
00000aa4: ISZERO
00000aa5: PUSH2 0x0aad
00000aa8: JUMPI
00000aa9: PUSH1 0x00
00000aab: DUP1
00000aac: REVERT
00000aad: JUMPDEST
00000aae: POP
00000aaf: PUSH2 0x03c9
00000ab2: PUSH2 0x1ead
00000ab5: JUMP
00000ab6: JUMPDEST
00000ab7: CALLVALUE
00000ab8: DUP1
00000ab9: ISZERO
00000aba: PUSH2 0x0ac2
00000abd: JUMPI
00000abe: PUSH1 0x00
00000ac0: DUP1
00000ac1: REVERT
00000ac2: JUMPDEST
00000ac3: POP
00000ac4: PUSH2 0x03c9
00000ac7: PUSH1 0x04
00000ac9: DUP1
00000aca: CALLDATASIZE
00000acb: SUB
00000acc: PUSH1 0x60
00000ace: DUP2
00000acf: LT
00000ad0: ISZERO
00000ad1: PUSH2 0x0ad9
00000ad4: JUMPI
00000ad5: PUSH1 0x00
00000ad7: DUP1
00000ad8: REVERT
00000ad9: JUMPDEST
00000ada: POP
00000adb: PUSH1 0x01
00000add: PUSH1 0x01
00000adf: PUSH1 0xa0
00000ae1: SHL
00000ae2: SUB
00000ae3: DUP2
00000ae4: CALLDATALOAD
00000ae5: AND
00000ae6: SWAP1
00000ae7: PUSH1 0x20
00000ae9: DUP2
00000aea: ADD
00000aeb: CALLDATALOAD
00000aec: SWAP1
00000aed: PUSH1 0x40
00000aef: ADD
00000af0: CALLDATALOAD
00000af1: PUSH2 0x200c
00000af4: JUMP
00000af5: JUMPDEST
00000af6: CALLVALUE
00000af7: DUP1
00000af8: ISZERO
00000af9: PUSH2 0x0b01
00000afc: JUMPI
00000afd: PUSH1 0x00
00000aff: DUP1
00000b00: REVERT
00000b01: JUMPDEST
00000b02: POP
00000b03: PUSH2 0x0624
00000b06: PUSH1 0x04
00000b08: DUP1
00000b09: CALLDATASIZE
00000b0a: SUB
00000b0b: PUSH1 0x20
00000b0d: DUP2
00000b0e: LT
00000b0f: ISZERO
00000b10: PUSH2 0x0b18
00000b13: JUMPI
00000b14: PUSH1 0x00
00000b16: DUP1
00000b17: REVERT
00000b18: JUMPDEST
00000b19: POP
00000b1a: CALLDATALOAD
00000b1b: PUSH1 0x01
00000b1d: PUSH1 0x01
00000b1f: PUSH1 0xa0
00000b21: SHL
00000b22: SUB
00000b23: AND
00000b24: PUSH2 0x2360
00000b27: JUMP
00000b28: JUMPDEST
00000b29: CALLVALUE
00000b2a: DUP1
00000b2b: ISZERO
00000b2c: PUSH2 0x0b34
00000b2f: JUMPI
00000b30: PUSH1 0x00
00000b32: DUP1
00000b33: REVERT
00000b34: JUMPDEST
00000b35: POP
00000b36: PUSH2 0x0624
00000b39: PUSH2 0x237f
00000b3c: JUMP
00000b3d: JUMPDEST
00000b3e: CALLVALUE
00000b3f: DUP1
00000b40: ISZERO
00000b41: PUSH2 0x0b49
00000b44: JUMPI
00000b45: PUSH1 0x00
00000b47: DUP1
00000b48: REVERT
00000b49: JUMPDEST
00000b4a: POP
00000b4b: PUSH2 0x0437
00000b4e: PUSH2 0x2385
00000b51: JUMP
00000b52: JUMPDEST
00000b53: CALLVALUE
00000b54: DUP1
00000b55: ISZERO
00000b56: PUSH2 0x0b5e
00000b59: JUMPI
00000b5a: PUSH1 0x00
00000b5c: DUP1
00000b5d: REVERT
00000b5e: JUMPDEST
00000b5f: POP
00000b60: PUSH2 0x0624
00000b63: PUSH2 0x2393
00000b66: JUMP
00000b67: JUMPDEST
00000b68: CALLVALUE
00000b69: DUP1
00000b6a: ISZERO
00000b6b: PUSH2 0x0b73
00000b6e: JUMPI
00000b6f: PUSH1 0x00
00000b71: DUP1
00000b72: REVERT
00000b73: JUMPDEST
00000b74: POP
00000b75: PUSH2 0x0624
00000b78: PUSH2 0x2399
00000b7b: JUMP
00000b7c: JUMPDEST
00000b7d: PUSH2 0x03c9
00000b80: PUSH1 0x04
00000b82: DUP1
00000b83: CALLDATASIZE
00000b84: SUB
00000b85: PUSH1 0x80
00000b87: DUP2
00000b88: LT
00000b89: ISZERO
00000b8a: PUSH2 0x0b92
00000b8d: JUMPI
00000b8e: PUSH1 0x00
00000b90: DUP1
00000b91: REVERT
00000b92: JUMPDEST
00000b93: POP
00000b94: DUP1
00000b95: CALLDATALOAD
00000b96: SWAP1
00000b97: PUSH1 0x20
00000b99: DUP2
00000b9a: ADD
00000b9b: CALLDATALOAD
00000b9c: SWAP1
00000b9d: PUSH1 0x01
00000b9f: PUSH1 0x01
00000ba1: PUSH1 0xa0
00000ba3: SHL
00000ba4: SUB
00000ba5: PUSH1 0x40
00000ba7: DUP3
00000ba8: ADD
00000ba9: CALLDATALOAD
00000baa: DUP2
00000bab: AND
00000bac: SWAP2
00000bad: PUSH1 0x60
00000baf: ADD
00000bb0: CALLDATALOAD
00000bb1: AND
00000bb2: PUSH2 0x239f
00000bb5: JUMP
00000bb6: JUMPDEST
00000bb7: CALLVALUE
00000bb8: DUP1
00000bb9: ISZERO
00000bba: PUSH2 0x0bc2
00000bbd: JUMPI
00000bbe: PUSH1 0x00
00000bc0: DUP1
00000bc1: REVERT
00000bc2: JUMPDEST
00000bc3: POP
00000bc4: PUSH2 0x0624
00000bc7: PUSH2 0x241f
00000bca: JUMP
00000bcb: JUMPDEST
00000bcc: CALLVALUE
00000bcd: DUP1
00000bce: ISZERO
00000bcf: PUSH2 0x0bd7
00000bd2: JUMPI
00000bd3: PUSH1 0x00
00000bd5: DUP1
00000bd6: REVERT
00000bd7: JUMPDEST
00000bd8: POP
00000bd9: PUSH2 0x0624
00000bdc: PUSH2 0x2425
00000bdf: JUMP
00000be0: JUMPDEST
00000be1: CALLVALUE
00000be2: DUP1
00000be3: ISZERO
00000be4: PUSH2 0x0bec
00000be7: JUMPI
00000be8: PUSH1 0x00
00000bea: DUP1
00000beb: REVERT
00000bec: JUMPDEST
00000bed: POP
00000bee: PUSH2 0x03c9
00000bf1: PUSH1 0x04
00000bf3: DUP1
00000bf4: CALLDATASIZE
00000bf5: SUB
00000bf6: PUSH1 0xe0
00000bf8: DUP2
00000bf9: LT
00000bfa: ISZERO
00000bfb: PUSH2 0x0c03
00000bfe: JUMPI
00000bff: PUSH1 0x00
00000c01: DUP1
00000c02: REVERT
00000c03: JUMPDEST
00000c04: DUP2
00000c05: CALLDATALOAD
00000c06: SWAP2
00000c07: PUSH1 0x20
00000c09: DUP2
00000c0a: ADD
00000c0b: CALLDATALOAD
00000c0c: SWAP2
00000c0d: PUSH1 0x40
00000c0f: DUP3
00000c10: ADD
00000c11: CALLDATALOAD
00000c12: SWAP2
00000c13: PUSH1 0x60
00000c15: DUP2
00000c16: ADD
00000c17: CALLDATALOAD
00000c18: SWAP2
00000c19: PUSH1 0x80
00000c1b: DUP3
00000c1c: ADD
00000c1d: CALLDATALOAD
00000c1e: SWAP2
00000c1f: PUSH1 0x01
00000c21: PUSH1 0x01
00000c23: PUSH1 0xa0
00000c25: SHL
00000c26: SUB
00000c27: PUSH1 0xa0
00000c29: DUP3
00000c2a: ADD
00000c2b: CALLDATALOAD
00000c2c: AND
00000c2d: SWAP2
00000c2e: DUP2
00000c2f: ADD
00000c30: SWAP1
00000c31: PUSH1 0xe0
00000c33: DUP2
00000c34: ADD
00000c35: PUSH1 0xc0
00000c37: DUP3
00000c38: ADD
00000c39: CALLDATALOAD
00000c3a: PUSH5 0x0100000000
00000c40: DUP2
00000c41: GT
00000c42: ISZERO
00000c43: PUSH2 0x0c4b
00000c46: JUMPI
00000c47: PUSH1 0x00
00000c49: DUP1
00000c4a: REVERT
00000c4b: JUMPDEST
00000c4c: DUP3
00000c4d: ADD
00000c4e: DUP4
00000c4f: PUSH1 0x20
00000c51: DUP3
00000c52: ADD
00000c53: GT
00000c54: ISZERO
00000c55: PUSH2 0x0c5d
00000c58: JUMPI
00000c59: PUSH1 0x00
00000c5b: DUP1
00000c5c: REVERT
00000c5d: JUMPDEST
00000c5e: DUP1
00000c5f: CALLDATALOAD
00000c60: SWAP1
00000c61: PUSH1 0x20
00000c63: ADD
00000c64: SWAP2
00000c65: DUP5
00000c66: PUSH1 0x01
00000c68: DUP4
00000c69: MUL
00000c6a: DUP5
00000c6b: ADD
00000c6c: GT
00000c6d: PUSH5 0x0100000000
00000c73: DUP4
00000c74: GT
00000c75: OR
00000c76: ISZERO
00000c77: PUSH2 0x0c7f
00000c7a: JUMPI
00000c7b: PUSH1 0x00
00000c7d: DUP1
00000c7e: REVERT
00000c7f: JUMPDEST
00000c80: SWAP2
00000c81: SWAP1
00000c82: DUP1
00000c83: DUP1
00000c84: PUSH1 0x1f
00000c86: ADD
00000c87: PUSH1 0x20
00000c89: DUP1
00000c8a: SWAP2
00000c8b: DIV
00000c8c: MUL
00000c8d: PUSH1 0x20
00000c8f: ADD
00000c90: PUSH1 0x40
00000c92: MLOAD
00000c93: SWAP1
00000c94: DUP2
00000c95: ADD
00000c96: PUSH1 0x40
00000c98: MSTORE
00000c99: DUP1
00000c9a: SWAP4
00000c9b: SWAP3
00000c9c: SWAP2
00000c9d: SWAP1
00000c9e: DUP2
00000c9f: DUP2
00000ca0: MSTORE
00000ca1: PUSH1 0x20
00000ca3: ADD
00000ca4: DUP4
00000ca5: DUP4
00000ca6: DUP1
00000ca7: DUP3
00000ca8: DUP5
00000ca9: CALLDATACOPY
00000caa: PUSH1 0x00
00000cac: SWAP3
00000cad: ADD
00000cae: SWAP2
00000caf: SWAP1
00000cb0: SWAP2
00000cb1: MSTORE
00000cb2: POP
00000cb3: SWAP3
00000cb4: SWAP6
00000cb5: POP
00000cb6: PUSH2 0x242b
00000cb9: SWAP5
00000cba: POP
00000cbb: POP
00000cbc: POP
00000cbd: POP
00000cbe: POP
00000cbf: JUMP
00000cc0: JUMPDEST
00000cc1: CALLVALUE
00000cc2: DUP1
00000cc3: ISZERO
00000cc4: PUSH2 0x0ccc
00000cc7: JUMPI
00000cc8: PUSH1 0x00
00000cca: DUP1
00000ccb: REVERT
00000ccc: JUMPDEST
00000ccd: POP
00000cce: PUSH2 0x03c9
00000cd1: PUSH1 0x04
00000cd3: DUP1
00000cd4: CALLDATASIZE
00000cd5: SUB
00000cd6: PUSH2 0x0140
00000cd9: DUP2
00000cda: LT
00000cdb: ISZERO
00000cdc: PUSH2 0x0ce4
00000cdf: JUMPI
00000ce0: PUSH1 0x00
00000ce2: DUP1
00000ce3: REVERT
00000ce4: JUMPDEST
00000ce5: DUP2
00000ce6: CALLDATALOAD
00000ce7: SWAP2
00000ce8: PUSH1 0x20
00000cea: DUP2
00000ceb: ADD
00000cec: CALLDATALOAD
00000ced: SWAP2
00000cee: PUSH1 0x40
00000cf0: DUP3
00000cf1: ADD
00000cf2: CALLDATALOAD
00000cf3: SWAP2
00000cf4: PUSH1 0x60
00000cf6: DUP2
00000cf7: ADD
00000cf8: CALLDATALOAD
00000cf9: SWAP2
00000cfa: PUSH1 0x80
00000cfc: DUP3
00000cfd: ADD
00000cfe: CALLDATALOAD
00000cff: SWAP2
00000d00: PUSH1 0xa0
00000d02: DUP2
00000d03: ADD
00000d04: CALLDATALOAD
00000d05: SWAP2
00000d06: PUSH1 0xc0
00000d08: DUP3
00000d09: ADD
00000d0a: CALLDATALOAD
00000d0b: SWAP2
00000d0c: PUSH1 0xe0
00000d0e: DUP2
00000d0f: ADD
00000d10: CALLDATALOAD
00000d11: SWAP2
00000d12: PUSH1 0x01
00000d14: PUSH1 0x01
00000d16: PUSH1 0xa0
00000d18: SHL
00000d19: SUB
00000d1a: PUSH2 0x0100
00000d1d: DUP4
00000d1e: ADD
00000d1f: CALLDATALOAD
00000d20: AND
00000d21: SWAP2
00000d22: SWAP1
00000d23: DUP2
00000d24: ADD
00000d25: SWAP1
00000d26: PUSH2 0x0140
00000d29: DUP2
00000d2a: ADD
00000d2b: PUSH2 0x0120
00000d2e: DUP3
00000d2f: ADD
00000d30: CALLDATALOAD
00000d31: PUSH5 0x0100000000
00000d37: DUP2
00000d38: GT
00000d39: ISZERO
00000d3a: PUSH2 0x0d42
00000d3d: JUMPI
00000d3e: PUSH1 0x00
00000d40: DUP1
00000d41: REVERT
00000d42: JUMPDEST
00000d43: DUP3
00000d44: ADD
00000d45: DUP4
00000d46: PUSH1 0x20
00000d48: DUP3
00000d49: ADD
00000d4a: GT
00000d4b: ISZERO
00000d4c: PUSH2 0x0d54
00000d4f: JUMPI
00000d50: PUSH1 0x00
00000d52: DUP1
00000d53: REVERT
00000d54: JUMPDEST
00000d55: DUP1
00000d56: CALLDATALOAD
00000d57: SWAP1
00000d58: PUSH1 0x20
00000d5a: ADD
00000d5b: SWAP2
00000d5c: DUP5
00000d5d: PUSH1 0x01
00000d5f: DUP4
00000d60: MUL
00000d61: DUP5
00000d62: ADD
00000d63: GT
00000d64: PUSH5 0x0100000000
00000d6a: DUP4
00000d6b: GT
00000d6c: OR
00000d6d: ISZERO
00000d6e: PUSH2 0x0d76
00000d71: JUMPI
00000d72: PUSH1 0x00
00000d74: DUP1
00000d75: REVERT
00000d76: JUMPDEST
00000d77: SWAP2
00000d78: SWAP1
00000d79: DUP1
00000d7a: DUP1
00000d7b: PUSH1 0x1f
00000d7d: ADD
00000d7e: PUSH1 0x20
00000d80: DUP1
00000d81: SWAP2
00000d82: DIV
00000d83: MUL
00000d84: PUSH1 0x20
00000d86: ADD
00000d87: PUSH1 0x40
00000d89: MLOAD
00000d8a: SWAP1
00000d8b: DUP2
00000d8c: ADD
00000d8d: PUSH1 0x40
00000d8f: MSTORE
00000d90: DUP1
00000d91: SWAP4
00000d92: SWAP3
00000d93: SWAP2
00000d94: SWAP1
00000d95: DUP2
00000d96: DUP2
00000d97: MSTORE
00000d98: PUSH1 0x20
00000d9a: ADD
00000d9b: DUP4
00000d9c: DUP4
00000d9d: DUP1
00000d9e: DUP3
00000d9f: DUP5
00000da0: CALLDATACOPY
00000da1: PUSH1 0x00
00000da3: SWAP3
00000da4: ADD
00000da5: SWAP2
00000da6: SWAP1
00000da7: SWAP2
00000da8: MSTORE
00000da9: POP
00000daa: SWAP3
00000dab: SWAP6
00000dac: POP
00000dad: PUSH2 0x256e
00000db0: SWAP5
00000db1: POP
00000db2: POP
00000db3: POP
00000db4: POP
00000db5: POP
00000db6: JUMP
00000db7: JUMPDEST
00000db8: CALLVALUE
00000db9: DUP1
00000dba: ISZERO
00000dbb: PUSH2 0x0dc3
00000dbe: JUMPI
00000dbf: PUSH1 0x00
00000dc1: DUP1
00000dc2: REVERT
00000dc3: JUMPDEST
00000dc4: POP
00000dc5: PUSH2 0x0624
00000dc8: PUSH2 0x2987
00000dcb: JUMP
00000dcc: JUMPDEST
00000dcd: CALLVALUE
00000dce: DUP1
00000dcf: ISZERO
00000dd0: PUSH2 0x0dd8
00000dd3: JUMPI
00000dd4: PUSH1 0x00
00000dd6: DUP1
00000dd7: REVERT
00000dd8: JUMPDEST
00000dd9: POP
00000dda: PUSH2 0x0460
00000ddd: PUSH2 0x298d
00000de0: JUMP
00000de1: JUMPDEST
00000de2: CALLVALUE
00000de3: DUP1
00000de4: ISZERO
00000de5: PUSH2 0x0ded
00000de8: JUMPI
00000de9: PUSH1 0x00
00000deb: DUP1
00000dec: REVERT
00000ded: JUMPDEST
00000dee: POP
00000def: PUSH2 0x0624
00000df2: PUSH2 0x29ee
00000df5: JUMP
00000df6: JUMPDEST
00000df7: CALLVALUE
00000df8: DUP1
00000df9: ISZERO
00000dfa: PUSH2 0x0e02
00000dfd: JUMPI
00000dfe: PUSH1 0x00
00000e00: DUP1
00000e01: REVERT
00000e02: JUMPDEST
00000e03: POP
00000e04: PUSH2 0x0437
00000e07: PUSH1 0x04
00000e09: DUP1
00000e0a: CALLDATASIZE
00000e0b: SUB
00000e0c: PUSH1 0x40
00000e0e: DUP2
00000e0f: LT
00000e10: ISZERO
00000e11: PUSH2 0x0e19
00000e14: JUMPI
00000e15: PUSH1 0x00
00000e17: DUP1
00000e18: REVERT
00000e19: JUMPDEST
00000e1a: POP
00000e1b: PUSH1 0x01
00000e1d: PUSH1 0x01
00000e1f: PUSH1 0xa0
00000e21: SHL
00000e22: SUB
00000e23: DUP2
00000e24: CALLDATALOAD
00000e25: AND
00000e26: SWAP1
00000e27: PUSH1 0x20
00000e29: ADD
00000e2a: CALLDATALOAD
00000e2b: PUSH2 0x29f4
00000e2e: JUMP
00000e2f: JUMPDEST
00000e30: CALLVALUE
00000e31: DUP1
00000e32: ISZERO
00000e33: PUSH2 0x0e3b
00000e36: JUMPI
00000e37: PUSH1 0x00
00000e39: DUP1
00000e3a: REVERT
00000e3b: JUMPDEST
00000e3c: POP
00000e3d: PUSH2 0x0624
00000e40: PUSH2 0x2a5c
00000e43: JUMP
00000e44: JUMPDEST
00000e45: CALLVALUE
00000e46: DUP1
00000e47: ISZERO
00000e48: PUSH2 0x0e50
00000e4b: JUMPI
00000e4c: PUSH1 0x00
00000e4e: DUP1
00000e4f: REVERT
00000e50: JUMPDEST
00000e51: POP
00000e52: PUSH2 0x0437
00000e55: PUSH1 0x04
00000e57: DUP1
00000e58: CALLDATASIZE
00000e59: SUB
00000e5a: PUSH1 0x40
00000e5c: DUP2
00000e5d: LT
00000e5e: ISZERO
00000e5f: PUSH2 0x0e67
00000e62: JUMPI
00000e63: PUSH1 0x00
00000e65: DUP1
00000e66: REVERT
00000e67: JUMPDEST
00000e68: POP
00000e69: PUSH1 0x01
00000e6b: PUSH1 0x01
00000e6d: PUSH1 0xa0
00000e6f: SHL
00000e70: SUB
00000e71: DUP2
00000e72: CALLDATALOAD
00000e73: AND
00000e74: SWAP1
00000e75: PUSH1 0x20
00000e77: ADD
00000e78: CALLDATALOAD
00000e79: PUSH2 0x2a62
00000e7c: JUMP
00000e7d: JUMPDEST
00000e7e: CALLVALUE
00000e7f: DUP1
00000e80: ISZERO
00000e81: PUSH2 0x0e89
00000e84: JUMPI
00000e85: PUSH1 0x00
00000e87: DUP1
00000e88: REVERT
00000e89: JUMPDEST
00000e8a: POP
00000e8b: PUSH2 0x0624
00000e8e: PUSH2 0x2a76
00000e91: JUMP
00000e92: JUMPDEST
00000e93: CALLVALUE
00000e94: DUP1
00000e95: ISZERO
00000e96: PUSH2 0x0e9e
00000e99: JUMPI
00000e9a: PUSH1 0x00
00000e9c: DUP1
00000e9d: REVERT
00000e9e: JUMPDEST
00000e9f: POP
00000ea0: PUSH2 0x0624
00000ea3: PUSH2 0x2a7c
00000ea6: JUMP
00000ea7: JUMPDEST
00000ea8: CALLVALUE
00000ea9: DUP1
00000eaa: ISZERO
00000eab: PUSH2 0x0eb3
00000eae: JUMPI
00000eaf: PUSH1 0x00
00000eb1: DUP1
00000eb2: REVERT
00000eb3: JUMPDEST
00000eb4: POP
00000eb5: PUSH2 0x0624
00000eb8: PUSH2 0x2a82
00000ebb: JUMP
00000ebc: JUMPDEST
00000ebd: CALLVALUE
00000ebe: DUP1
00000ebf: ISZERO
00000ec0: PUSH2 0x0ec8
00000ec3: JUMPI
00000ec4: PUSH1 0x00
00000ec6: DUP1
00000ec7: REVERT
00000ec8: JUMPDEST
00000ec9: POP
00000eca: PUSH2 0x03c9
00000ecd: PUSH1 0x04
00000ecf: DUP1
00000ed0: CALLDATASIZE
00000ed1: SUB
00000ed2: PUSH1 0x40
00000ed4: DUP2
00000ed5: LT
00000ed6: ISZERO
00000ed7: PUSH2 0x0edf
00000eda: JUMPI
00000edb: PUSH1 0x00
00000edd: DUP1
00000ede: REVERT
00000edf: JUMPDEST
00000ee0: DUP2
00000ee1: ADD
00000ee2: SWAP1
00000ee3: PUSH1 0x20
00000ee5: DUP2
00000ee6: ADD
00000ee7: DUP2
00000ee8: CALLDATALOAD
00000ee9: PUSH5 0x0100000000
00000eef: DUP2
00000ef0: GT
00000ef1: ISZERO
00000ef2: PUSH2 0x0efa
00000ef5: JUMPI
00000ef6: PUSH1 0x00
00000ef8: DUP1
00000ef9: REVERT
00000efa: JUMPDEST
00000efb: DUP3
00000efc: ADD
00000efd: DUP4
00000efe: PUSH1 0x20
00000f00: DUP3
00000f01: ADD
00000f02: GT
00000f03: ISZERO
00000f04: PUSH2 0x0f0c
00000f07: JUMPI
00000f08: PUSH1 0x00
00000f0a: DUP1
00000f0b: REVERT
00000f0c: JUMPDEST
00000f0d: DUP1
00000f0e: CALLDATALOAD
00000f0f: SWAP1
00000f10: PUSH1 0x20
00000f12: ADD
00000f13: SWAP2
00000f14: DUP5
00000f15: PUSH1 0x20
00000f17: DUP4
00000f18: MUL
00000f19: DUP5
00000f1a: ADD
00000f1b: GT
00000f1c: PUSH5 0x0100000000
00000f22: DUP4
00000f23: GT
00000f24: OR
00000f25: ISZERO
00000f26: PUSH2 0x0f2e
00000f29: JUMPI
00000f2a: PUSH1 0x00
00000f2c: DUP1
00000f2d: REVERT
00000f2e: JUMPDEST
00000f2f: SWAP2
00000f30: SWAP4
00000f31: SWAP1
00000f32: SWAP3
00000f33: SWAP1
00000f34: SWAP2
00000f35: PUSH1 0x20
00000f37: DUP2
00000f38: ADD
00000f39: SWAP1
00000f3a: CALLDATALOAD
00000f3b: PUSH5 0x0100000000
00000f41: DUP2
00000f42: GT
00000f43: ISZERO
00000f44: PUSH2 0x0f4c
00000f47: JUMPI
00000f48: PUSH1 0x00
00000f4a: DUP1
00000f4b: REVERT
00000f4c: JUMPDEST
00000f4d: DUP3
00000f4e: ADD
00000f4f: DUP4
00000f50: PUSH1 0x20
00000f52: DUP3
00000f53: ADD
00000f54: GT
00000f55: ISZERO
00000f56: PUSH2 0x0f5e
00000f59: JUMPI
00000f5a: PUSH1 0x00
00000f5c: DUP1
00000f5d: REVERT
00000f5e: JUMPDEST
00000f5f: DUP1
00000f60: CALLDATALOAD
00000f61: SWAP1
00000f62: PUSH1 0x20
00000f64: ADD
00000f65: SWAP2
00000f66: DUP5
00000f67: PUSH1 0x20
00000f69: DUP4
00000f6a: MUL
00000f6b: DUP5
00000f6c: ADD
00000f6d: GT
00000f6e: PUSH5 0x0100000000
00000f74: DUP4
00000f75: GT
00000f76: OR
00000f77: ISZERO
00000f78: PUSH2 0x0f80
00000f7b: JUMPI
00000f7c: PUSH1 0x00
00000f7e: DUP1
00000f7f: REVERT
00000f80: JUMPDEST
00000f81: POP
00000f82: SWAP1
00000f83: SWAP3
00000f84: POP
00000f85: SWAP1
00000f86: POP
00000f87: PUSH2 0x2a88
00000f8a: JUMP
00000f8b: JUMPDEST
00000f8c: CALLVALUE
00000f8d: DUP1
00000f8e: ISZERO
00000f8f: PUSH2 0x0f97
00000f92: JUMPI
00000f93: PUSH1 0x00
00000f95: DUP1
00000f96: REVERT
00000f97: JUMPDEST
00000f98: POP
00000f99: PUSH2 0x0fa0
00000f9c: PUSH2 0x2afb
00000f9f: JUMP
00000fa0: JUMPDEST
00000fa1: PUSH1 0x40
00000fa3: DUP1
00000fa4: MLOAD
00000fa5: PUSH1 0x20
00000fa7: DUP1
00000fa8: DUP3
00000fa9: MSTORE
00000faa: DUP4
00000fab: MLOAD
00000fac: DUP2
00000fad: DUP4
00000fae: ADD
00000faf: MSTORE
00000fb0: DUP4
00000fb1: MLOAD
00000fb2: SWAP2
00000fb3: SWAP3
00000fb4: DUP4
00000fb5: SWAP3
00000fb6: SWAP1
00000fb7: DUP4
00000fb8: ADD
00000fb9: SWAP2
00000fba: DUP6
00000fbb: DUP2
00000fbc: ADD
00000fbd: SWAP2
00000fbe: MUL
00000fbf: DUP1
00000fc0: DUP4
00000fc1: DUP4
00000fc2: PUSH1 0x00
00000fc4: JUMPDEST
00000fc5: DUP4
00000fc6: DUP2
00000fc7: LT
00000fc8: ISZERO
00000fc9: PUSH2 0x0fdc
00000fcc: JUMPI
00000fcd: DUP2
00000fce: DUP2
00000fcf: ADD
00000fd0: MLOAD
00000fd1: DUP4
00000fd2: DUP3
00000fd3: ADD
00000fd4: MSTORE
00000fd5: PUSH1 0x20
00000fd7: ADD
00000fd8: PUSH2 0x0fc4
00000fdb: JUMP
00000fdc: JUMPDEST
00000fdd: POP
00000fde: POP
00000fdf: POP
00000fe0: POP
00000fe1: SWAP1
00000fe2: POP
00000fe3: ADD
00000fe4: SWAP3
00000fe5: POP
00000fe6: POP
00000fe7: POP
00000fe8: PUSH1 0x40
00000fea: MLOAD
00000feb: DUP1
00000fec: SWAP2
00000fed: SUB
00000fee: SWAP1
00000fef: RETURN
00000ff0: JUMPDEST
00000ff1: CALLVALUE
00000ff2: DUP1
00000ff3: ISZERO
00000ff4: PUSH2 0x0ffc
00000ff7: JUMPI
00000ff8: PUSH1 0x00
00000ffa: DUP1
00000ffb: REVERT
00000ffc: JUMPDEST
00000ffd: POP
00000ffe: PUSH2 0x0fa0
00001001: PUSH2 0x2b5c
00001004: JUMP
00001005: JUMPDEST
00001006: CALLVALUE
00001007: DUP1
00001008: ISZERO
00001009: PUSH2 0x1011
0000100c: JUMPI
0000100d: PUSH1 0x00
0000100f: DUP1
00001010: REVERT
00001011: JUMPDEST
00001012: POP
00001013: PUSH2 0x0624
00001016: PUSH2 0x2bbc
00001019: JUMP
0000101a: JUMPDEST
0000101b: CALLVALUE
0000101c: DUP1
0000101d: ISZERO
0000101e: PUSH2 0x1026
00001021: JUMPI
00001022: PUSH1 0x00
00001024: DUP1
00001025: REVERT
00001026: JUMPDEST
00001027: POP
00001028: PUSH2 0x0624
0000102b: PUSH2 0x2bc2
0000102e: JUMP
0000102f: JUMPDEST
00001030: CALLVALUE
00001031: DUP1
00001032: ISZERO
00001033: PUSH2 0x103b
00001036: JUMPI
00001037: PUSH1 0x00
00001039: DUP1
0000103a: REVERT
0000103b: JUMPDEST
0000103c: POP
0000103d: PUSH2 0x0624
00001040: PUSH1 0x04
00001042: DUP1
00001043: CALLDATASIZE
00001044: SUB
00001045: PUSH1 0x20
00001047: DUP2
00001048: LT
00001049: ISZERO
0000104a: PUSH2 0x1052
0000104d: JUMPI
0000104e: PUSH1 0x00
00001050: DUP1
00001051: REVERT
00001052: JUMPDEST
00001053: POP
00001054: CALLDATALOAD
00001055: PUSH1 0x01
00001057: PUSH1 0x01
00001059: PUSH1 0xa0
0000105b: SHL
0000105c: SUB
0000105d: AND
0000105e: PUSH2 0x2bc8
00001061: JUMP
00001062: JUMPDEST
00001063: CALLVALUE
00001064: DUP1
00001065: ISZERO
00001066: PUSH2 0x106e
00001069: JUMPI
0000106a: PUSH1 0x00
0000106c: DUP1
0000106d: REVERT
0000106e: JUMPDEST
0000106f: POP
00001070: PUSH2 0x03c9
00001073: PUSH1 0x04
00001075: DUP1
00001076: CALLDATASIZE
00001077: SUB
00001078: PUSH2 0x0140
0000107b: DUP2
0000107c: LT
0000107d: ISZERO
0000107e: PUSH2 0x1086
00001081: JUMPI
00001082: PUSH1 0x00
00001084: DUP1
00001085: REVERT
00001086: JUMPDEST
00001087: DUP2
00001088: CALLDATALOAD
00001089: SWAP2
0000108a: PUSH1 0x20
0000108c: DUP2
0000108d: ADD
0000108e: CALLDATALOAD
0000108f: SWAP2
00001090: PUSH1 0x40
00001092: DUP3
00001093: ADD
00001094: CALLDATALOAD
00001095: SWAP2
00001096: PUSH1 0x60
00001098: DUP2
00001099: ADD
0000109a: CALLDATALOAD
0000109b: SWAP2
0000109c: PUSH1 0x80
0000109e: DUP3
0000109f: ADD
000010a0: CALLDATALOAD
000010a1: SWAP2
000010a2: PUSH1 0xa0
000010a4: DUP2
000010a5: ADD
000010a6: CALLDATALOAD
000010a7: SWAP2
000010a8: PUSH1 0x01
000010aa: PUSH1 0x01
000010ac: PUSH1 0xa0
000010ae: SHL
000010af: SUB
000010b0: PUSH1 0xc0
000010b2: DUP4
000010b3: ADD
000010b4: CALLDATALOAD
000010b5: DUP2
000010b6: AND
000010b7: SWAP3
000010b8: PUSH1 0xe0
000010ba: DUP2
000010bb: ADD
000010bc: CALLDATALOAD
000010bd: SWAP3
000010be: PUSH2 0x0100
000010c1: DUP3
000010c2: ADD
000010c3: CALLDATALOAD
000010c4: SWAP1
000010c5: SWAP3
000010c6: AND
000010c7: SWAP2
000010c8: DUP2
000010c9: ADD
000010ca: SWAP1
000010cb: PUSH2 0x0140
000010ce: DUP2
000010cf: ADD
000010d0: PUSH2 0x0120
000010d3: DUP3
000010d4: ADD
000010d5: CALLDATALOAD
000010d6: PUSH5 0x0100000000
000010dc: DUP2
000010dd: GT
000010de: ISZERO
000010df: PUSH2 0x10e7
000010e2: JUMPI
000010e3: PUSH1 0x00
000010e5: DUP1
000010e6: REVERT
000010e7: JUMPDEST
000010e8: DUP3
000010e9: ADD
000010ea: DUP4
000010eb: PUSH1 0x20
000010ed: DUP3
000010ee: ADD
000010ef: GT
000010f0: ISZERO
000010f1: PUSH2 0x10f9
000010f4: JUMPI
000010f5: PUSH1 0x00
000010f7: DUP1
000010f8: REVERT
000010f9: JUMPDEST
000010fa: DUP1
000010fb: CALLDATALOAD
000010fc: SWAP1
000010fd: PUSH1 0x20
000010ff: ADD
00001100: SWAP2
00001101: DUP5
00001102: PUSH1 0x01
00001104: DUP4
00001105: MUL
00001106: DUP5
00001107: ADD
00001108: GT
00001109: PUSH5 0x0100000000
0000110f: DUP4
00001110: GT
00001111: OR
00001112: ISZERO
00001113: PUSH2 0x111b
00001116: JUMPI
00001117: PUSH1 0x00
00001119: DUP1
0000111a: REVERT
0000111b: JUMPDEST
0000111c: SWAP2
0000111d: SWAP1
0000111e: DUP1
0000111f: DUP1
00001120: PUSH1 0x1f
00001122: ADD
00001123: PUSH1 0x20
00001125: DUP1
00001126: SWAP2
00001127: DIV
00001128: MUL
00001129: PUSH1 0x20
0000112b: ADD
0000112c: PUSH1 0x40
0000112e: MLOAD
0000112f: SWAP1
00001130: DUP2
00001131: ADD
00001132: PUSH1 0x40
00001134: MSTORE
00001135: DUP1
00001136: SWAP4
00001137: SWAP3
00001138: SWAP2
00001139: SWAP1
0000113a: DUP2
0000113b: DUP2
0000113c: MSTORE
0000113d: PUSH1 0x20
0000113f: ADD
00001140: DUP4
00001141: DUP4
00001142: DUP1
00001143: DUP3
00001144: DUP5
00001145: CALLDATACOPY
00001146: PUSH1 0x00
00001148: SWAP3
00001149: ADD
0000114a: SWAP2
0000114b: SWAP1
0000114c: SWAP2
0000114d: MSTORE
0000114e: POP
0000114f: SWAP3
00001150: SWAP6
00001151: POP
00001152: PUSH2 0x2d44
00001155: SWAP5
00001156: POP
00001157: POP
00001158: POP
00001159: POP
0000115a: POP
0000115b: JUMP
0000115c: JUMPDEST
0000115d: CALLVALUE
0000115e: DUP1
0000115f: ISZERO
00001160: PUSH2 0x1168
00001163: JUMPI
00001164: PUSH1 0x00
00001166: DUP1
00001167: REVERT
00001168: JUMPDEST
00001169: POP
0000116a: PUSH2 0x0624
0000116d: PUSH2 0x2eea
00001170: JUMP
00001171: JUMPDEST
00001172: CALLVALUE
00001173: DUP1
00001174: ISZERO
00001175: PUSH2 0x117d
00001178: JUMPI
00001179: PUSH1 0x00
0000117b: DUP1
0000117c: REVERT
0000117d: JUMPDEST
0000117e: POP
0000117f: PUSH2 0x03c9
00001182: PUSH1 0x04
00001184: DUP1
00001185: CALLDATASIZE
00001186: SUB
00001187: PUSH2 0x0160
0000118a: DUP2
0000118b: LT
0000118c: ISZERO
0000118d: PUSH2 0x1195
00001190: JUMPI
00001191: PUSH1 0x00
00001193: DUP1
00001194: REVERT
00001195: JUMPDEST
00001196: DUP2
00001197: CALLDATALOAD
00001198: SWAP2
00001199: PUSH1 0x20
0000119b: DUP2
0000119c: ADD
0000119d: CALLDATALOAD
0000119e: SWAP2
0000119f: PUSH1 0x40
000011a1: DUP3
000011a2: ADD
000011a3: CALLDATALOAD
000011a4: SWAP2
000011a5: PUSH1 0x60
000011a7: DUP2
000011a8: ADD
000011a9: CALLDATALOAD
000011aa: SWAP2
000011ab: PUSH1 0x80
000011ad: DUP3
000011ae: ADD
000011af: CALLDATALOAD
000011b0: ISZERO
000011b1: ISZERO
000011b2: SWAP2
000011b3: PUSH1 0x01
000011b5: PUSH1 0x01
000011b7: PUSH1 0xa0
000011b9: SHL
000011ba: SUB
000011bb: PUSH1 0xa0
000011bd: DUP3
000011be: ADD
000011bf: CALLDATALOAD
000011c0: DUP2
000011c1: AND
000011c2: SWAP3
000011c3: PUSH1 0xc0
000011c5: DUP4
000011c6: ADD
000011c7: CALLDATALOAD
000011c8: SWAP3
000011c9: PUSH1 0xe0
000011cb: DUP2
000011cc: ADD
000011cd: CALLDATALOAD
000011ce: SWAP3
000011cf: PUSH2 0x0100
000011d2: DUP3
000011d3: ADD
000011d4: CALLDATALOAD
000011d5: SWAP3
000011d6: PUSH2 0x0120
000011d9: DUP4
000011da: ADD
000011db: CALLDATALOAD
000011dc: SWAP1
000011dd: SWAP2
000011de: AND
000011df: SWAP2
000011e0: SWAP1
000011e1: DUP2
000011e2: ADD
000011e3: SWAP1
000011e4: PUSH2 0x0160
000011e7: DUP2
000011e8: ADD
000011e9: PUSH2 0x0140
000011ec: DUP3
000011ed: ADD
000011ee: CALLDATALOAD
000011ef: PUSH5 0x0100000000
000011f5: DUP2
000011f6: GT
000011f7: ISZERO
000011f8: PUSH2 0x1200
000011fb: JUMPI
000011fc: PUSH1 0x00
000011fe: DUP1
000011ff: REVERT
00001200: JUMPDEST
00001201: DUP3
00001202: ADD
00001203: DUP4
00001204: PUSH1 0x20
00001206: DUP3
00001207: ADD
00001208: GT
00001209: ISZERO
0000120a: PUSH2 0x1212
0000120d: JUMPI
0000120e: PUSH1 0x00
00001210: DUP1
00001211: REVERT
00001212: JUMPDEST
00001213: DUP1
00001214: CALLDATALOAD
00001215: SWAP1
00001216: PUSH1 0x20
00001218: ADD
00001219: SWAP2
0000121a: DUP5
0000121b: PUSH1 0x01
0000121d: DUP4
0000121e: MUL
0000121f: DUP5
00001220: ADD
00001221: GT
00001222: PUSH5 0x0100000000
00001228: DUP4
00001229: GT
0000122a: OR
0000122b: ISZERO
0000122c: PUSH2 0x1234
0000122f: JUMPI
00001230: PUSH1 0x00
00001232: DUP1
00001233: REVERT
00001234: JUMPDEST
00001235: SWAP2
00001236: SWAP1
00001237: DUP1
00001238: DUP1
00001239: PUSH1 0x1f
0000123b: ADD
0000123c: PUSH1 0x20
0000123e: DUP1
0000123f: SWAP2
00001240: DIV
00001241: MUL
00001242: PUSH1 0x20
00001244: ADD
00001245: PUSH1 0x40
00001247: MLOAD
00001248: SWAP1
00001249: DUP2
0000124a: ADD
0000124b: PUSH1 0x40
0000124d: MSTORE
0000124e: DUP1
0000124f: SWAP4
00001250: SWAP3
00001251: SWAP2
00001252: SWAP1
00001253: DUP2
00001254: DUP2
00001255: MSTORE
00001256: PUSH1 0x20
00001258: ADD
00001259: DUP4
0000125a: DUP4
0000125b: DUP1
0000125c: DUP3
0000125d: DUP5
0000125e: CALLDATACOPY
0000125f: PUSH1 0x00
00001261: SWAP3
00001262: ADD
00001263: SWAP2
00001264: SWAP1
00001265: SWAP2
00001266: MSTORE
00001267: POP
00001268: SWAP3
00001269: SWAP6
0000126a: POP
0000126b: PUSH2 0x2ef0
0000126e: SWAP5
0000126f: POP
00001270: POP
00001271: POP
00001272: POP
00001273: POP
00001274: JUMP
00001275: JUMPDEST
00001276: CALLVALUE
00001277: DUP1
00001278: ISZERO
00001279: PUSH2 0x1281
0000127c: JUMPI
0000127d: PUSH1 0x00
0000127f: DUP1
00001280: REVERT
00001281: JUMPDEST
00001282: POP
00001283: PUSH2 0x0624
00001286: PUSH2 0x3011
00001289: JUMP
0000128a: JUMPDEST
0000128b: CALLVALUE
0000128c: DUP1
0000128d: ISZERO
0000128e: PUSH2 0x1296
00001291: JUMPI
00001292: PUSH1 0x00
00001294: DUP1
00001295: REVERT
00001296: JUMPDEST
00001297: POP
00001298: PUSH2 0x03c9
0000129b: PUSH1 0x04
0000129d: DUP1
0000129e: CALLDATASIZE
0000129f: SUB
000012a0: PUSH1 0xa0
000012a2: DUP2
000012a3: LT
000012a4: ISZERO
000012a5: PUSH2 0x12ad
000012a8: JUMPI
000012a9: PUSH1 0x00
000012ab: DUP1
000012ac: REVERT
000012ad: JUMPDEST
000012ae: POP
000012af: DUP1
000012b0: CALLDATALOAD
000012b1: SWAP1
000012b2: PUSH1 0x20
000012b4: DUP2
000012b5: ADD
000012b6: CALLDATALOAD
000012b7: SWAP1
000012b8: PUSH1 0x01
000012ba: PUSH1 0x01
000012bc: PUSH1 0xa0
000012be: SHL
000012bf: SUB
000012c0: PUSH1 0x40
000012c2: DUP3
000012c3: ADD
000012c4: CALLDATALOAD
000012c5: DUP2
000012c6: AND
000012c7: SWAP2
000012c8: PUSH1 0x60
000012ca: DUP2
000012cb: ADD
000012cc: CALLDATALOAD
000012cd: ISZERO
000012ce: ISZERO
000012cf: SWAP2
000012d0: PUSH1 0x80
000012d2: SWAP1
000012d3: SWAP2
000012d4: ADD
000012d5: CALLDATALOAD
000012d6: AND
000012d7: PUSH2 0x3017
000012da: JUMP
000012db: JUMPDEST
000012dc: CALLVALUE
000012dd: DUP1
000012de: ISZERO
000012df: PUSH2 0x12e7
000012e2: JUMPI
000012e3: PUSH1 0x00
000012e5: DUP1
000012e6: REVERT
000012e7: JUMPDEST
000012e8: POP
000012e9: PUSH2 0x0624
000012ec: PUSH1 0x04
000012ee: DUP1
000012ef: CALLDATASIZE
000012f0: SUB
000012f1: PUSH1 0x40
000012f3: DUP2
000012f4: LT
000012f5: ISZERO
000012f6: PUSH2 0x12fe
000012f9: JUMPI
000012fa: PUSH1 0x00
000012fc: DUP1
000012fd: REVERT
000012fe: JUMPDEST
000012ff: POP
00001300: PUSH1 0x01
00001302: PUSH1 0x01
00001304: PUSH1 0xa0
00001306: SHL
00001307: SUB
00001308: DUP2
00001309: CALLDATALOAD
0000130a: DUP2
0000130b: AND
0000130c: SWAP2
0000130d: PUSH1 0x20
0000130f: ADD
00001310: CALLDATALOAD
00001311: AND
00001312: PUSH2 0x311f
00001315: JUMP
00001316: JUMPDEST
00001317: CALLVALUE
00001318: DUP1
00001319: ISZERO
0000131a: PUSH2 0x1322
0000131d: JUMPI
0000131e: PUSH1 0x00
00001320: DUP1
00001321: REVERT
00001322: JUMPDEST
00001323: POP
00001324: PUSH2 0x0624
00001327: PUSH2 0x314a
0000132a: JUMP
0000132b: JUMPDEST
0000132c: CALLVALUE
0000132d: DUP1
0000132e: ISZERO
0000132f: PUSH2 0x1337
00001332: JUMPI
00001333: PUSH1 0x00
00001335: DUP1
00001336: REVERT
00001337: JUMPDEST
00001338: POP
00001339: PUSH2 0x03e8
0000133c: PUSH2 0x3150
0000133f: JUMP
00001340: JUMPDEST
00001341: CALLVALUE
00001342: DUP1
00001343: ISZERO
00001344: PUSH2 0x134c
00001347: JUMPI
00001348: PUSH1 0x00
0000134a: DUP1
0000134b: REVERT
0000134c: JUMPDEST
0000134d: POP
0000134e: PUSH2 0x03e8
00001351: PUSH2 0x315f
00001354: JUMP
00001355: JUMPDEST
00001356: PUSH2 0x135d
00001359: PUSH2 0x136d
0000135c: JUMP
0000135d: JUMPDEST
0000135e: PUSH2 0x136d
00001361: PUSH2 0x1368
00001364: PUSH2 0x316e
00001367: JUMP
00001368: JUMPDEST
00001369: PUSH2 0x3236
0000136c: JUMP
0000136d: JUMPDEST
0000136e: JUMP
0000136f: JUMPDEST
00001370: PUSH1 0x69
00001372: SLOAD
00001373: PUSH1 0x01
00001375: PUSH1 0x01
00001377: PUSH1 0xa0
00001379: SHL
0000137a: SUB
0000137b: AND
0000137c: DUP2
0000137d: JUMP
0000137e: JUMPDEST
0000137f: PUSH1 0x82
00001381: PUSH1 0x20
00001383: MSTORE
00001384: PUSH1 0x00
00001386: SWAP1
00001387: DUP2
00001388: MSTORE
00001389: PUSH1 0x40
0000138b: SWAP1
0000138c: KECCAK256
0000138d: SLOAD
0000138e: PUSH1 0xff
00001390: AND
00001391: DUP2
00001392: JUMP
00001393: JUMPDEST
00001394: PUSH1 0x36
00001396: DUP1
00001397: SLOAD
00001398: PUSH1 0x40
0000139a: DUP1
0000139b: MLOAD
0000139c: PUSH1 0x20
0000139e: PUSH1 0x1f
000013a0: PUSH1 0x02
000013a2: PUSH1 0x00
000013a4: NOT
000013a5: PUSH2 0x0100
000013a8: PUSH1 0x01
000013aa: DUP9
000013ab: AND
000013ac: ISZERO
000013ad: MUL
000013ae: ADD
000013af: SWAP1
000013b0: SWAP6
000013b1: AND
000013b2: SWAP5
000013b3: SWAP1
000013b4: SWAP5
000013b5: DIV
000013b6: SWAP4
000013b7: DUP5
000013b8: ADD
000013b9: DUP2
000013ba: SWAP1
000013bb: DIV
000013bc: DUP2
000013bd: MUL
000013be: DUP3
000013bf: ADD
000013c0: DUP2
000013c1: ADD
000013c2: SWAP1
000013c3: SWAP3
000013c4: MSTORE
000013c5: DUP3
000013c6: DUP2
000013c7: MSTORE
000013c8: PUSH1 0x60
000013ca: SWAP4
000013cb: SWAP1
000013cc: SWAP3
000013cd: SWAP1
000013ce: SWAP2
000013cf: DUP4
000013d0: ADD
000013d1: DUP3
000013d2: DUP3
000013d3: DUP1
000013d4: ISZERO
000013d5: PUSH2 0x141f
000013d8: JUMPI
000013d9: DUP1
000013da: PUSH1 0x1f
000013dc: LT
000013dd: PUSH2 0x13f4
000013e0: JUMPI
000013e1: PUSH2 0x0100
000013e4: DUP1
000013e5: DUP4
000013e6: SLOAD
000013e7: DIV
000013e8: MUL
000013e9: DUP4
000013ea: MSTORE
000013eb: SWAP2
000013ec: PUSH1 0x20
000013ee: ADD
000013ef: SWAP2
000013f0: PUSH2 0x141f
000013f3: JUMP
000013f4: JUMPDEST
000013f5: DUP3
000013f6: ADD
000013f7: SWAP2
000013f8: SWAP1
000013f9: PUSH1 0x00
000013fb: MSTORE
000013fc: PUSH1 0x20
000013fe: PUSH1 0x00
00001400: KECCAK256
00001401: SWAP1
00001402: JUMPDEST
00001403: DUP2
00001404: SLOAD
00001405: DUP2
00001406: MSTORE
00001407: SWAP1
00001408: PUSH1 0x01
0000140a: ADD
0000140b: SWAP1
0000140c: PUSH1 0x20
0000140e: ADD
0000140f: DUP1
00001410: DUP4
00001411: GT
00001412: PUSH2 0x1402
00001415: JUMPI
00001416: DUP3
00001417: SWAP1
00001418: SUB
00001419: PUSH1 0x1f
0000141b: AND
0000141c: DUP3
0000141d: ADD
0000141e: SWAP2
0000141f: JUMPDEST
00001420: POP
00001421: POP
00001422: POP
00001423: POP
00001424: POP
00001425: SWAP1
00001426: POP
00001427: JUMPDEST
00001428: SWAP1
00001429: JUMP
0000142a: JUMPDEST
0000142b: PUSH1 0x00
0000142d: PUSH2 0x143e
00001430: PUSH2 0x1437
00001433: PUSH2 0x325a
00001436: JUMP
00001437: JUMPDEST
00001438: DUP5
00001439: DUP5
0000143a: PUSH2 0x325e
0000143d: JUMP
0000143e: JUMPDEST
0000143f: POP
00001440: PUSH1 0x01
00001442: JUMPDEST
00001443: SWAP3
00001444: SWAP2
00001445: POP
00001446: POP
00001447: JUMP
00001448: JUMPDEST
00001449: PUSH1 0x92
0000144b: SLOAD
0000144c: PUSH1 0xff
0000144e: AND
0000144f: DUP2
00001450: JUMP
00001451: JUMPDEST
00001452: PUSH1 0x90
00001454: SLOAD
00001455: PUSH1 0x00
00001457: SWAP1
00001458: PUSH1 0x01
0000145a: PUSH1 0x01
0000145c: PUSH1 0xa0
0000145e: SHL
0000145f: SUB
00001460: AND
00001461: PUSH2 0x146a
00001464: DUP5
00001465: DUP5
00001466: PUSH2 0x334a
00001469: JUMP
0000146a: JUMPDEST
0000146b: PUSH1 0x01
0000146d: PUSH1 0x01
0000146f: PUSH1 0xa0
00001471: SHL
00001472: SUB
00001473: AND
00001474: EQ
00001475: DUP1
00001476: ISZERO
00001477: PUSH2 0x148a
0000147a: JUMPI
0000147b: POP
0000147c: PUSH1 0x90
0000147e: SLOAD
0000147f: PUSH1 0x01
00001481: PUSH1 0x01
00001483: PUSH1 0xa0
00001485: SHL
00001486: SUB
00001487: AND
00001488: ISZERO
00001489: ISZERO
0000148a: JUMPDEST
0000148b: PUSH2 0x1495
0000148e: JUMPI
0000148f: PUSH1 0x00
00001491: PUSH2 0x149e
00001494: JUMP
00001495: JUMPDEST
00001496: PUSH4 0x0b135d3f
0000149b: PUSH1 0xe1
0000149d: SHL
0000149e: JUMPDEST
0000149f: SWAP4
000014a0: SWAP3
000014a1: POP
000014a2: POP
000014a3: POP
000014a4: JUMP
000014a5: JUMPDEST
000014a6: PUSH1 0x85
000014a8: SLOAD
000014a9: PUSH1 0xff
000014ab: AND
000014ac: DUP2
000014ad: JUMP
000014ae: JUMPDEST
000014af: PUSH1 0x35
000014b1: SLOAD
000014b2: SWAP1
000014b3: JUMP
000014b4: JUMPDEST
000014b5: PUSH1 0x00
000014b7: PUSH2 0x14c1
000014ba: DUP5
000014bb: DUP5
000014bc: DUP5
000014bd: PUSH2 0x33ca
000014c0: JUMP
000014c1: JUMPDEST
000014c2: PUSH2 0x1531
000014c5: DUP5
000014c6: PUSH2 0x14cd
000014c9: PUSH2 0x325a
000014cc: JUMP
000014cd: JUMPDEST
000014ce: PUSH2 0x152c
000014d1: DUP6
000014d2: PUSH1 0x40
000014d4: MLOAD
000014d5: DUP1
000014d6: PUSH1 0x60
000014d8: ADD
000014d9: PUSH1 0x40
000014db: MSTORE
000014dc: DUP1
000014dd: PUSH1 0x28
000014df: DUP2
000014e0: MSTORE
000014e1: PUSH1 0x20
000014e3: ADD
000014e4: PUSH2 0x5b13
000014e7: PUSH1 0x28
000014e9: SWAP2
000014ea: CODECOPY
000014eb: PUSH1 0x01
000014ed: PUSH1 0x01
000014ef: PUSH1 0xa0
000014f1: SHL
000014f2: SUB
000014f3: DUP11
000014f4: AND
000014f5: PUSH1 0x00
000014f7: SWAP1
000014f8: DUP2
000014f9: MSTORE
000014fa: PUSH1 0x34
000014fc: PUSH1 0x20
000014fe: MSTORE
000014ff: PUSH1 0x40
00001501: DUP2
00001502: KECCAK256
00001503: SWAP1
00001504: PUSH2 0x150b
00001507: PUSH2 0x325a
0000150a: JUMP
0000150b: JUMPDEST
0000150c: PUSH1 0x01
0000150e: PUSH1 0x01
00001510: PUSH1 0xa0
00001512: SHL
00001513: SUB
00001514: AND
00001515: DUP2
00001516: MSTORE
00001517: PUSH1 0x20
00001519: DUP2
0000151a: ADD
0000151b: SWAP2
0000151c: SWAP1
0000151d: SWAP2
0000151e: MSTORE
0000151f: PUSH1 0x40
00001521: ADD
00001522: PUSH1 0x00
00001524: KECCAK256
00001525: SLOAD
00001526: SWAP2
00001527: SWAP1
00001528: PUSH2 0x3527
0000152b: JUMP
0000152c: JUMPDEST
0000152d: PUSH2 0x325e
00001530: JUMP
00001531: JUMPDEST
00001532: POP
00001533: PUSH1 0x01
00001535: SWAP4
00001536: SWAP3
00001537: POP
00001538: POP
00001539: POP
0000153a: JUMP
0000153b: JUMPDEST
0000153c: PUSH1 0x7d
0000153e: SLOAD
0000153f: DUP2
00001540: JUMP
00001541: JUMPDEST
00001542: PUSH1 0x02
00001544: PUSH1 0x65
00001546: SLOAD
00001547: EQ
00001548: ISZERO
00001549: PUSH2 0x1599
0000154c: JUMPI
0000154d: PUSH1 0x40
0000154f: DUP1
00001550: MLOAD
00001551: PUSH3 0x461bcd
00001555: PUSH1 0xe5
00001557: SHL
00001558: DUP2
00001559: MSTORE
0000155a: PUSH1 0x20
0000155c: PUSH1 0x04
0000155e: DUP3
0000155f: ADD
00001560: MSTORE
00001561: PUSH1 0x1f
00001563: PUSH1 0x24
00001565: DUP3
00001566: ADD
00001567: MSTORE
00001568: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00
00001589: PUSH1 0x44
0000158b: DUP3
0000158c: ADD
0000158d: MSTORE
0000158e: SWAP1
0000158f: MLOAD
00001590: SWAP1
00001591: DUP2
00001592: SWAP1
00001593: SUB
00001594: PUSH1 0x64
00001596: ADD
00001597: SWAP1
00001598: REVERT
00001599: JUMPDEST
0000159a: PUSH1 0x02
0000159c: PUSH1 0x65
0000159e: SSTORE
0000159f: PUSH2 0x15a8
000015a2: DUP5
000015a3: DUP9
000015a4: PUSH2 0x35be
000015a7: JUMP
000015a8: JUMPDEST
000015a9: PUSH1 0x40
000015ab: DUP1
000015ac: MLOAD
000015ad: PUSH32 0xd29d500304178a7a55901b6b67f2f14762edc14de19f872f4c0f68dd2ecdc136
000015ce: PUSH1 0x20
000015d0: DUP1
000015d1: DUP4
000015d2: ADD
000015d3: SWAP2
000015d4: SWAP1
000015d5: SWAP2
000015d6: MSTORE
000015d7: ADDRESS
000015d8: DUP3
000015d9: DUP5
000015da: ADD
000015db: MSTORE
000015dc: PUSH1 0x60
000015de: DUP3
000015df: ADD
000015e0: DUP14
000015e1: SWAP1
000015e2: MSTORE
000015e3: PUSH1 0x80
000015e5: DUP3
000015e6: ADD
000015e7: DUP13
000015e8: SWAP1
000015e9: MSTORE
000015ea: PUSH1 0xa0
000015ec: DUP3
000015ed: ADD
000015ee: DUP12
000015ef: SWAP1
000015f0: MSTORE
000015f1: PUSH1 0xc0
000015f3: DUP3
000015f4: ADD
000015f5: DUP11
000015f6: SWAP1
000015f7: MSTORE
000015f8: PUSH1 0x01
000015fa: PUSH1 0x01
000015fc: PUSH1 0xa0
000015fe: SHL
000015ff: SUB
00001600: DUP1
00001601: DUP11
00001602: AND
00001603: PUSH1 0xe0
00001605: DUP5
00001606: ADD
00001607: MSTORE
00001608: DUP6
00001609: AND
0000160a: PUSH2 0x0100
0000160d: DUP1
0000160e: DUP5
0000160f: ADD
00001610: SWAP2
00001611: SWAP1
00001612: SWAP2
00001613: MSTORE
00001614: DUP4
00001615: MLOAD
00001616: DUP1
00001617: DUP5
00001618: SUB
00001619: SWAP1
0000161a: SWAP2
0000161b: ADD
0000161c: DUP2
0000161d: MSTORE
0000161e: PUSH2 0x0120
00001621: SWAP1
00001622: SWAP3
00001623: ADD
00001624: SWAP1
00001625: SWAP3
00001626: MSTORE
00001627: DUP1
00001628: MLOAD
00001629: SWAP2
0000162a: ADD
0000162b: KECCAK256
0000162c: PUSH1 0x00
0000162e: SWAP1
0000162f: PUSH2 0x1637
00001632: SWAP1
00001633: PUSH2 0x3668
00001636: JUMP
00001637: JUMPDEST
00001638: SWAP1
00001639: POP
0000163a: PUSH2 0x1646
0000163d: DUP5
0000163e: DUP9
0000163f: DUP12
00001640: DUP5
00001641: DUP7
00001642: PUSH2 0x36b9
00001645: JUMP
00001646: JUMPDEST
00001647: DUP5
00001648: ISZERO
00001649: PUSH2 0x16b5
0000164c: JUMPI
0000164d: PUSH1 0x00
0000164f: PUSH2 0x1658
00001652: DUP7
00001653: DUP9
00001654: PUSH2 0x3700
00001657: JUMP
00001658: JUMPDEST
00001659: SWAP1
0000165a: POP
0000165b: PUSH2 0x1697
0000165e: PUSH2 0x1667
00001661: DUP14
00001662: DUP9
00001663: PUSH2 0x3796
00001666: JUMP
00001667: JUMPDEST
00001668: PUSH2 0x1671
0000166b: DUP14
0000166c: DUP5
0000166d: PUSH2 0x3796
00001670: JUMP
00001671: JUMPDEST
00001672: DUP11
00001673: DUP9
00001674: DUP12
00001675: DUP12
00001676: PUSH1 0x77
00001678: SLOAD
00001679: GT
0000167a: PUSH2 0x1684
0000167d: JUMPI
0000167e: PUSH1 0x00
00001680: PUSH2 0x1691
00001683: JUMP
00001684: JUMPDEST
00001685: PUSH1 0x77
00001687: SLOAD
00001688: PUSH2 0x1691
0000168b: SWAP1
0000168c: DUP14
0000168d: PUSH2 0x3796
00001690: JUMP
00001691: JUMPDEST
00001692: DUP11
00001693: PUSH2 0x37a6
00001696: JUMP
00001697: JUMPDEST
00001698: PUSH1 0x66
0000169a: SLOAD
0000169b: PUSH2 0x16af
0000169e: SWAP1
0000169f: PUSH1 0x01
000016a1: PUSH1 0x01
000016a3: PUSH1 0xa0
000016a5: SHL
000016a6: SUB
000016a7: AND
000016a8: DUP7
000016a9: CALLER
000016aa: DUP10
000016ab: PUSH2 0x3cc6
000016ae: JUMP
000016af: JUMPDEST
000016b0: POP
000016b1: PUSH2 0x16c6
000016b4: JUMP
000016b5: JUMPDEST
000016b6: PUSH2 0x16c6
000016b9: DUP12
000016ba: DUP12
000016bb: DUP10
000016bc: DUP8
000016bd: DUP11
000016be: PUSH1 0x77
000016c0: SLOAD
000016c1: DUP10
000016c2: PUSH2 0x37a6
000016c5: JUMP
000016c6: JUMPDEST
000016c7: POP
000016c8: POP
000016c9: PUSH1 0x01
000016cb: PUSH1 0x65
000016cd: SSTORE
000016ce: POP
000016cf: POP
000016d0: POP
000016d1: POP
000016d2: POP
000016d3: POP
000016d4: POP
000016d5: POP
000016d6: POP
000016d7: JUMP
000016d8: JUMPDEST
000016d9: PUSH1 0x8f
000016db: SLOAD
000016dc: DUP2
000016dd: JUMP
000016de: JUMPDEST
000016df: PUSH1 0x38
000016e1: SLOAD
000016e2: PUSH1 0xff
000016e4: AND
000016e5: SWAP1
000016e6: JUMP
000016e7: JUMPDEST
000016e8: PUSH1 0x91
000016ea: SLOAD
000016eb: DUP2
000016ec: JUMP
000016ed: JUMPDEST
000016ee: PUSH1 0x00
000016f0: PUSH2 0x143e
000016f3: PUSH2 0x16fa
000016f6: PUSH2 0x325a
000016f9: JUMP
000016fa: JUMPDEST
000016fb: DUP5
000016fc: PUSH2 0x152c
000016ff: DUP6
00001700: PUSH1 0x34
00001702: PUSH1 0x00
00001704: PUSH2 0x170b
00001707: PUSH2 0x325a
0000170a: JUMP
0000170b: JUMPDEST
0000170c: PUSH1 0x01
0000170e: PUSH1 0x01
00001710: PUSH1 0xa0
00001712: SHL
00001713: SUB
00001714: SWAP1
00001715: DUP2
00001716: AND
00001717: DUP3
00001718: MSTORE
00001719: PUSH1 0x20
0000171b: DUP1
0000171c: DUP4
0000171d: ADD
0000171e: SWAP4
0000171f: SWAP1
00001720: SWAP4
00001721: MSTORE
00001722: PUSH1 0x40
00001724: SWAP2
00001725: DUP3
00001726: ADD
00001727: PUSH1 0x00
00001729: SWAP1
0000172a: DUP2
0000172b: KECCAK256
0000172c: SWAP2
0000172d: DUP13
0000172e: AND
0000172f: DUP2
00001730: MSTORE
00001731: SWAP3
00001732: MSTORE
00001733: SWAP1
00001734: KECCAK256
00001735: SLOAD
00001736: SWAP1
00001737: PUSH2 0x3d3f
0000173a: JUMP
0000173b: JUMPDEST
0000173c: PUSH1 0x81
0000173e: PUSH1 0x20
00001740: MSTORE
00001741: PUSH1 0x00
00001743: SWAP1
00001744: DUP2
00001745: MSTORE
00001746: PUSH1 0x40
00001748: SWAP1
00001749: KECCAK256
0000174a: SLOAD
0000174b: PUSH1 0xff
0000174d: AND
0000174e: DUP2
0000174f: JUMP
00001750: JUMPDEST
00001751: PUSH1 0x8d
00001753: SLOAD
00001754: DUP2
00001755: JUMP
00001756: JUMPDEST
00001757: PUSH1 0x02
00001759: PUSH1 0x65
0000175b: SLOAD
0000175c: EQ
0000175d: ISZERO
0000175e: PUSH2 0x17ae
00001761: JUMPI
00001762: PUSH1 0x40
00001764: DUP1
00001765: MLOAD
00001766: PUSH3 0x461bcd
0000176a: PUSH1 0xe5
0000176c: SHL
0000176d: DUP2
0000176e: MSTORE
0000176f: PUSH1 0x20
00001771: PUSH1 0x04
00001773: DUP3
00001774: ADD
00001775: MSTORE
00001776: PUSH1 0x1f
00001778: PUSH1 0x24
0000177a: DUP3
0000177b: ADD
0000177c: MSTORE
0000177d: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00
0000179e: PUSH1 0x44
000017a0: DUP3
000017a1: ADD
000017a2: MSTORE
000017a3: SWAP1
000017a4: MLOAD
000017a5: SWAP1
000017a6: DUP2
000017a7: SWAP1
000017a8: SUB
000017a9: PUSH1 0x64
000017ab: ADD
000017ac: SWAP1
000017ad: REVERT
000017ae: JUMPDEST
000017af: PUSH1 0x02
000017b1: PUSH1 0x65
000017b3: SSTORE
000017b4: PUSH2 0x17bd
000017b7: DUP3
000017b8: DUP3
000017b9: PUSH2 0x3d99
000017bc: JUMP
000017bd: JUMPDEST
000017be: PUSH1 0x40
000017c0: DUP1
000017c1: MLOAD
000017c2: PUSH1 0x08
000017c4: DUP1
000017c5: DUP3
000017c6: MSTORE
000017c7: PUSH2 0x0120
000017ca: DUP3
000017cb: ADD
000017cc: SWAP1
000017cd: SWAP3
000017ce: MSTORE
000017cf: PUSH1 0x00
000017d1: SWAP2
000017d2: PUSH1 0x20
000017d4: DUP3
000017d5: ADD
000017d6: PUSH2 0x0100
000017d9: DUP1
000017da: CALLDATASIZE
000017db: DUP4
000017dc: CALLDATACOPY
000017dd: POP
000017de: POP
000017df: PUSH1 0x68
000017e1: SLOAD
000017e2: PUSH1 0x40
000017e4: MLOAD
000017e5: PUSH4 0x69795e93
000017ea: PUSH1 0xe0
000017ec: SHL
000017ed: DUP2
000017ee: MSTORE
000017ef: ADDRESS
000017f0: PUSH1 0x04
000017f2: DUP3
000017f3: ADD
000017f4: DUP2
000017f5: DUP2
000017f6: MSTORE
000017f7: CALLER
000017f8: PUSH1 0x24
000017fa: DUP5
000017fb: ADD
000017fc: DUP2
000017fd: SWAP1
000017fe: MSTORE
000017ff: PUSH1 0x60
00001801: PUSH1 0x44
00001803: DUP6
00001804: ADD
00001805: SWAP1
00001806: DUP2
00001807: MSTORE
00001808: PUSH1 0x64
0000180a: DUP6
0000180b: ADD
0000180c: DUP11
0000180d: SWAP1
0000180e: MSTORE
0000180f: SWAP7
00001810: SWAP8
00001811: POP
00001812: PUSH1 0x01
00001814: PUSH1 0x01
00001816: PUSH1 0xa0
00001818: SHL
00001819: SUB
0000181a: SWAP1
0000181b: SWAP5
0000181c: AND
0000181d: SWAP6
0000181e: PUSH4 0x69795e93
00001823: SWAP6
00001824: POP
00001825: SWAP2
00001826: SWAP4
00001827: SWAP3
00001828: DUP10
00001829: SWAP3
0000182a: DUP10
0000182b: SWAP3
0000182c: SWAP2
0000182d: PUSH1 0x84
0000182f: ADD
00001830: DUP5
00001831: PUSH1 0x20
00001833: DUP6
00001834: MUL
00001835: DUP1
00001836: DUP3
00001837: DUP5
00001838: CALLDATACOPY
00001839: PUSH1 0x00
0000183b: DUP2
0000183c: DUP5
0000183d: ADD
0000183e: MSTORE
0000183f: PUSH1 0x1f
00001841: NOT
00001842: PUSH1 0x1f
00001844: DUP3
00001845: ADD
00001846: AND
00001847: SWAP1
00001848: POP
00001849: DUP1
0000184a: DUP4
0000184b: ADD
0000184c: SWAP3
0000184d: POP
0000184e: POP
0000184f: POP
00001850: SWAP6
00001851: POP
00001852: POP
00001853: POP
00001854: POP
00001855: POP
00001856: POP
00001857: PUSH1 0x00
00001859: PUSH1 0x40
0000185b: MLOAD
0000185c: DUP1
0000185d: DUP4
0000185e: SUB
0000185f: DUP2
00001860: DUP7
00001861: DUP1
00001862: EXTCODESIZE
00001863: ISZERO
00001864: DUP1
00001865: ISZERO
00001866: PUSH2 0x186e
00001869: JUMPI
0000186a: PUSH1 0x00
0000186c: DUP1
0000186d: REVERT
0000186e: JUMPDEST
0000186f: POP
00001870: GAS
00001871: STATICCALL
00001872: ISZERO
00001873: DUP1
00001874: ISZERO
00001875: PUSH2 0x1882
00001878: JUMPI
00001879: RETURNDATASIZE
0000187a: PUSH1 0x00
0000187c: DUP1
0000187d: RETURNDATACOPY
0000187e: RETURNDATASIZE
0000187f: PUSH1 0x00
00001881: REVERT
00001882: JUMPDEST
00001883: POP
00001884: POP
00001885: POP
00001886: POP
00001887: PUSH1 0x40
00001889: MLOAD
0000188a: RETURNDATASIZE
0000188b: PUSH1 0x00
0000188d: DUP3
0000188e: RETURNDATACOPY
0000188f: PUSH1 0x1f
00001891: RETURNDATASIZE
00001892: SWAP1
00001893: DUP2
00001894: ADD
00001895: PUSH1 0x1f
00001897: NOT
00001898: AND
00001899: DUP3
0000189a: ADD
0000189b: PUSH1 0x40
0000189d: MSTORE
0000189e: PUSH1 0x20
000018a0: DUP2
000018a1: LT
000018a2: ISZERO
000018a3: PUSH2 0x18ab
000018a6: JUMPI
000018a7: PUSH1 0x00
000018a9: DUP1
000018aa: REVERT
000018ab: JUMPDEST
000018ac: DUP2
000018ad: ADD
000018ae: SWAP1
000018af: DUP1
000018b0: DUP1
000018b1: MLOAD
000018b2: PUSH1 0x40
000018b4: MLOAD
000018b5: SWAP4
000018b6: SWAP3
000018b7: SWAP2
000018b8: SWAP1
000018b9: DUP5
000018ba: PUSH5 0x0100000000
000018c0: DUP3
000018c1: GT
000018c2: ISZERO
000018c3: PUSH2 0x18cb
000018c6: JUMPI
000018c7: PUSH1 0x00
000018c9: DUP1
000018ca: REVERT
000018cb: JUMPDEST
000018cc: SWAP1
000018cd: DUP4
000018ce: ADD
000018cf: SWAP1
000018d0: PUSH1 0x20
000018d2: DUP3
000018d3: ADD
000018d4: DUP6
000018d5: DUP2
000018d6: GT
000018d7: ISZERO
000018d8: PUSH2 0x18e0
000018db: JUMPI
000018dc: PUSH1 0x00
000018de: DUP1
000018df: REVERT
000018e0: JUMPDEST
000018e1: DUP3
000018e2: MLOAD
000018e3: DUP7
000018e4: PUSH1 0x20
000018e6: DUP3
000018e7: MUL
000018e8: DUP4
000018e9: ADD
000018ea: GT
000018eb: PUSH5 0x0100000000
000018f1: DUP3
000018f2: GT
000018f3: OR
000018f4: ISZERO
000018f5: PUSH2 0x18fd
000018f8: JUMPI
000018f9: PUSH1 0x00
000018fb: DUP1
000018fc: REVERT
000018fd: JUMPDEST
000018fe: DUP3
000018ff: MSTORE
00001900: POP
00001901: DUP2
00001902: MLOAD
00001903: PUSH1 0x20
00001905: SWAP2
00001906: DUP3
00001907: ADD
00001908: SWAP3
00001909: DUP3
0000190a: ADD
0000190b: SWAP2
0000190c: MUL
0000190d: DUP1
0000190e: DUP4
0000190f: DUP4
00001910: PUSH1 0x00
00001912: JUMPDEST
00001913: DUP4
00001914: DUP2
00001915: LT
00001916: ISZERO
00001917: PUSH2 0x192a
0000191a: JUMPI
0000191b: DUP2
0000191c: DUP2
0000191d: ADD
0000191e: MLOAD
0000191f: DUP4
00001920: DUP3
00001921: ADD
00001922: MSTORE
00001923: PUSH1 0x20
00001925: ADD
00001926: PUSH2 0x1912
00001929: JUMP
0000192a: JUMPDEST
0000192b: POP
0000192c: POP
0000192d: POP
0000192e: POP
0000192f: SWAP1
00001930: POP
00001931: ADD
00001932: PUSH1 0x40
00001934: MSTORE
00001935: POP
00001936: POP
00001937: POP
00001938: SWAP1
00001939: POP
0000193a: PUSH2 0x196e
0000193d: CALLER
0000193e: DUP3
0000193f: PUSH1 0x05
00001941: DUP2
00001942: MLOAD
00001943: DUP2
00001944: LT
00001945: PUSH2 0x194a
00001948: JUMPI
00001949: INVALID
0000194a: JUMPDEST
0000194b: PUSH1 0x20
0000194d: MUL
0000194e: PUSH1 0x20
00001950: ADD
00001951: ADD
00001952: MLOAD
00001953: DUP4
00001954: PUSH1 0x06
00001956: DUP2
00001957: MLOAD
00001958: DUP2
00001959: LT
0000195a: PUSH2 0x195f
0000195d: JUMPI
0000195e: INVALID
0000195f: JUMPDEST
00001960: PUSH1 0x20
00001962: MUL
00001963: PUSH1 0x20
00001965: ADD
00001966: ADD
00001967: MLOAD
00001968: PUSH1 0x00
0000196a: PUSH2 0x3e26
0000196d: JUMP
0000196e: JUMPDEST
0000196f: POP
00001970: POP
00001971: PUSH1 0x01
00001973: PUSH1 0x65
00001975: SSTORE
00001976: POP
00001977: JUMP
00001978: JUMPDEST
00001979: PUSH1 0x01
0000197b: PUSH1 0x01
0000197d: PUSH1 0xa0
0000197f: SHL
00001980: SUB
00001981: AND
00001982: PUSH1 0x00
00001984: SWAP1
00001985: DUP2
00001986: MSTORE
00001987: PUSH1 0x71
00001989: PUSH1 0x20
0000198b: SWAP1
0000198c: DUP2
0000198d: MSTORE
0000198e: PUSH1 0x40
00001990: SWAP2
00001991: DUP3
00001992: SWAP1
00001993: KECCAK256
00001994: DUP3
00001995: MLOAD
00001996: PUSH2 0x0120
00001999: DUP2
0000199a: ADD
0000199b: DUP5
0000199c: MSTORE
0000199d: DUP2
0000199e: SLOAD
0000199f: DUP1
000019a0: DUP3
000019a1: MSTORE
000019a2: PUSH1 0x01
000019a4: DUP4
000019a5: ADD
000019a6: SLOAD
000019a7: SWAP4
000019a8: DUP3
000019a9: ADD
000019aa: DUP5
000019ab: SWAP1
000019ac: MSTORE
000019ad: PUSH1 0x02
000019af: DUP4
000019b0: ADD
000019b1: SLOAD
000019b2: SWAP5
000019b3: DUP3
000019b4: ADD
000019b5: DUP6
000019b6: SWAP1
000019b7: MSTORE
000019b8: PUSH1 0x03
000019ba: DUP4
000019bb: ADD
000019bc: SLOAD
000019bd: PUSH1 0x60
000019bf: DUP4
000019c0: ADD
000019c1: DUP2
000019c2: SWAP1
000019c3: MSTORE
000019c4: PUSH1 0x04
000019c6: DUP5
000019c7: ADD
000019c8: SLOAD
000019c9: PUSH1 0x80
000019cb: DUP5
000019cc: ADD
000019cd: DUP2
000019ce: SWAP1
000019cf: MSTORE
000019d0: PUSH1 0x05
000019d2: DUP6
000019d3: ADD
000019d4: SLOAD
000019d5: PUSH1 0xa0
000019d7: DUP6
000019d8: ADD
000019d9: DUP2
000019da: SWAP1
000019db: MSTORE
000019dc: PUSH1 0x06
000019de: DUP7
000019df: ADD
000019e0: SLOAD
000019e1: PUSH1 0xc0
000019e3: DUP7
000019e4: ADD
000019e5: DUP2
000019e6: SWAP1
000019e7: MSTORE
000019e8: PUSH1 0x07
000019ea: DUP8
000019eb: ADD
000019ec: SLOAD
000019ed: PUSH1 0xe0
000019ef: DUP8
000019f0: ADD
000019f1: DUP2
000019f2: SWAP1
000019f3: MSTORE
000019f4: PUSH1 0x08
000019f6: SWAP1
000019f7: SWAP8
000019f8: ADD
000019f9: SLOAD
000019fa: PUSH2 0x0100
000019fd: SWAP1
000019fe: SWAP7
000019ff: ADD
00001a00: DUP7
00001a01: SWAP1
00001a02: MSTORE
00001a03: SWAP4
00001a04: SWAP9
00001a05: SWAP7
00001a06: SWAP8
00001a07: SWAP7
00001a08: SWAP3
00001a09: SWAP6
00001a0a: SWAP2
00001a0b: SWAP5
00001a0c: SWAP1
00001a0d: SWAP4
00001a0e: SWAP3
00001a0f: JUMP
00001a10: JUMPDEST
00001a11: PUSH1 0x7e
00001a13: SLOAD
00001a14: DUP2
00001a15: JUMP
00001a16: JUMPDEST
00001a17: PUSH1 0x02
00001a19: PUSH1 0x65
00001a1b: SLOAD
00001a1c: EQ
00001a1d: ISZERO
00001a1e: PUSH2 0x1a6e
00001a21: JUMPI
00001a22: PUSH1 0x40
00001a24: DUP1
00001a25: MLOAD
00001a26: PUSH3 0x461bcd
00001a2a: PUSH1 0xe5
00001a2c: SHL
00001a2d: DUP2
00001a2e: MSTORE
00001a2f: PUSH1 0x20
00001a31: PUSH1 0x04
00001a33: DUP3
00001a34: ADD
00001a35: MSTORE
00001a36: PUSH1 0x1f
00001a38: PUSH1 0x24
00001a3a: DUP3
00001a3b: ADD
00001a3c: MSTORE
00001a3d: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00
00001a5e: PUSH1 0x44
00001a60: DUP3
00001a61: ADD
00001a62: MSTORE
00001a63: SWAP1
00001a64: MLOAD
00001a65: SWAP1
00001a66: DUP2
00001a67: SWAP1
00001a68: SUB
00001a69: PUSH1 0x64
00001a6b: ADD
00001a6c: SWAP1
00001a6d: REVERT
00001a6e: JUMPDEST
00001a6f: PUSH1 0x02
00001a71: PUSH1 0x65
00001a73: SSTORE
00001a74: PUSH2 0x1a7d
00001a77: DUP3
00001a78: DUP3
00001a79: PUSH2 0x3d99
00001a7c: JUMP
00001a7d: JUMPDEST
00001a7e: PUSH1 0x40
00001a80: DUP1
00001a81: MLOAD
00001a82: PUSH1 0x08
00001a84: DUP1
00001a85: DUP3
00001a86: MSTORE
00001a87: PUSH2 0x0120
00001a8a: DUP3
00001a8b: ADD
00001a8c: SWAP1
00001a8d: SWAP3
00001a8e: MSTORE
00001a8f: PUSH1 0x00
00001a91: SWAP2
00001a92: PUSH1 0x20
00001a94: DUP3
00001a95: ADD
00001a96: PUSH2 0x0100
00001a99: DUP1
00001a9a: CALLDATASIZE
00001a9b: DUP4
00001a9c: CALLDATACOPY
00001a9d: POP
00001a9e: POP
00001a9f: PUSH1 0x68
00001aa1: SLOAD
00001aa2: PUSH1 0x40
00001aa4: MLOAD
00001aa5: PUSH4 0x69795e93
00001aaa: PUSH1 0xe0
00001aac: SHL
00001aad: DUP2
00001aae: MSTORE
00001aaf: ADDRESS
00001ab0: PUSH1 0x04
00001ab2: DUP3
00001ab3: ADD
00001ab4: DUP2
00001ab5: DUP2
00001ab6: MSTORE
00001ab7: CALLER
00001ab8: PUSH1 0x24
00001aba: DUP5
00001abb: ADD
00001abc: DUP2
00001abd: SWAP1
00001abe: MSTORE
00001abf: PUSH1 0x60
00001ac1: PUSH1 0x44
00001ac3: DUP6
00001ac4: ADD
00001ac5: SWAP1
00001ac6: DUP2
00001ac7: MSTORE
00001ac8: PUSH1 0x64
00001aca: DUP6
00001acb: ADD
00001acc: DUP11
00001acd: SWAP1
00001ace: MSTORE
00001acf: SWAP7
00001ad0: SWAP8
00001ad1: POP
00001ad2: PUSH1 0x01
00001ad4: PUSH1 0x01
00001ad6: PUSH1 0xa0
00001ad8: SHL
00001ad9: SUB
00001ada: SWAP1
00001adb: SWAP5
00001adc: AND
00001add: SWAP6
00001ade: PUSH4 0x69795e93
00001ae3: SWAP6
00001ae4: POP
00001ae5: SWAP2
00001ae6: SWAP4
00001ae7: SWAP3
00001ae8: DUP10
00001ae9: SWAP3
00001aea: DUP10
00001aeb: SWAP3
00001aec: SWAP2
00001aed: PUSH1 0x84
00001aef: ADD
00001af0: DUP5
00001af1: PUSH1 0x20
00001af3: DUP6
00001af4: MUL
00001af5: DUP1
00001af6: DUP3
00001af7: DUP5
00001af8: CALLDATACOPY
00001af9: PUSH1 0x00
00001afb: DUP2
00001afc: DUP5
00001afd: ADD
00001afe: MSTORE
00001aff: PUSH1 0x1f
00001b01: NOT
00001b02: PUSH1 0x1f
00001b04: DUP3
00001b05: ADD
00001b06: AND
00001b07: SWAP1
00001b08: POP
00001b09: DUP1
00001b0a: DUP4
00001b0b: ADD
00001b0c: SWAP3
00001b0d: POP
00001b0e: POP
00001b0f: POP
00001b10: SWAP6
00001b11: POP
00001b12: POP
00001b13: POP
00001b14: POP
00001b15: POP
00001b16: POP
00001b17: PUSH1 0x00
00001b19: PUSH1 0x40
00001b1b: MLOAD
00001b1c: DUP1
00001b1d: DUP4
00001b1e: SUB
00001b1f: DUP2
00001b20: DUP7
00001b21: DUP1
00001b22: EXTCODESIZE
00001b23: ISZERO
00001b24: DUP1
00001b25: ISZERO
00001b26: PUSH2 0x1b2e
00001b29: JUMPI
00001b2a: PUSH1 0x00
00001b2c: DUP1
00001b2d: REVERT
00001b2e: JUMPDEST
00001b2f: POP
00001b30: GAS
00001b31: STATICCALL
00001b32: ISZERO
00001b33: DUP1
00001b34: ISZERO
00001b35: PUSH2 0x1b42
00001b38: JUMPI
00001b39: RETURNDATASIZE
00001b3a: PUSH1 0x00
00001b3c: DUP1
00001b3d: RETURNDATACOPY
00001b3e: RETURNDATASIZE
00001b3f: PUSH1 0x00
00001b41: REVERT
00001b42: JUMPDEST
00001b43: POP
00001b44: POP
00001b45: POP
00001b46: POP
00001b47: PUSH1 0x40
00001b49: MLOAD
00001b4a: RETURNDATASIZE
00001b4b: PUSH1 0x00
00001b4d: DUP3
00001b4e: RETURNDATACOPY
00001b4f: PUSH1 0x1f
00001b51: RETURNDATASIZE
00001b52: SWAP1
00001b53: DUP2
00001b54: ADD
00001b55: PUSH1 0x1f
00001b57: NOT
00001b58: AND
00001b59: DUP3
00001b5a: ADD
00001b5b: PUSH1 0x40
00001b5d: MSTORE
00001b5e: PUSH1 0x20
00001b60: DUP2
00001b61: LT
00001b62: ISZERO
00001b63: PUSH2 0x1b6b
00001b66: JUMPI
00001b67: PUSH1 0x00
00001b69: DUP1
00001b6a: REVERT
00001b6b: JUMPDEST
00001b6c: DUP2
00001b6d: ADD
00001b6e: SWAP1
00001b6f: DUP1
00001b70: DUP1
00001b71: MLOAD
00001b72: PUSH1 0x40
00001b74: MLOAD
00001b75: SWAP4
00001b76: SWAP3
00001b77: SWAP2
00001b78: SWAP1
00001b79: DUP5
00001b7a: PUSH5 0x0100000000
00001b80: DUP3
00001b81: GT
00001b82: ISZERO
00001b83: PUSH2 0x1b8b
00001b86: JUMPI
00001b87: PUSH1 0x00
00001b89: DUP1
00001b8a: REVERT
00001b8b: JUMPDEST
00001b8c: SWAP1
00001b8d: DUP4
00001b8e: ADD
00001b8f: SWAP1
00001b90: PUSH1 0x20
00001b92: DUP3
00001b93: ADD
00001b94: DUP6
00001b95: DUP2
00001b96: GT
00001b97: ISZERO
00001b98: PUSH2 0x1ba0
00001b9b: JUMPI
00001b9c: PUSH1 0x00
00001b9e: DUP1
00001b9f: REVERT
00001ba0: JUMPDEST
00001ba1: DUP3
00001ba2: MLOAD
00001ba3: DUP7
00001ba4: PUSH1 0x20
00001ba6: DUP3
00001ba7: MUL
00001ba8: DUP4
00001ba9: ADD
00001baa: GT
00001bab: PUSH5 0x0100000000
00001bb1: DUP3
00001bb2: GT
00001bb3: OR
00001bb4: ISZERO
00001bb5: PUSH2 0x1bbd
00001bb8: JUMPI
00001bb9: PUSH1 0x00
00001bbb: DUP1
00001bbc: REVERT
00001bbd: JUMPDEST
00001bbe: DUP3
00001bbf: MSTORE
00001bc0: POP
00001bc1: DUP2
00001bc2: MLOAD
00001bc3: PUSH1 0x20
00001bc5: SWAP2
00001bc6: DUP3
00001bc7: ADD
00001bc8: SWAP3
00001bc9: DUP3
00001bca: ADD
00001bcb: SWAP2
00001bcc: MUL
00001bcd: DUP1
00001bce: DUP4
00001bcf: DUP4
00001bd0: PUSH1 0x00
00001bd2: JUMPDEST
00001bd3: DUP4
00001bd4: DUP2
00001bd5: LT
00001bd6: ISZERO
00001bd7: PUSH2 0x1bea
00001bda: JUMPI
00001bdb: DUP2
00001bdc: DUP2
00001bdd: ADD
00001bde: MLOAD
00001bdf: DUP4
00001be0: DUP3
00001be1: ADD
00001be2: MSTORE
00001be3: PUSH1 0x20
00001be5: ADD
00001be6: PUSH2 0x1bd2
00001be9: JUMP
00001bea: JUMPDEST
00001beb: POP
00001bec: POP
00001bed: POP
00001bee: POP
00001bef: SWAP1
00001bf0: POP
00001bf1: ADD
00001bf2: PUSH1 0x40
00001bf4: MSTORE
00001bf5: POP
00001bf6: POP
00001bf7: POP
00001bf8: SWAP1
00001bf9: POP
00001bfa: PUSH1 0x00
00001bfc: PUSH1 0x67
00001bfe: PUSH1 0x00
00001c00: SWAP1
00001c01: SLOAD
00001c02: SWAP1
00001c03: PUSH2 0x0100
00001c06: EXP
00001c07: SWAP1
00001c08: DIV
00001c09: PUSH1 0x01
00001c0b: PUSH1 0x01
00001c0d: PUSH1 0xa0
00001c0f: SHL
00001c10: SUB
00001c11: AND
00001c12: PUSH1 0x01
00001c14: PUSH1 0x01
00001c16: PUSH1 0xa0
00001c18: SHL
00001c19: SUB
00001c1a: AND
00001c1b: PUSH4 0xf58d1c94
00001c20: PUSH1 0x40
00001c22: MLOAD
00001c23: DUP2
00001c24: PUSH4 0xffffffff
00001c29: AND
00001c2a: PUSH1 0xe0
00001c2c: SHL
00001c2d: DUP2
00001c2e: MSTORE
00001c2f: PUSH1 0x04
00001c31: ADD
00001c32: PUSH1 0x20
00001c34: PUSH1 0x40
00001c36: MLOAD
00001c37: DUP1
00001c38: DUP4
00001c39: SUB
00001c3a: DUP2
00001c3b: DUP7
00001c3c: DUP1
00001c3d: EXTCODESIZE
00001c3e: ISZERO
00001c3f: DUP1
00001c40: ISZERO
00001c41: PUSH2 0x1c49
00001c44: JUMPI
00001c45: PUSH1 0x00
00001c47: DUP1
00001c48: REVERT
00001c49: JUMPDEST
00001c4a: POP
00001c4b: GAS
00001c4c: STATICCALL
00001c4d: ISZERO
00001c4e: DUP1
00001c4f: ISZERO
00001c50: PUSH2 0x1c5d
00001c53: JUMPI
00001c54: RETURNDATASIZE
00001c55: PUSH1 0x00
00001c57: DUP1
00001c58: RETURNDATACOPY
00001c59: RETURNDATASIZE
00001c5a: PUSH1 0x00
00001c5c: REVERT
00001c5d: JUMPDEST
00001c5e: POP
00001c5f: POP
00001c60: POP
00001c61: POP
00001c62: PUSH1 0x40
00001c64: MLOAD
00001c65: RETURNDATASIZE
00001c66: PUSH1 0x20
00001c68: DUP2
00001c69: LT
00001c6a: ISZERO
00001c6b: PUSH2 0x1c73
00001c6e: JUMPI
00001c6f: PUSH1 0x00
00001c71: DUP1
00001c72: REVERT
00001c73: JUMPDEST
00001c74: POP
00001c75: MLOAD
00001c76: PUSH1 0x40
00001c78: DUP1
00001c79: MLOAD
00001c7a: PUSH4 0x0cbefec9
00001c7f: PUSH1 0xe3
00001c81: SHL
00001c82: DUP2
00001c83: MSTORE
00001c84: SWAP1
00001c85: MLOAD
00001c86: PUSH1 0x01
00001c88: PUSH1 0x01
00001c8a: PUSH1 0xa0
00001c8c: SHL
00001c8d: SUB
00001c8e: SWAP1
00001c8f: SWAP3
00001c90: AND
00001c91: SWAP2
00001c92: PUSH4 0x65f7f648
00001c97: SWAP2
00001c98: PUSH1 0x04
00001c9a: DUP1
00001c9b: DUP3
00001c9c: ADD
00001c9d: SWAP3
00001c9e: PUSH1 0x20
00001ca0: SWAP3
00001ca1: SWAP1
00001ca2: SWAP2
00001ca3: SWAP1
00001ca4: DUP3
00001ca5: SWAP1
00001ca6: SUB
00001ca7: ADD
00001ca8: DUP2
00001ca9: DUP7
00001caa: DUP1
00001cab: EXTCODESIZE
00001cac: ISZERO
00001cad: DUP1
00001cae: ISZERO
00001caf: PUSH2 0x1cb7
00001cb2: JUMPI
00001cb3: PUSH1 0x00
00001cb5: DUP1
00001cb6: REVERT
00001cb7: JUMPDEST
00001cb8: POP
00001cb9: GAS
00001cba: STATICCALL
00001cbb: ISZERO
00001cbc: DUP1
00001cbd: ISZERO
00001cbe: PUSH2 0x1ccb
00001cc1: JUMPI
00001cc2: RETURNDATASIZE
00001cc3: PUSH1 0x00
00001cc5: DUP1
00001cc6: RETURNDATACOPY
00001cc7: RETURNDATASIZE
00001cc8: PUSH1 0x00
00001cca: REVERT
00001ccb: JUMPDEST
00001ccc: POP
00001ccd: POP
00001cce: POP
00001ccf: POP
00001cd0: PUSH1 0x40
00001cd2: MLOAD
00001cd3: RETURNDATASIZE
00001cd4: PUSH1 0x20
00001cd6: DUP2
00001cd7: LT
00001cd8: ISZERO
00001cd9: PUSH2 0x1ce1
00001cdc: JUMPI
00001cdd: PUSH1 0x00
00001cdf: DUP1
00001ce0: REVERT
00001ce1: JUMPDEST
00001ce2: POP
00001ce3: MLOAD
00001ce4: DUP3
00001ce5: MLOAD
00001ce6: SWAP1
00001ce7: SWAP2
00001ce8: POP
00001ce9: PUSH2 0x1d1f
00001cec: SWAP1
00001ced: CALLER
00001cee: SWAP1
00001cef: DUP5
00001cf0: SWAP1
00001cf1: PUSH1 0x05
00001cf3: SWAP1
00001cf4: DUP2
00001cf5: LT
00001cf6: PUSH2 0x1cfb
00001cf9: JUMPI
00001cfa: INVALID
00001cfb: JUMPDEST
00001cfc: PUSH1 0x20
00001cfe: MUL
00001cff: PUSH1 0x20
00001d01: ADD
00001d02: ADD
00001d03: MLOAD
00001d04: DUP5
00001d05: PUSH1 0x06
00001d07: DUP2
00001d08: MLOAD
00001d09: DUP2
00001d0a: LT
00001d0b: PUSH2 0x1d10
00001d0e: JUMPI
00001d0f: INVALID
00001d10: JUMPDEST
00001d11: PUSH1 0x20
00001d13: MUL
00001d14: PUSH1 0x20
00001d16: ADD
00001d17: ADD
00001d18: MLOAD
00001d19: PUSH1 0x01
00001d1b: PUSH2 0x3e26
00001d1e: JUMP
00001d1f: JUMPDEST
00001d20: PUSH2 0x1d3d
00001d23: DUP2
00001d24: DUP4
00001d25: PUSH1 0x05
00001d27: DUP2
00001d28: MLOAD
00001d29: DUP2
00001d2a: LT
00001d2b: PUSH2 0x1d30
00001d2e: JUMPI
00001d2f: INVALID
00001d30: JUMPDEST
00001d31: PUSH1 0x20
00001d33: MUL
00001d34: PUSH1 0x20
00001d36: ADD
00001d37: ADD
00001d38: MLOAD
00001d39: PUSH2 0x4006
00001d3c: JUMP
00001d3d: JUMPDEST
00001d3e: DUP1
00001d3f: PUSH1 0x01
00001d41: PUSH1 0x01
00001d43: PUSH1 0xa0
00001d45: SHL
00001d46: SUB
00001d47: AND
00001d48: PUSH4 0x84715b11
00001d4d: DUP4
00001d4e: PUSH1 0x05
00001d50: DUP2
00001d51: MLOAD
00001d52: DUP2
00001d53: LT
00001d54: PUSH2 0x1d59
00001d57: JUMPI
00001d58: INVALID
00001d59: JUMPDEST
00001d5a: PUSH1 0x20
00001d5c: MUL
00001d5d: PUSH1 0x20
00001d5f: ADD
00001d60: ADD
00001d61: MLOAD
00001d62: DUP8
00001d63: CALLER
00001d64: PUSH1 0x00
00001d66: PUSH1 0x40
00001d68: MLOAD
00001d69: DUP6
00001d6a: PUSH4 0xffffffff
00001d6f: AND
00001d70: PUSH1 0xe0
00001d72: SHL
00001d73: DUP2
00001d74: MSTORE
00001d75: PUSH1 0x04
00001d77: ADD
00001d78: DUP1
00001d79: DUP6
00001d7a: DUP2
00001d7b: MSTORE
00001d7c: PUSH1 0x20
00001d7e: ADD
00001d7f: DUP5
00001d80: DUP2
00001d81: MSTORE
00001d82: PUSH1 0x20
00001d84: ADD
00001d85: DUP4
00001d86: PUSH1 0x01
00001d88: PUSH1 0x01
00001d8a: PUSH1 0xa0
00001d8c: SHL
00001d8d: SUB
00001d8e: AND
00001d8f: DUP2
00001d90: MSTORE
00001d91: PUSH1 0x20
00001d93: ADD
00001d94: DUP3
00001d95: PUSH1 0x01
00001d97: PUSH1 0x01
00001d99: PUSH1 0xa0
00001d9b: SHL
00001d9c: SUB
00001d9d: AND
00001d9e: DUP2
00001d9f: MSTORE
00001da0: PUSH1 0x20
00001da2: ADD
00001da3: SWAP5
00001da4: POP
00001da5: POP
00001da6: POP
00001da7: POP
00001da8: POP
00001da9: PUSH1 0x00
00001dab: PUSH1 0x40
00001dad: MLOAD
00001dae: DUP1
00001daf: DUP4
00001db0: SUB
00001db1: DUP2
00001db2: PUSH1 0x00
00001db4: DUP8
00001db5: DUP1
00001db6: EXTCODESIZE
00001db7: ISZERO
00001db8: DUP1
00001db9: ISZERO
00001dba: PUSH2 0x1dc2
00001dbd: JUMPI
00001dbe: PUSH1 0x00
00001dc0: DUP1
00001dc1: REVERT
00001dc2: JUMPDEST
00001dc3: POP
00001dc4: GAS
00001dc5: CALL
00001dc6: ISZERO
00001dc7: DUP1
00001dc8: ISZERO
00001dc9: PUSH2 0x1dd6
00001dcc: JUMPI
00001dcd: RETURNDATASIZE
00001dce: PUSH1 0x00
00001dd0: DUP1
00001dd1: RETURNDATACOPY
00001dd2: RETURNDATASIZE
00001dd3: PUSH1 0x00
00001dd5: REVERT
00001dd6: JUMPDEST
00001dd7: POP
00001dd8: POP
00001dd9: POP
00001dda: POP
00001ddb: CALLER
00001ddc: PUSH1 0x01
00001dde: PUSH1 0x01
00001de0: PUSH1 0xa0
00001de2: SHL
00001de3: SUB
00001de4: AND
00001de5: PUSH32 0x1886d3d8c9b71f99d9224bccca0588192d9d4428b2adab6cfcf70e8a07d4d2f2
00001e06: DUP4
00001e07: PUSH1 0x05
00001e09: DUP2
00001e0a: MLOAD
00001e0b: DUP2
00001e0c: LT
00001e0d: PUSH2 0x1e12
00001e10: JUMPI
00001e11: INVALID
00001e12: JUMPDEST
00001e13: PUSH1 0x20
00001e15: MUL
00001e16: PUSH1 0x20
00001e18: ADD
00001e19: ADD
00001e1a: MLOAD
00001e1b: PUSH1 0x40
00001e1d: MLOAD
00001e1e: DUP1
00001e1f: DUP3
00001e20: DUP2
00001e21: MSTORE
00001e22: PUSH1 0x20
00001e24: ADD
00001e25: SWAP2
00001e26: POP
00001e27: POP
00001e28: PUSH1 0x40
00001e2a: MLOAD
00001e2b: DUP1
00001e2c: SWAP2
00001e2d: SUB
00001e2e: SWAP1
00001e2f: LOG2
00001e30: POP
00001e31: POP
00001e32: PUSH1 0x01
00001e34: PUSH1 0x65
00001e36: SSTORE
00001e37: POP
00001e38: POP
00001e39: POP
00001e3a: JUMP
00001e3b: JUMPDEST
00001e3c: PUSH1 0x69
00001e3e: SLOAD
00001e3f: PUSH1 0x01
00001e41: PUSH1 0xa8
00001e43: SHL
00001e44: SWAP1
00001e45: DIV
00001e46: PUSH1 0xff
00001e48: AND
00001e49: DUP2
00001e4a: JUMP
00001e4b: JUMPDEST
00001e4c: PUSH1 0x93
00001e4e: PUSH1 0x20
00001e50: MSTORE
00001e51: PUSH1 0x00
00001e53: SWAP1
00001e54: DUP2
00001e55: MSTORE
00001e56: PUSH1 0x40
00001e58: SWAP1
00001e59: KECCAK256
00001e5a: SLOAD
00001e5b: DUP2
00001e5c: JUMP
00001e5d: JUMPDEST
00001e5e: PUSH32 0x000000000000000000000000aaacb63ab80969af93b811deb81ddeb4c8710591
00001e7f: DUP2
00001e80: JUMP
00001e81: JUMPDEST
00001e82: PUSH1 0x7b
00001e84: SLOAD
00001e85: DUP2
00001e86: JUMP
00001e87: JUMPDEST
00001e88: PUSH1 0x83
00001e8a: SLOAD
00001e8b: DUP2
00001e8c: JUMP
00001e8d: JUMPDEST
00001e8e: PUSH1 0x86
00001e90: DUP2
00001e91: PUSH1 0x04
00001e93: DUP2
00001e94: LT
00001e95: PUSH2 0x1e9d
00001e98: JUMPI
00001e99: PUSH1 0x00
00001e9b: DUP1
00001e9c: REVERT
00001e9d: JUMPDEST
00001e9e: ADD
00001e9f: SLOAD
00001ea0: PUSH1 0x01
00001ea2: PUSH1 0x01
00001ea4: PUSH1 0xa0
00001ea6: SHL
00001ea7: SUB
00001ea8: AND
00001ea9: SWAP1
00001eaa: POP
00001eab: DUP2
00001eac: JUMP
00001ead: JUMPDEST
00001eae: PUSH2 0x1ec5
00001eb1: PUSH1 0x77
00001eb3: SLOAD
00001eb4: PUSH2 0x1ebc
00001eb7: CALLER
00001eb8: PUSH2 0x2360
00001ebb: JUMP
00001ebc: JUMPDEST
00001ebd: LT
00001ebe: ISZERO
00001ebf: PUSH1 0x0f
00001ec1: PUSH2 0x403a
00001ec4: JUMP
00001ec5: JUMPDEST
00001ec6: CALLER
00001ec7: PUSH1 0x00
00001ec9: SWAP1
00001eca: DUP2
00001ecb: MSTORE
00001ecc: PUSH1 0x71
00001ece: PUSH1 0x20
00001ed0: MSTORE
00001ed1: PUSH1 0x40
00001ed3: SWAP1
00001ed4: KECCAK256
00001ed5: PUSH1 0x91
00001ed7: SLOAD
00001ed8: PUSH2 0x1f00
00001edb: SWAP1
00001edc: ISZERO
00001edd: DUP1
00001ede: ISZERO
00001edf: SWAP1
00001ee0: PUSH2 0x1ef9
00001ee3: JUMPI
00001ee4: POP
00001ee5: PUSH1 0x91
00001ee7: SLOAD
00001ee8: PUSH1 0x01
00001eea: DUP4
00001eeb: ADD
00001eec: SLOAD
00001eed: PUSH2 0x1ef7
00001ef0: SWAP1
00001ef1: TIMESTAMP
00001ef2: SWAP1
00001ef3: PUSH2 0x3796
00001ef6: JUMP
00001ef7: JUMPDEST
00001ef8: GT
00001ef9: JUMPDEST
00001efa: PUSH1 0x7d
00001efc: PUSH2 0x403a
00001eff: JUMP
00001f00: JUMPDEST
00001f01: PUSH1 0x67
00001f03: PUSH1 0x00
00001f05: SWAP1
00001f06: SLOAD
00001f07: SWAP1
00001f08: PUSH2 0x0100
00001f0b: EXP
00001f0c: SWAP1
00001f0d: DIV
00001f0e: PUSH1 0x01
00001f10: PUSH1 0x01
00001f12: PUSH1 0xa0
00001f14: SHL
00001f15: SUB
00001f16: AND
00001f17: PUSH1 0x01
00001f19: PUSH1 0x01
00001f1b: PUSH1 0xa0
00001f1d: SHL
00001f1e: SUB
00001f1f: AND
00001f20: PUSH4 0xead4c1cf
00001f25: PUSH1 0x40
00001f27: MLOAD
00001f28: DUP2
00001f29: PUSH4 0xffffffff
00001f2e: AND
00001f2f: PUSH1 0xe0
00001f31: SHL
00001f32: DUP2
00001f33: MSTORE
00001f34: PUSH1 0x04
00001f36: ADD
00001f37: PUSH1 0x20
00001f39: PUSH1 0x40
00001f3b: MLOAD
00001f3c: DUP1
00001f3d: DUP4
00001f3e: SUB
00001f3f: DUP2
00001f40: DUP7
00001f41: DUP1
00001f42: EXTCODESIZE
00001f43: ISZERO
00001f44: DUP1
00001f45: ISZERO
00001f46: PUSH2 0x1f4e
00001f49: JUMPI
00001f4a: PUSH1 0x00
00001f4c: DUP1
00001f4d: REVERT
00001f4e: JUMPDEST
00001f4f: POP
00001f50: GAS
00001f51: STATICCALL
00001f52: ISZERO
00001f53: DUP1
00001f54: ISZERO
00001f55: PUSH2 0x1f62
00001f58: JUMPI
00001f59: RETURNDATASIZE
00001f5a: PUSH1 0x00
00001f5c: DUP1
00001f5d: RETURNDATACOPY
00001f5e: RETURNDATASIZE
00001f5f: PUSH1 0x00
00001f61: REVERT
00001f62: JUMPDEST
00001f63: POP
00001f64: POP
00001f65: POP
00001f66: POP
00001f67: PUSH1 0x40
00001f69: MLOAD
00001f6a: RETURNDATASIZE
00001f6b: PUSH1 0x20
00001f6d: DUP2
00001f6e: LT
00001f6f: ISZERO
00001f70: PUSH2 0x1f78
00001f73: JUMPI
00001f74: PUSH1 0x00
00001f76: DUP1
00001f77: REVERT
00001f78: JUMPDEST
00001f79: POP
00001f7a: MLOAD
00001f7b: PUSH1 0x40
00001f7d: DUP1
00001f7e: MLOAD
00001f7f: PUSH32 0x45b4974700000000000000000000000000000000000000000000000000000000
00001fa0: DUP2
00001fa1: MSTORE
00001fa2: CALLER
00001fa3: PUSH1 0x04
00001fa5: DUP3
00001fa6: ADD
00001fa7: MSTORE
00001fa8: SWAP1
00001fa9: MLOAD
00001faa: PUSH1 0x01
00001fac: PUSH1 0x01
00001fae: PUSH1 0xa0
00001fb0: SHL
00001fb1: SUB
00001fb2: SWAP1
00001fb3: SWAP3
00001fb4: AND
00001fb5: SWAP2
00001fb6: PUSH4 0x45b49747
00001fbb: SWAP2
00001fbc: PUSH1 0x24
00001fbe: DUP1
00001fbf: DUP3
00001fc0: ADD
00001fc1: SWAP3
00001fc2: PUSH1 0x20
00001fc4: SWAP3
00001fc5: SWAP1
00001fc6: SWAP2
00001fc7: SWAP1
00001fc8: DUP3
00001fc9: SWAP1
00001fca: SUB
00001fcb: ADD
00001fcc: DUP2
00001fcd: PUSH1 0x00
00001fcf: DUP8
00001fd0: DUP1
00001fd1: EXTCODESIZE
00001fd2: ISZERO
00001fd3: DUP1
00001fd4: ISZERO
00001fd5: PUSH2 0x1fdd
00001fd8: JUMPI
00001fd9: PUSH1 0x00
00001fdb: DUP1
00001fdc: REVERT
00001fdd: JUMPDEST
00001fde: POP
00001fdf: GAS
00001fe0: CALL
00001fe1: ISZERO
00001fe2: DUP1
00001fe3: ISZERO
00001fe4: PUSH2 0x1ff1
00001fe7: JUMPI
00001fe8: RETURNDATASIZE
00001fe9: PUSH1 0x00
00001feb: DUP1
00001fec: RETURNDATACOPY
00001fed: RETURNDATASIZE
00001fee: PUSH1 0x00
00001ff0: REVERT
00001ff1: JUMPDEST
00001ff2: POP
00001ff3: POP
00001ff4: POP
00001ff5: POP
00001ff6: PUSH1 0x40
00001ff8: MLOAD
00001ff9: RETURNDATASIZE
00001ffa: PUSH1 0x20
00001ffc: DUP2
00001ffd: LT
00001ffe: ISZERO
00001fff: PUSH2 0x2007
00002002: JUMPI
00002003: PUSH1 0x00
00002005: DUP1
00002006: REVERT
00002007: JUMPDEST
00002008: POP
00002009: POP
0000200a: POP
0000200b: JUMP
0000200c: JUMPDEST
0000200d: PUSH1 0x67
0000200f: SLOAD
00002010: PUSH1 0x40
00002012: DUP1
00002013: MLOAD
00002014: PUSH4 0x364d1181
00002019: PUSH1 0xe0
0000201b: SHL
0000201c: DUP2
0000201d: MSTORE
0000201e: ADDRESS
0000201f: PUSH1 0x04
00002021: DUP3
00002022: ADD
00002023: MSTORE
00002024: SWAP1
00002025: MLOAD
00002026: PUSH2 0x208b
00002029: SWAP3
0000202a: PUSH1 0x01
0000202c: PUSH1 0x01
0000202e: PUSH1 0xa0
00002030: SHL
00002031: SUB
00002032: AND
00002033: SWAP2
00002034: PUSH4 0x364d1181
00002039: SWAP2
0000203a: PUSH1 0x24
0000203c: DUP1
0000203d: DUP4
0000203e: ADD
0000203f: SWAP3
00002040: PUSH1 0x20
00002042: SWAP3
00002043: SWAP2
00002044: SWAP1
00002045: DUP3
00002046: SWAP1
00002047: SUB
00002048: ADD
00002049: DUP2
0000204a: DUP7
0000204b: DUP1
0000204c: EXTCODESIZE
0000204d: ISZERO
0000204e: DUP1
0000204f: ISZERO
00002050: PUSH2 0x2058
00002053: JUMPI
00002054: PUSH1 0x00
00002056: DUP1
00002057: REVERT
00002058: JUMPDEST
00002059: POP
0000205a: GAS
0000205b: STATICCALL
0000205c: ISZERO
0000205d: DUP1
0000205e: ISZERO
0000205f: PUSH2 0x206c
00002062: JUMPI
00002063: RETURNDATASIZE
00002064: PUSH1 0x00
00002066: DUP1
00002067: RETURNDATACOPY
00002068: RETURNDATASIZE
00002069: PUSH1 0x00
0000206b: REVERT
0000206c: JUMPDEST
0000206d: POP
0000206e: POP
0000206f: POP
00002070: POP
00002071: PUSH1 0x40
00002073: MLOAD
00002074: RETURNDATASIZE
00002075: PUSH1 0x20
00002077: DUP2
00002078: LT
00002079: ISZERO
0000207a: PUSH2 0x2082
0000207d: JUMPI
0000207e: PUSH1 0x00
00002080: DUP1
00002081: REVERT
00002082: JUMPDEST
00002083: POP
00002084: MLOAD
00002085: PUSH1 0x23
00002087: PUSH2 0x403a
0000208a: JUMP
0000208b: JUMPDEST
0000208c: PUSH1 0x67
0000208e: SLOAD
0000208f: PUSH1 0x40
00002091: DUP1
00002092: MLOAD
00002093: PUSH4 0x3d634725
00002098: PUSH1 0xe2
0000209a: SHL
0000209b: DUP2
0000209c: MSTORE
0000209d: SWAP1
0000209e: MLOAD
0000209f: PUSH2 0x217d
000020a2: SWAP3
000020a3: PUSH1 0x01
000020a5: PUSH1 0x01
000020a7: PUSH1 0xa0
000020a9: SHL
000020aa: SUB
000020ab: AND
000020ac: SWAP2
000020ad: PUSH4 0xf58d1c94
000020b2: SWAP2
000020b3: PUSH1 0x04
000020b5: DUP1
000020b6: DUP4
000020b7: ADD
000020b8: SWAP3
000020b9: PUSH1 0x20
000020bb: SWAP3
000020bc: SWAP2
000020bd: SWAP1
000020be: DUP3
000020bf: SWAP1
000020c0: SUB
000020c1: ADD
000020c2: DUP2
000020c3: DUP7
000020c4: DUP1
000020c5: EXTCODESIZE
000020c6: ISZERO
000020c7: DUP1
000020c8: ISZERO
000020c9: PUSH2 0x20d1
000020cc: JUMPI
000020cd: PUSH1 0x00
000020cf: DUP1
000020d0: REVERT
000020d1: JUMPDEST
000020d2: POP
000020d3: GAS
000020d4: STATICCALL
000020d5: ISZERO
000020d6: DUP1
000020d7: ISZERO
000020d8: PUSH2 0x20e5
000020db: JUMPI
000020dc: RETURNDATASIZE
000020dd: PUSH1 0x00
000020df: DUP1
000020e0: RETURNDATACOPY
000020e1: RETURNDATASIZE
000020e2: PUSH1 0x00
000020e4: REVERT
000020e5: JUMPDEST
000020e6: POP
000020e7: POP
000020e8: POP
000020e9: POP
000020ea: PUSH1 0x40
000020ec: MLOAD
000020ed: RETURNDATASIZE
000020ee: PUSH1 0x20
000020f0: DUP2
000020f1: LT
000020f2: ISZERO
000020f3: PUSH2 0x20fb
000020f6: JUMPI
000020f7: PUSH1 0x00
000020f9: DUP1
000020fa: REVERT
000020fb: JUMPDEST
000020fc: POP
000020fd: MLOAD
000020fe: PUSH1 0x40
00002100: DUP1
00002101: MLOAD
00002102: PUSH4 0x0cbefec9
00002107: PUSH1 0xe3
00002109: SHL
0000210a: DUP2
0000210b: MSTORE
0000210c: SWAP1
0000210d: MLOAD
0000210e: PUSH1 0x01
00002110: PUSH1 0x01
00002112: PUSH1 0xa0
00002114: SHL
00002115: SUB
00002116: SWAP1
00002117: SWAP3
00002118: AND
00002119: SWAP2
0000211a: PUSH4 0x65f7f648
0000211f: SWAP2
00002120: PUSH1 0x04
00002122: DUP1
00002123: DUP3
00002124: ADD
00002125: SWAP3
00002126: PUSH1 0x20
00002128: SWAP3
00002129: SWAP1
0000212a: SWAP2
0000212b: SWAP1
0000212c: DUP3
0000212d: SWAP1
0000212e: SUB
0000212f: ADD
00002130: DUP2
00002131: DUP7
00002132: DUP1
00002133: EXTCODESIZE
00002134: ISZERO
00002135: DUP1
00002136: ISZERO
00002137: PUSH2 0x213f
0000213a: JUMPI
0000213b: PUSH1 0x00
0000213d: DUP1
0000213e: REVERT
0000213f: JUMPDEST
00002140: POP
00002141: GAS
00002142: STATICCALL
00002143: ISZERO
00002144: DUP1
00002145: ISZERO
00002146: PUSH2 0x2153
00002149: JUMPI
0000214a: RETURNDATASIZE
0000214b: PUSH1 0x00
0000214d: DUP1
0000214e: RETURNDATACOPY
0000214f: RETURNDATASIZE
00002150: PUSH1 0x00
00002152: REVERT
00002153: JUMPDEST
00002154: POP
00002155: POP
00002156: POP
00002157: POP
00002158: PUSH1 0x40
0000215a: MLOAD
0000215b: RETURNDATASIZE
0000215c: PUSH1 0x20
0000215e: DUP2
0000215f: LT
00002160: ISZERO
00002161: PUSH2 0x2169
00002164: JUMPI
00002165: PUSH1 0x00
00002167: DUP1
00002168: REVERT
00002169: JUMPDEST
0000216a: POP
0000216b: MLOAD
0000216c: PUSH1 0x01
0000216e: PUSH1 0x01
00002170: PUSH1 0xa0
00002172: SHL
00002173: SUB
00002174: AND
00002175: ADDRESS
00002176: EQ
00002177: PUSH1 0x7a
00002179: PUSH2 0x403a
0000217c: JUMP
0000217d: JUMPDEST
0000217e: PUSH2 0x219e
00002181: PUSH4 0x0784ce00
00002186: DUP4
00002187: GT
00002188: ISZERO
00002189: DUP1
0000218a: ISZERO
0000218b: PUSH2 0x2197
0000218e: JUMPI
0000218f: POP
00002190: PUSH3 0xf14280
00002194: DUP4
00002195: LT
00002196: ISZERO
00002197: JUMPDEST
00002198: PUSH1 0x86
0000219a: PUSH2 0x403a
0000219d: JUMP
0000219e: JUMPDEST
0000219f: PUSH2 0x2243
000021a2: PUSH1 0x77
000021a4: SLOAD
000021a5: PUSH2 0x21ad
000021a8: DUP6
000021a9: PUSH2 0x2360
000021ac: JUMP
000021ad: JUMPDEST
000021ae: LT
000021af: ISZERO
000021b0: DUP1
000021b1: ISZERO
000021b2: PUSH2 0x223c
000021b5: JUMPI
000021b6: POP
000021b7: PUSH1 0x67
000021b9: PUSH1 0x00
000021bb: SWAP1
000021bc: SLOAD
000021bd: SWAP1
000021be: PUSH2 0x0100
000021c1: EXP
000021c2: SWAP1
000021c3: DIV
000021c4: PUSH1 0x01
000021c6: PUSH1 0x01
000021c8: PUSH1 0xa0
000021ca: SHL
000021cb: SUB
000021cc: AND
000021cd: PUSH1 0x01
000021cf: PUSH1 0x01
000021d1: PUSH1 0xa0
000021d3: SHL
000021d4: SUB
000021d5: AND
000021d6: PUSH4 0xf58d1c94
000021db: PUSH1 0x40
000021dd: MLOAD
000021de: DUP2
000021df: PUSH4 0xffffffff
000021e4: AND
000021e5: PUSH1 0xe0
000021e7: SHL
000021e8: DUP2
000021e9: MSTORE
000021ea: PUSH1 0x04
000021ec: ADD
000021ed: PUSH1 0x20
000021ef: PUSH1 0x40
000021f1: MLOAD
000021f2: DUP1
000021f3: DUP4
000021f4: SUB
000021f5: DUP2
000021f6: DUP7
000021f7: DUP1
000021f8: EXTCODESIZE
000021f9: ISZERO
000021fa: DUP1
000021fb: ISZERO
000021fc: PUSH2 0x2204
000021ff: JUMPI
00002200: PUSH1 0x00
00002202: DUP1
00002203: REVERT
00002204: JUMPDEST
00002205: POP
00002206: GAS
00002207: STATICCALL
00002208: ISZERO
00002209: DUP1
0000220a: ISZERO
0000220b: PUSH2 0x2218
0000220e: JUMPI
0000220f: RETURNDATASIZE
00002210: PUSH1 0x00
00002212: DUP1
00002213: RETURNDATACOPY
00002214: RETURNDATASIZE
00002215: PUSH1 0x00
00002217: REVERT
00002218: JUMPDEST
00002219: POP
0000221a: POP
0000221b: POP
0000221c: POP
0000221d: PUSH1 0x40
0000221f: MLOAD
00002220: RETURNDATASIZE
00002221: PUSH1 0x20
00002223: DUP2
00002224: LT
00002225: ISZERO
00002226: PUSH2 0x222e
00002229: JUMPI
0000222a: PUSH1 0x00
0000222c: DUP1
0000222d: REVERT
0000222e: JUMPDEST
0000222f: POP
00002230: MLOAD
00002231: PUSH1 0x01
00002233: PUSH1 0x01
00002235: PUSH1 0xa0
00002237: SHL
00002238: SUB
00002239: AND
0000223a: CALLER
0000223b: EQ
0000223c: JUMPDEST
0000223d: PUSH1 0x0f
0000223f: PUSH2 0x403a
00002242: JUMP
00002243: JUMPDEST
00002244: PUSH1 0x01
00002246: PUSH1 0x01
00002248: PUSH1 0xa0
0000224a: SHL
0000224b: SUB
0000224c: DUP4
0000224d: AND
0000224e: PUSH1 0x00
00002250: SWAP1
00002251: DUP2
00002252: MSTORE
00002253: PUSH1 0x93
00002255: PUSH1 0x20
00002257: MSTORE
00002258: PUSH1 0x40
0000225a: SWAP1
0000225b: KECCAK256
0000225c: SLOAD
0000225d: PUSH2 0x228e
00002260: SWAP1
00002261: DUP4
00002262: LT
00002263: ISZERO
00002264: DUP1
00002265: PUSH2 0x2197
00002268: JUMPI
00002269: POP
0000226a: PUSH2 0x2272
0000226d: DUP5
0000226e: PUSH2 0x4048
00002271: JUMP
00002272: JUMPDEST
00002273: PUSH2 0x2285
00002276: PUSH2 0x227e
00002279: DUP7
0000227a: PUSH2 0x404f
0000227d: JUMP
0000227e: JUMPDEST
0000227f: TIMESTAMP
00002280: SWAP1
00002281: PUSH2 0x3796
00002284: JUMP
00002285: JUMPDEST
00002286: LT
00002287: ISZERO
00002288: PUSH1 0x86
0000228a: PUSH2 0x403a
0000228d: JUMP
0000228e: JUMPDEST
0000228f: PUSH1 0x01
00002291: PUSH1 0x01
00002293: PUSH1 0xa0
00002295: SHL
00002296: SUB
00002297: DUP4
00002298: AND
00002299: PUSH1 0x00
0000229b: SWAP1
0000229c: DUP2
0000229d: MSTORE
0000229e: PUSH1 0x93
000022a0: PUSH1 0x20
000022a2: MSTORE
000022a3: PUSH1 0x40
000022a5: SWAP1
000022a6: KECCAK256
000022a7: SLOAD
000022a8: DUP3
000022a9: GT
000022aa: ISZERO
000022ab: PUSH2 0x2007
000022ae: JUMPI
000022af: PUSH1 0x01
000022b1: PUSH1 0x01
000022b3: PUSH1 0xa0
000022b5: SHL
000022b6: SUB
000022b7: DUP4
000022b8: AND
000022b9: PUSH1 0x00
000022bb: SWAP1
000022bc: DUP2
000022bd: MSTORE
000022be: PUSH1 0x93
000022c0: PUSH1 0x20
000022c2: MSTORE
000022c3: PUSH1 0x40
000022c5: SWAP1
000022c6: KECCAK256
000022c7: SLOAD
000022c8: PUSH2 0x22eb
000022cb: JUMPI
000022cc: PUSH1 0x01
000022ce: PUSH1 0x01
000022d0: PUSH1 0xa0
000022d2: SHL
000022d3: SUB
000022d4: DUP4
000022d5: AND
000022d6: PUSH1 0x00
000022d8: SWAP1
000022d9: DUP2
000022da: MSTORE
000022db: PUSH1 0x93
000022dd: PUSH1 0x20
000022df: MSTORE
000022e0: PUSH1 0x40
000022e2: SWAP1
000022e3: KECCAK256
000022e4: DUP3
000022e5: SWAP1
000022e6: SSTORE
000022e7: PUSH2 0x2007
000022ea: JUMP
000022eb: JUMPDEST
000022ec: PUSH1 0x00
000022ee: PUSH2 0x22f6
000022f1: DUP5
000022f2: PUSH2 0x2360
000022f5: JUMP
000022f6: JUMPDEST
000022f7: SWAP1
000022f8: POP
000022f9: PUSH2 0x2341
000022fc: PUSH2 0x2305
000022ff: DUP3
00002300: DUP5
00002301: PUSH2 0x4096
00002304: JUMP
00002305: JUMPDEST
00002306: PUSH2 0x233b
00002309: PUSH2 0x2312
0000230c: DUP5
0000230d: DUP8
0000230e: PUSH2 0x40a6
00002311: JUMP
00002312: JUMPDEST
00002313: PUSH1 0x01
00002315: PUSH1 0x01
00002317: PUSH1 0xa0
00002319: SHL
0000231a: SUB
0000231b: DUP9
0000231c: AND
0000231d: PUSH1 0x00
0000231f: SWAP1
00002320: DUP2
00002321: MSTORE
00002322: PUSH1 0x93
00002324: PUSH1 0x20
00002326: MSTORE
00002327: PUSH1 0x40
00002329: SWAP1
0000232a: KECCAK256
0000232b: SLOAD
0000232c: PUSH2 0x2335
0000232f: SWAP1
00002330: DUP8
00002331: PUSH2 0x40a6
00002334: JUMP
00002335: JUMPDEST
00002336: SWAP1
00002337: PUSH2 0x4096
0000233a: JUMP
0000233b: JUMPDEST
0000233c: SWAP1
0000233d: PUSH2 0x40ca
00002340: JUMP
00002341: JUMPDEST
00002342: PUSH1 0x01
00002344: PUSH1 0x01
00002346: PUSH1 0xa0
00002348: SHL
00002349: SUB
0000234a: DUP6
0000234b: AND
0000234c: PUSH1 0x00
0000234e: SWAP1
0000234f: DUP2
00002350: MSTORE
00002351: PUSH1 0x93
00002353: PUSH1 0x20
00002355: MSTORE
00002356: PUSH1 0x40
00002358: SWAP1
00002359: KECCAK256
0000235a: SSTORE
0000235b: POP
0000235c: POP
0000235d: POP
0000235e: POP
0000235f: JUMP
00002360: JUMPDEST
00002361: PUSH1 0x01
00002363: PUSH1 0x01
00002365: PUSH1 0xa0
00002367: SHL
00002368: SUB
00002369: DUP2
0000236a: AND
0000236b: PUSH1 0x00
0000236d: SWAP1
0000236e: DUP2
0000236f: MSTORE
00002370: PUSH1 0x33
00002372: PUSH1 0x20
00002374: MSTORE
00002375: PUSH1 0x40
00002377: SWAP1
00002378: KECCAK256
00002379: SLOAD
0000237a: JUMPDEST
0000237b: SWAP2
0000237c: SWAP1
0000237d: POP
0000237e: JUMP
0000237f: JUMPDEST
00002380: PUSH1 0x6f
00002382: SLOAD
00002383: DUP2
00002384: JUMP
00002385: JUMPDEST
00002386: PUSH1 0x85
00002388: SLOAD
00002389: PUSH2 0x0100
0000238c: SWAP1
0000238d: DIV
0000238e: PUSH1 0xff
00002390: AND
00002391: DUP2
00002392: JUMP
00002393: JUMPDEST
00002394: PUSH1 0x6d
00002396: SLOAD
00002397: DUP2
00002398: JUMP
00002399: JUMPDEST
0000239a: PUSH1 0x8b
0000239c: SLOAD
0000239d: DUP2
0000239e: JUMP
0000239f: JUMPDEST
000023a0: PUSH1 0x02
000023a2: PUSH1 0x65
000023a4: SLOAD
000023a5: EQ
000023a6: ISZERO
000023a7: PUSH2 0x23f7
000023aa: JUMPI
000023ab: PUSH1 0x40
000023ad: DUP1
000023ae: MLOAD
000023af: PUSH3 0x461bcd
000023b3: PUSH1 0xe5
000023b5: SHL
000023b6: DUP2
000023b7: MSTORE
000023b8: PUSH1 0x20
000023ba: PUSH1 0x04
000023bc: DUP3
000023bd: ADD
000023be: MSTORE
000023bf: PUSH1 0x1f
000023c1: PUSH1 0x24
000023c3: DUP3
000023c4: ADD
000023c5: MSTORE
000023c6: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00
000023e7: PUSH1 0x44
000023e9: DUP3
000023ea: ADD
000023eb: MSTORE
000023ec: SWAP1
000023ed: MLOAD
000023ee: SWAP1
000023ef: DUP2
000023f0: SWAP1
000023f1: SUB
000023f2: PUSH1 0x64
000023f4: ADD
000023f5: SWAP1
000023f6: REVERT
000023f7: JUMPDEST
000023f8: PUSH1 0x02
000023fa: PUSH1 0x65
000023fc: SSTORE
000023fd: PUSH2 0x2414
00002400: DUP5
00002401: DUP5
00002402: DUP5
00002403: CALLER
00002404: PUSH2 0x240b
00002407: PUSH2 0x4131
0000240a: JUMP
0000240b: JUMPDEST
0000240c: PUSH1 0x77
0000240e: SLOAD
0000240f: DUP8
00002410: PUSH2 0x37a6
00002413: JUMP
00002414: JUMPDEST
00002415: POP
00002416: POP
00002417: PUSH1 0x01
00002419: PUSH1 0x65
0000241b: SSTORE
0000241c: POP
0000241d: POP
0000241e: JUMP
0000241f: JUMPDEST
00002420: PUSH1 0x79
00002422: SLOAD
00002423: DUP2
00002424: JUMP
00002425: JUMPDEST
00002426: PUSH1 0x7a
00002428: SLOAD
00002429: DUP2
0000242a: JUMP
0000242b: JUMPDEST
0000242c: PUSH1 0x02
0000242e: PUSH1 0x65
00002430: SLOAD
00002431: EQ
00002432: ISZERO
00002433: PUSH2 0x2483
00002436: JUMPI
00002437: PUSH1 0x40
00002439: DUP1
0000243a: MLOAD
0000243b: PUSH3 0x461bcd
0000243f: PUSH1 0xe5
00002441: SHL
00002442: DUP2
00002443: MSTORE
00002444: PUSH1 0x20
00002446: PUSH1 0x04
00002448: DUP3
00002449: ADD
0000244a: MSTORE
0000244b: PUSH1 0x1f
0000244d: PUSH1 0x24
0000244f: DUP3
00002450: ADD
00002451: MSTORE
00002452: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00
00002473: PUSH1 0x44
00002475: DUP3
00002476: ADD
00002477: MSTORE
00002478: SWAP1
00002479: MLOAD
0000247a: SWAP1
0000247b: DUP2
0000247c: SWAP1
0000247d: SUB
0000247e: PUSH1 0x64
00002480: ADD
00002481: SWAP1
00002482: REVERT
00002483: JUMPDEST
00002484: PUSH1 0x02
00002486: PUSH1 0x65
00002488: SSTORE
00002489: PUSH2 0x2492
0000248c: DUP4
0000248d: DUP6
0000248e: PUSH2 0x35be
00002491: JUMP
00002492: JUMPDEST
00002493: PUSH1 0x40
00002495: DUP1
00002496: MLOAD
00002497: PUSH32 0x4a667eb0782d5566daf0bdf399587241ea093b0424d78811ac44135dd7a8a45d
000024b8: PUSH1 0x20
000024ba: DUP1
000024bb: DUP4
000024bc: ADD
000024bd: SWAP2
000024be: SWAP1
000024bf: SWAP2
000024c0: MSTORE
000024c1: ADDRESS
000024c2: DUP3
000024c3: DUP5
000024c4: ADD
000024c5: MSTORE
000024c6: PUSH1 0x60
000024c8: DUP3
000024c9: ADD
000024ca: DUP11
000024cb: SWAP1
000024cc: MSTORE
000024cd: PUSH1 0x80
000024cf: DUP3
000024d0: ADD
000024d1: DUP10
000024d2: SWAP1
000024d3: MSTORE
000024d4: PUSH1 0xa0
000024d6: DUP3
000024d7: ADD
000024d8: DUP9
000024d9: SWAP1
000024da: MSTORE
000024db: PUSH1 0xc0
000024dd: DUP1
000024de: DUP4
000024df: ADD
000024e0: DUP9
000024e1: SWAP1
000024e2: MSTORE
000024e3: DUP4
000024e4: MLOAD
000024e5: DUP1
000024e6: DUP5
000024e7: SUB
000024e8: SWAP1
000024e9: SWAP2
000024ea: ADD
000024eb: DUP2
000024ec: MSTORE
000024ed: PUSH1 0xe0
000024ef: SWAP1
000024f0: SWAP3
000024f1: ADD
000024f2: SWAP1
000024f3: SWAP3
000024f4: MSTORE
000024f5: DUP1
000024f6: MLOAD
000024f7: SWAP2
000024f8: ADD
000024f9: KECCAK256
000024fa: PUSH1 0x00
000024fc: SWAP1
000024fd: PUSH2 0x2505
00002500: SWAP1
00002501: PUSH2 0x3668
00002504: JUMP
00002505: JUMPDEST
00002506: SWAP1
00002507: POP
00002508: PUSH2 0x2515
0000250b: PUSH1 0x00
0000250d: DUP6
0000250e: GT
0000250f: PUSH1 0x6a
00002511: PUSH2 0x403a
00002514: JUMP
00002515: JUMPDEST
00002516: PUSH2 0x2522
00002519: DUP4
0000251a: DUP5
0000251b: DUP9
0000251c: DUP5
0000251d: DUP7
0000251e: PUSH2 0x36b9
00002521: JUMP
00002522: JUMPDEST
00002523: PUSH2 0x253a
00002526: PUSH10 0x012a27d53bc048700000
00002531: DUP10
00002532: GT
00002533: ISZERO
00002534: PUSH1 0x7b
00002536: PUSH2 0x403a
00002539: JUMP
0000253a: JUMPDEST
0000253b: PUSH1 0x66
0000253d: SLOAD
0000253e: PUSH2 0x2552
00002541: SWAP1
00002542: PUSH1 0x01
00002544: PUSH1 0x01
00002546: PUSH1 0xa0
00002548: SHL
00002549: SUB
0000254a: AND
0000254b: DUP5
0000254c: CALLER
0000254d: DUP8
0000254e: PUSH2 0x3cc6
00002551: JUMP
00002552: JUMPDEST
00002553: PUSH2 0x255f
00002556: DUP4
00002557: DUP10
00002558: DUP10
00002559: PUSH1 0x00
0000255b: PUSH2 0x3e26
0000255e: JUMP
0000255f: JUMPDEST
00002560: POP
00002561: POP
00002562: PUSH1 0x01
00002564: PUSH1 0x65
00002566: SSTORE
00002567: POP
00002568: POP
00002569: POP
0000256a: POP
0000256b: POP
0000256c: POP
0000256d: JUMP
0000256e: JUMPDEST
0000256f: PUSH1 0x02
00002571: PUSH1 0x65
00002573: SLOAD
00002574: EQ
00002575: ISZERO
00002576: PUSH2 0x25c6
00002579: JUMPI
0000257a: PUSH1 0x40
0000257c: DUP1
0000257d: MLOAD
0000257e: PUSH3 0x461bcd
00002582: PUSH1 0xe5
00002584: SHL
00002585: DUP2
00002586: MSTORE
00002587: PUSH1 0x20
00002589: PUSH1 0x04
0000258b: DUP3
0000258c: ADD
0000258d: MSTORE
0000258e: PUSH1 0x1f
00002590: PUSH1 0x24
00002592: DUP3
00002593: ADD
00002594: MSTORE
00002595: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00
000025b6: PUSH1 0x44
000025b8: DUP3
000025b9: ADD
000025ba: MSTORE
000025bb: SWAP1
000025bc: MLOAD
000025bd: SWAP1
000025be: DUP2
000025bf: SWAP1
000025c0: SUB
000025c1: PUSH1 0x64
000025c3: ADD
000025c4: SWAP1
000025c5: REVERT
000025c6: JUMPDEST
000025c7: PUSH1 0x02
000025c9: PUSH1 0x65
000025cb: SSTORE
000025cc: PUSH2 0x25d5
000025cf: DUP4
000025d0: DUP7
000025d1: PUSH2 0x35be
000025d4: JUMP
000025d5: JUMPDEST
000025d6: PUSH1 0x67
000025d8: SLOAD
000025d9: PUSH1 0x40
000025db: DUP1
000025dc: MLOAD
000025dd: PUSH4 0x3d634725
000025e2: PUSH1 0xe2
000025e4: SHL
000025e5: DUP2
000025e6: MSTORE
000025e7: SWAP1
000025e8: MLOAD
000025e9: PUSH1 0x00
000025eb: SWAP3
000025ec: PUSH1 0x01
000025ee: PUSH1 0x01
000025f0: PUSH1 0xa0
000025f2: SHL
000025f3: SUB
000025f4: AND
000025f5: SWAP2
000025f6: PUSH4 0xf58d1c94
000025fb: SWAP2
000025fc: PUSH1 0x04
000025fe: DUP1
000025ff: DUP4
00002600: ADD
00002601: SWAP3
00002602: PUSH1 0x20
00002604: SWAP3
00002605: SWAP2
00002606: SWAP1
00002607: DUP3
00002608: SWAP1
00002609: SUB
0000260a: ADD
0000260b: DUP2
0000260c: DUP7
0000260d: DUP1
0000260e: EXTCODESIZE
0000260f: ISZERO
00002610: DUP1
00002611: ISZERO
00002612: PUSH2 0x261a
00002615: JUMPI
00002616: PUSH1 0x00
00002618: DUP1
00002619: REVERT
0000261a: JUMPDEST
0000261b: POP
0000261c: GAS
0000261d: STATICCALL
0000261e: ISZERO
0000261f: DUP1
00002620: ISZERO
00002621: PUSH2 0x262e
00002624: JUMPI
00002625: RETURNDATASIZE
00002626: PUSH1 0x00
00002628: DUP1
00002629: RETURNDATACOPY
0000262a: RETURNDATASIZE
0000262b: PUSH1 0x00
0000262d: REVERT
0000262e: JUMPDEST
0000262f: POP
00002630: POP
00002631: POP
00002632: POP
00002633: PUSH1 0x40
00002635: MLOAD
00002636: RETURNDATASIZE
00002637: PUSH1 0x20
00002639: DUP2
0000263a: LT
0000263b: ISZERO
0000263c: PUSH2 0x2644
0000263f: JUMPI
00002640: PUSH1 0x00
00002642: DUP1
00002643: REVERT
00002644: JUMPDEST
00002645: POP
00002646: MLOAD
00002647: PUSH1 0x40
00002649: DUP1
0000264a: MLOAD
0000264b: PUSH4 0x0cbefec9
00002650: PUSH1 0xe3
00002652: SHL
00002653: DUP2
00002654: MSTORE
00002655: SWAP1
00002656: MLOAD
00002657: PUSH1 0x01
00002659: PUSH1 0x01
0000265b: PUSH1 0xa0
0000265d: SHL
0000265e: SUB
0000265f: SWAP1
00002660: SWAP3
00002661: AND
00002662: SWAP2
00002663: PUSH4 0x65f7f648
00002668: SWAP2
00002669: PUSH1 0x04
0000266b: DUP1
0000266c: DUP3
0000266d: ADD
0000266e: SWAP3
0000266f: PUSH1 0x20
00002671: SWAP3
00002672: SWAP1
00002673: SWAP2
00002674: SWAP1
00002675: DUP3
00002676: SWAP1
00002677: SUB
00002678: ADD
00002679: DUP2
0000267a: DUP7
0000267b: DUP1
0000267c: EXTCODESIZE
0000267d: ISZERO
0000267e: DUP1
0000267f: ISZERO
00002680: PUSH2 0x2688
00002683: JUMPI
00002684: PUSH1 0x00
00002686: DUP1
00002687: REVERT
00002688: JUMPDEST
00002689: POP
0000268a: GAS
0000268b: STATICCALL
0000268c: ISZERO
0000268d: DUP1
0000268e: ISZERO
0000268f: PUSH2 0x269c
00002692: JUMPI
00002693: RETURNDATASIZE
00002694: PUSH1 0x00
00002696: DUP1
00002697: RETURNDATACOPY
00002698: RETURNDATASIZE
00002699: PUSH1 0x00
0000269b: REVERT
0000269c: JUMPDEST
0000269d: POP
0000269e: POP
0000269f: POP
000026a0: POP
000026a1: PUSH1 0x40
000026a3: MLOAD
000026a4: RETURNDATASIZE
000026a5: PUSH1 0x20
000026a7: DUP2
000026a8: LT
000026a9: ISZERO
000026aa: PUSH2 0x26b2
000026ad: JUMPI
000026ae: PUSH1 0x00
000026b0: DUP1
000026b1: REVERT
000026b2: JUMPDEST
000026b3: DUP2
000026b4: ADD
000026b5: SWAP1
000026b6: DUP1
000026b7: DUP1
000026b8: MLOAD
000026b9: SWAP1
000026ba: PUSH1 0x20
000026bc: ADD
000026bd: SWAP1
000026be: SWAP3
000026bf: SWAP2
000026c0: SWAP1
000026c1: POP
000026c2: POP
000026c3: POP
000026c4: SWAP1
000026c5: POP
000026c6: PUSH1 0x00
000026c8: PUSH2 0x2768
000026cb: PUSH32 0x3b316a46c148535e4353962e052926fc1375db328a64d9bf0d8311a12095015f
000026ec: DUP4
000026ed: DUP15
000026ee: DUP15
000026ef: DUP15
000026f0: DUP15
000026f1: DUP15
000026f2: DUP15
000026f3: DUP13
000026f4: PUSH1 0x40
000026f6: MLOAD
000026f7: PUSH1 0x20
000026f9: ADD
000026fa: DUP1
000026fb: DUP11
000026fc: DUP2
000026fd: MSTORE
000026fe: PUSH1 0x20
00002700: ADD
00002701: DUP10
00002702: PUSH1 0x01
00002704: PUSH1 0x01
00002706: PUSH1 0xa0
00002708: SHL
00002709: SUB
0000270a: AND
0000270b: DUP2
0000270c: MSTORE
0000270d: PUSH1 0x20
0000270f: ADD
00002710: DUP9
00002711: DUP2
00002712: MSTORE
00002713: PUSH1 0x20
00002715: ADD
00002716: DUP8
00002717: DUP2
00002718: MSTORE
00002719: PUSH1 0x20
0000271b: ADD
0000271c: DUP7
0000271d: DUP2
0000271e: MSTORE
0000271f: PUSH1 0x20
00002721: ADD
00002722: DUP6
00002723: DUP2
00002724: MSTORE
00002725: PUSH1 0x20
00002727: ADD
00002728: DUP5
00002729: DUP2
0000272a: MSTORE
0000272b: PUSH1 0x20
0000272d: ADD
0000272e: DUP4
0000272f: DUP2
00002730: MSTORE
00002731: PUSH1 0x20
00002733: ADD
00002734: DUP3
00002735: PUSH1 0x01
00002737: PUSH1 0x01
00002739: PUSH1 0xa0
0000273b: SHL
0000273c: SUB
0000273d: AND
0000273e: DUP2
0000273f: MSTORE
00002740: PUSH1 0x20
00002742: ADD
00002743: SWAP10
00002744: POP
00002745: POP
00002746: POP
00002747: POP
00002748: POP
00002749: POP
0000274a: POP
0000274b: POP
0000274c: POP
0000274d: POP
0000274e: PUSH1 0x40
00002750: MLOAD
00002751: PUSH1 0x20
00002753: DUP2
00002754: DUP4
00002755: SUB
00002756: SUB
00002757: DUP2
00002758: MSTORE
00002759: SWAP1
0000275a: PUSH1 0x40
0000275c: MSTORE
0000275d: DUP1
0000275e: MLOAD
0000275f: SWAP1
00002760: PUSH1 0x20
00002762: ADD
00002763: KECCAK256
00002764: PUSH2 0x3668
00002767: JUMP
00002768: JUMPDEST
00002769: SWAP1
0000276a: POP
0000276b: PUSH2 0x2777
0000276e: DUP5
0000276f: DUP6
00002770: DUP12
00002771: DUP5
00002772: DUP8
00002773: PUSH2 0x36b9
00002776: JUMP
00002777: JUMPDEST
00002778: PUSH2 0x2785
0000277b: PUSH1 0x00
0000277d: DUP7
0000277e: GT
0000277f: PUSH1 0x6a
00002781: PUSH2 0x403a
00002784: JUMP
00002785: JUMPDEST
00002786: PUSH2 0x279d
00002789: PUSH10 0x012a27d53bc048700000
00002794: DUP14
00002795: GT
00002796: ISZERO
00002797: PUSH1 0x7b
00002799: PUSH2 0x403a
0000279c: JUMP
0000279d: JUMPDEST
0000279e: PUSH1 0x66
000027a0: SLOAD
000027a1: PUSH2 0x27b5
000027a4: SWAP1
000027a5: PUSH1 0x01
000027a7: PUSH1 0x01
000027a9: PUSH1 0xa0
000027ab: SHL
000027ac: SUB
000027ad: AND
000027ae: DUP6
000027af: CALLER
000027b0: DUP9
000027b1: PUSH2 0x3cc6
000027b4: JUMP
000027b5: JUMPDEST
000027b6: PUSH2 0x27c2
000027b9: DUP5
000027ba: DUP14
000027bb: DUP14
000027bc: PUSH1 0x01
000027be: PUSH2 0x3e26
000027c1: JUMP
000027c2: JUMPDEST
000027c3: PUSH2 0x27cc
000027c6: DUP3
000027c7: DUP14
000027c8: PUSH2 0x4006
000027cb: JUMP
000027cc: JUMPDEST
000027cd: DUP4
000027ce: PUSH1 0x90
000027d0: PUSH1 0x00
000027d2: PUSH2 0x0100
000027d5: EXP
000027d6: DUP2
000027d7: SLOAD
000027d8: DUP2
000027d9: PUSH1 0x01
000027db: PUSH1 0x01
000027dd: PUSH1 0xa0
000027df: SHL
000027e0: SUB
000027e1: MUL
000027e2: NOT
000027e3: AND
000027e4: SWAP1
000027e5: DUP4
000027e6: PUSH1 0x01
000027e8: PUSH1 0x01
000027ea: PUSH1 0xa0
000027ec: SHL
000027ed: SUB
000027ee: AND
000027ef: MUL
000027f0: OR
000027f1: SWAP1
000027f2: SSTORE
000027f3: POP
000027f4: DUP2
000027f5: PUSH1 0x01
000027f7: PUSH1 0x01
000027f9: PUSH1 0xa0
000027fb: SHL
000027fc: SUB
000027fd: AND
000027fe: PUSH4 0xbe546f5e
00002803: DUP14
00002804: DUP14
00002805: DUP14
00002806: DUP14
00002807: DUP14
00002808: DUP14
00002809: DUP12
0000280a: DUP15
0000280b: ADDRESS
0000280c: DUP14
0000280d: PUSH1 0x40
0000280f: MLOAD
00002810: DUP12
00002811: PUSH4 0xffffffff
00002816: AND
00002817: PUSH1 0xe0
00002819: SHL
0000281a: DUP2
0000281b: MSTORE
0000281c: PUSH1 0x04
0000281e: ADD
0000281f: DUP1
00002820: DUP12
00002821: DUP2
00002822: MSTORE
00002823: PUSH1 0x20
00002825: ADD
00002826: DUP11
00002827: DUP2
00002828: MSTORE
00002829: PUSH1 0x20
0000282b: ADD
0000282c: DUP10
0000282d: DUP2
0000282e: MSTORE
0000282f: PUSH1 0x20
00002831: ADD
00002832: DUP9
00002833: DUP2
00002834: MSTORE
00002835: PUSH1 0x20
00002837: ADD
00002838: DUP8
00002839: DUP2
0000283a: MSTORE
0000283b: PUSH1 0x20
0000283d: ADD
0000283e: DUP7
0000283f: DUP2
00002840: MSTORE
00002841: PUSH1 0x20
00002843: ADD
00002844: DUP6
00002845: PUSH1 0x01
00002847: PUSH1 0x01
00002849: PUSH1 0xa0
0000284b: SHL
0000284c: SUB
0000284d: AND
0000284e: DUP2
0000284f: MSTORE
00002850: PUSH1 0x20
00002852: ADD
00002853: DUP5
00002854: DUP2
00002855: MSTORE
00002856: PUSH1 0x20
00002858: ADD
00002859: DUP4
0000285a: PUSH1 0x01
0000285c: PUSH1 0x01
0000285e: PUSH1 0xa0
00002860: SHL
00002861: SUB
00002862: AND
00002863: DUP2
00002864: MSTORE
00002865: PUSH1 0x20
00002867: ADD
00002868: DUP1
00002869: PUSH1 0x20
0000286b: ADD
0000286c: DUP3
0000286d: DUP2
0000286e: SUB
0000286f: DUP3
00002870: MSTORE
00002871: DUP4
00002872: DUP2
00002873: DUP2
00002874: MLOAD
00002875: DUP2
00002876: MSTORE
00002877: PUSH1 0x20
00002879: ADD
0000287a: SWAP2
0000287b: POP
0000287c: DUP1
0000287d: MLOAD
0000287e: SWAP1
0000287f: PUSH1 0x20
00002881: ADD
00002882: SWAP1
00002883: DUP1
00002884: DUP4
00002885: DUP4
00002886: PUSH1 0x00
00002888: JUMPDEST
00002889: DUP4
0000288a: DUP2
0000288b: LT
0000288c: ISZERO
0000288d: PUSH2 0x28a0
00002890: JUMPI
00002891: DUP2
00002892: DUP2
00002893: ADD
00002894: MLOAD
00002895: DUP4
00002896: DUP3
00002897: ADD
00002898: MSTORE
00002899: PUSH1 0x20
0000289b: ADD
0000289c: PUSH2 0x2888
0000289f: JUMP
000028a0: JUMPDEST
000028a1: POP
000028a2: POP
000028a3: POP
000028a4: POP
000028a5: SWAP1
000028a6: POP
000028a7: SWAP1
000028a8: DUP2
000028a9: ADD
000028aa: SWAP1
000028ab: PUSH1 0x1f
000028ad: AND
000028ae: DUP1
000028af: ISZERO
000028b0: PUSH2 0x28cd
000028b3: JUMPI
000028b4: DUP1
000028b5: DUP3
000028b6: SUB
000028b7: DUP1
000028b8: MLOAD
000028b9: PUSH1 0x01
000028bb: DUP4
000028bc: PUSH1 0x20
000028be: SUB
000028bf: PUSH2 0x0100
000028c2: EXP
000028c3: SUB
000028c4: NOT
000028c5: AND
000028c6: DUP2
000028c7: MSTORE
000028c8: PUSH1 0x20
000028ca: ADD
000028cb: SWAP2
000028cc: POP
000028cd: JUMPDEST
000028ce: POP
000028cf: SWAP12
000028d0: POP
000028d1: POP
000028d2: POP
000028d3: POP
000028d4: POP
000028d5: POP
000028d6: POP
000028d7: POP
000028d8: POP
000028d9: POP
000028da: POP
000028db: POP
000028dc: PUSH1 0x00
000028de: PUSH1 0x40
000028e0: MLOAD
000028e1: DUP1
000028e2: DUP4
000028e3: SUB
000028e4: DUP2
000028e5: PUSH1 0x00
000028e7: DUP8
000028e8: DUP1
000028e9: EXTCODESIZE
000028ea: ISZERO
000028eb: DUP1
000028ec: ISZERO
000028ed: PUSH2 0x28f5
000028f0: JUMPI
000028f1: PUSH1 0x00
000028f3: DUP1
000028f4: REVERT
000028f5: JUMPDEST
000028f6: POP
000028f7: GAS
000028f8: CALL
000028f9: ISZERO
000028fa: DUP1
000028fb: ISZERO
000028fc: PUSH2 0x2909
000028ff: JUMPI
00002900: RETURNDATASIZE
00002901: PUSH1 0x00
00002903: DUP1
00002904: RETURNDATACOPY
00002905: RETURNDATASIZE
00002906: PUSH1 0x00
00002908: REVERT
00002909: JUMPDEST
0000290a: POP
0000290b: POP
0000290c: PUSH1 0x90
0000290e: DUP1
0000290f: SLOAD
00002910: PUSH32 0xffffffffffffffffffffffff0000000000000000000000000000000000000000
00002931: AND
00002932: SWAP1
00002933: SSTORE
00002934: POP
00002935: POP
00002936: PUSH1 0x40
00002938: DUP1
00002939: MLOAD
0000293a: DUP14
0000293b: DUP2
0000293c: MSTORE
0000293d: SWAP1
0000293e: MLOAD
0000293f: PUSH1 0x01
00002941: PUSH1 0x01
00002943: PUSH1 0xa0
00002945: SHL
00002946: SUB
00002947: DUP7
00002948: AND
00002949: SWAP2
0000294a: PUSH32 0x1886d3d8c9b71f99d9224bccca0588192d9d4428b2adab6cfcf70e8a07d4d2f2
0000296b: SWAP2
0000296c: SWAP1
0000296d: DUP2
0000296e: SWAP1
0000296f: SUB
00002970: PUSH1 0x20
00002972: ADD
00002973: SWAP1
00002974: LOG2
00002975: POP
00002976: POP
00002977: PUSH1 0x01
00002979: PUSH1 0x65
0000297b: SSTORE
0000297c: POP
0000297d: POP
0000297e: POP
0000297f: POP
00002980: POP
00002981: POP
00002982: POP
00002983: POP
00002984: POP
00002985: POP
00002986: JUMP
00002987: JUMPDEST
00002988: PUSH1 0x7c
0000298a: SLOAD
0000298b: DUP2
0000298c: JUMP
0000298d: JUMPDEST
0000298e: PUSH1 0x37
00002990: DUP1
00002991: SLOAD
00002992: PUSH1 0x40
00002994: DUP1
00002995: MLOAD
00002996: PUSH1 0x20
00002998: PUSH1 0x1f
0000299a: PUSH1 0x02
0000299c: PUSH1 0x00
0000299e: NOT
0000299f: PUSH2 0x0100
000029a2: PUSH1 0x01
000029a4: DUP9
000029a5: AND
000029a6: ISZERO
000029a7: MUL
000029a8: ADD
000029a9: SWAP1
000029aa: SWAP6
000029ab: AND
000029ac: SWAP5
000029ad: SWAP1
000029ae: SWAP5
000029af: DIV
000029b0: SWAP4
000029b1: DUP5
000029b2: ADD
000029b3: DUP2
000029b4: SWAP1
000029b5: DIV
000029b6: DUP2
000029b7: MUL
000029b8: DUP3
000029b9: ADD
000029ba: DUP2
000029bb: ADD
000029bc: SWAP1
000029bd: SWAP3
000029be: MSTORE
000029bf: DUP3
000029c0: DUP2
000029c1: MSTORE
000029c2: PUSH1 0x60
000029c4: SWAP4
000029c5: SWAP1
000029c6: SWAP3
000029c7: SWAP1
000029c8: SWAP2
000029c9: DUP4
000029ca: ADD
000029cb: DUP3
000029cc: DUP3
000029cd: DUP1
000029ce: ISZERO
000029cf: PUSH2 0x141f
000029d2: JUMPI
000029d3: DUP1
000029d4: PUSH1 0x1f
000029d6: LT
000029d7: PUSH2 0x13f4
000029da: JUMPI
000029db: PUSH2 0x0100
000029de: DUP1
000029df: DUP4
000029e0: SLOAD
000029e1: DIV
000029e2: MUL
000029e3: DUP4
000029e4: MSTORE
000029e5: SWAP2
000029e6: PUSH1 0x20
000029e8: ADD
000029e9: SWAP2
000029ea: PUSH2 0x141f
000029ed: JUMP
000029ee: JUMPDEST
000029ef: PUSH1 0x84
000029f1: SLOAD
000029f2: DUP2
000029f3: JUMP
000029f4: JUMPDEST
000029f5: PUSH1 0x00
000029f7: PUSH2 0x143e
000029fa: PUSH2 0x2a01
000029fd: PUSH2 0x325a
00002a00: JUMP
00002a01: JUMPDEST
00002a02: DUP5
00002a03: PUSH2 0x152c
00002a06: DUP6
00002a07: PUSH1 0x40
00002a09: MLOAD
00002a0a: DUP1
00002a0b: PUSH1 0x60
00002a0d: ADD
00002a0e: PUSH1 0x40
00002a10: MSTORE
00002a11: DUP1
00002a12: PUSH1 0x25
00002a14: DUP2
00002a15: MSTORE
00002a16: PUSH1 0x20
00002a18: ADD
00002a19: PUSH2 0x5c2f
00002a1c: PUSH1 0x25
00002a1e: SWAP2
00002a1f: CODECOPY
00002a20: PUSH1 0x34
00002a22: PUSH1 0x00
00002a24: PUSH2 0x2a2b
00002a27: PUSH2 0x325a
00002a2a: JUMP
00002a2b: JUMPDEST
00002a2c: PUSH1 0x01
00002a2e: PUSH1 0x01
00002a30: PUSH1 0xa0
00002a32: SHL
00002a33: SUB
00002a34: SWAP1
00002a35: DUP2
00002a36: AND
00002a37: DUP3
00002a38: MSTORE
00002a39: PUSH1 0x20
00002a3b: DUP1
00002a3c: DUP4
00002a3d: ADD
00002a3e: SWAP4
00002a3f: SWAP1
00002a40: SWAP4
00002a41: MSTORE
00002a42: PUSH1 0x40
00002a44: SWAP2
00002a45: DUP3
00002a46: ADD
00002a47: PUSH1 0x00
00002a49: SWAP1
00002a4a: DUP2
00002a4b: KECCAK256
00002a4c: SWAP2
00002a4d: DUP14
00002a4e: AND
00002a4f: DUP2
00002a50: MSTORE
00002a51: SWAP3
00002a52: MSTORE
00002a53: SWAP1
00002a54: KECCAK256
00002a55: SLOAD
00002a56: SWAP2
00002a57: SWAP1
00002a58: PUSH2 0x3527
00002a5b: JUMP
00002a5c: JUMPDEST
00002a5d: PUSH1 0x6e
00002a5f: SLOAD
00002a60: DUP2
00002a61: JUMP
00002a62: JUMPDEST
00002a63: PUSH1 0x00
00002a65: PUSH2 0x143e
00002a68: PUSH2 0x2a6f
00002a6b: PUSH2 0x325a
00002a6e: JUMP
00002a6f: JUMPDEST
00002a70: DUP5
00002a71: DUP5
00002a72: PUSH2 0x33ca
00002a75: JUMP
00002a76: JUMPDEST
00002a77: PUSH1 0x77
00002a79: SLOAD
00002a7a: DUP2
00002a7b: JUMP
00002a7c: JUMPDEST
00002a7d: PUSH1 0x8a
00002a7f: SLOAD
00002a80: DUP2
00002a81: JUMP
00002a82: JUMPDEST
00002a83: PUSH1 0x8e
00002a85: SLOAD
00002a86: DUP2
00002a87: JUMP
00002a88: JUMPDEST
00002a89: PUSH1 0x67
00002a8b: SLOAD
00002a8c: PUSH2 0x2a9d
00002a8f: SWAP1
00002a90: PUSH1 0x01
00002a92: PUSH1 0x01
00002a94: PUSH1 0xa0
00002a96: SHL
00002a97: SUB
00002a98: AND
00002a99: PUSH2 0x4319
00002a9c: JUMP
00002a9d: JUMPDEST
00002a9e: PUSH2 0x2aaa
00002aa1: DUP4
00002aa2: DUP3
00002aa3: EQ
00002aa4: PUSH1 0x6a
00002aa6: PUSH2 0x403a
00002aa9: JUMP
00002aaa: JUMPDEST
00002aab: PUSH1 0x00
00002aad: JUMPDEST
00002aae: DUP2
00002aaf: DUP2
00002ab0: LT
00002ab1: ISZERO
00002ab2: PUSH2 0x2af4
00002ab5: JUMPI
00002ab6: PUSH2 0x2aec
00002ab9: DUP6
00002aba: DUP6
00002abb: DUP4
00002abc: DUP2
00002abd: DUP2
00002abe: LT
00002abf: PUSH2 0x2ac4
00002ac2: JUMPI
00002ac3: INVALID
00002ac4: JUMPDEST
00002ac5: SWAP1
00002ac6: POP
00002ac7: PUSH1 0x20
00002ac9: MUL
00002aca: ADD
00002acb: CALLDATALOAD
00002acc: PUSH1 0x01
00002ace: PUSH1 0x01
00002ad0: PUSH1 0xa0
00002ad2: SHL
00002ad3: SUB
00002ad4: AND
00002ad5: DUP5
00002ad6: DUP5
00002ad7: DUP5
00002ad8: DUP2
00002ad9: DUP2
00002ada: LT
00002adb: PUSH2 0x2ae0
00002ade: JUMPI
00002adf: INVALID
00002ae0: JUMPDEST
00002ae1: SWAP1
00002ae2: POP
00002ae3: PUSH1 0x20
00002ae5: MUL
00002ae6: ADD
00002ae7: CALLDATALOAD
00002ae8: PUSH2 0x443e
00002aeb: JUMP
00002aec: JUMPDEST
00002aed: PUSH1 0x01
00002aef: ADD
00002af0: PUSH2 0x2aad
00002af3: JUMP
00002af4: JUMPDEST
00002af5: POP
00002af6: POP
00002af7: POP
00002af8: POP
00002af9: POP
00002afa: JUMP
00002afb: JUMPDEST
00002afc: PUSH1 0x60
00002afe: PUSH1 0x80
00002b00: DUP1
00002b01: SLOAD
00002b02: DUP1
00002b03: PUSH1 0x20
00002b05: MUL
00002b06: PUSH1 0x20
00002b08: ADD
00002b09: PUSH1 0x40
00002b0b: MLOAD
00002b0c: SWAP1
00002b0d: DUP2
00002b0e: ADD
00002b0f: PUSH1 0x40
00002b11: MSTORE
00002b12: DUP1
00002b13: SWAP3
00002b14: SWAP2
00002b15: SWAP1
00002b16: DUP2
00002b17: DUP2
00002b18: MSTORE
00002b19: PUSH1 0x20
00002b1b: ADD
00002b1c: DUP3
00002b1d: DUP1
00002b1e: SLOAD
00002b1f: DUP1
00002b20: ISZERO
00002b21: PUSH2 0x141f
00002b24: JUMPI
00002b25: PUSH1 0x20
00002b27: MUL
00002b28: DUP3
00002b29: ADD
00002b2a: SWAP2
00002b2b: SWAP1
00002b2c: PUSH1 0x00
00002b2e: MSTORE
00002b2f: PUSH1 0x20
00002b31: PUSH1 0x00
00002b33: KECCAK256
00002b34: SWAP1
00002b35: JUMPDEST
00002b36: DUP2
00002b37: SLOAD
00002b38: PUSH1 0x01
00002b3a: PUSH1 0x01
00002b3c: PUSH1 0xa0
00002b3e: SHL
00002b3f: SUB
00002b40: AND
00002b41: DUP2
00002b42: MSTORE
00002b43: PUSH1 0x01
00002b45: SWAP1
00002b46: SWAP2
00002b47: ADD
00002b48: SWAP1
00002b49: PUSH1 0x20
00002b4b: ADD
00002b4c: DUP1
00002b4d: DUP4
00002b4e: GT
00002b4f: PUSH2 0x2b35
00002b52: JUMPI
00002b53: POP
00002b54: POP
00002b55: POP
00002b56: POP
00002b57: POP
00002b58: SWAP1
00002b59: POP
00002b5a: SWAP1
00002b5b: JUMP
00002b5c: JUMPDEST
00002b5d: PUSH1 0x60
00002b5f: PUSH1 0x7f
00002b61: DUP1
00002b62: SLOAD
00002b63: DUP1
00002b64: PUSH1 0x20
00002b66: MUL
00002b67: PUSH1 0x20
00002b69: ADD
00002b6a: PUSH1 0x40
00002b6c: MLOAD
00002b6d: SWAP1
00002b6e: DUP2
00002b6f: ADD
00002b70: PUSH1 0x40
00002b72: MSTORE
00002b73: DUP1
00002b74: SWAP3
00002b75: SWAP2
00002b76: SWAP1
00002b77: DUP2
00002b78: DUP2
00002b79: MSTORE
00002b7a: PUSH1 0x20
00002b7c: ADD
00002b7d: DUP3
00002b7e: DUP1
00002b7f: SLOAD
00002b80: DUP1
00002b81: ISZERO
00002b82: PUSH2 0x141f
00002b85: JUMPI
00002b86: PUSH1 0x20
00002b88: MUL
00002b89: DUP3
00002b8a: ADD
00002b8b: SWAP2
00002b8c: SWAP1
00002b8d: PUSH1 0x00
00002b8f: MSTORE
00002b90: PUSH1 0x20
00002b92: PUSH1 0x00
00002b94: KECCAK256
00002b95: SWAP1
00002b96: DUP2
00002b97: SLOAD
00002b98: PUSH1 0x01
00002b9a: PUSH1 0x01
00002b9c: PUSH1 0xa0
00002b9e: SHL
00002b9f: SUB
00002ba0: AND
00002ba1: DUP2
00002ba2: MSTORE
00002ba3: PUSH1 0x01
00002ba5: SWAP1
00002ba6: SWAP2
00002ba7: ADD
00002ba8: SWAP1
00002ba9: PUSH1 0x20
00002bab: ADD
00002bac: DUP1
00002bad: DUP4
00002bae: GT
00002baf: PUSH2 0x2b35
00002bb2: JUMPI
00002bb3: POP
00002bb4: POP
00002bb5: POP
00002bb6: POP
00002bb7: POP
00002bb8: SWAP1
00002bb9: POP
00002bba: SWAP1
00002bbb: JUMP
00002bbc: JUMPDEST
00002bbd: PUSH1 0x74
00002bbf: SLOAD
00002bc0: DUP2
00002bc1: JUMP
00002bc2: JUMPDEST
00002bc3: PUSH1 0x6b
00002bc5: SLOAD
00002bc6: DUP2
00002bc7: JUMP
00002bc8: JUMPDEST
00002bc9: PUSH1 0x00
00002bcb: DUP1
00002bcc: PUSH1 0x67
00002bce: PUSH1 0x00
00002bd0: SWAP1
00002bd1: SLOAD
00002bd2: SWAP1
00002bd3: PUSH2 0x0100
00002bd6: EXP
00002bd7: SWAP1
00002bd8: DIV
00002bd9: PUSH1 0x01
00002bdb: PUSH1 0x01
00002bdd: PUSH1 0xa0
00002bdf: SHL
00002be0: SUB
00002be1: AND
00002be2: PUSH1 0x01
00002be4: PUSH1 0x01
00002be6: PUSH1 0xa0
00002be8: SHL
00002be9: SUB
00002bea: AND
00002beb: PUSH4 0xf58d1c94
00002bf0: PUSH1 0x40
00002bf2: MLOAD
00002bf3: DUP2
00002bf4: PUSH4 0xffffffff
00002bf9: AND
00002bfa: PUSH1 0xe0
00002bfc: SHL
00002bfd: DUP2
00002bfe: MSTORE
00002bff: PUSH1 0x04
00002c01: ADD
00002c02: PUSH1 0x20
00002c04: PUSH1 0x40
00002c06: MLOAD
00002c07: DUP1
00002c08: DUP4
00002c09: SUB
00002c0a: DUP2
00002c0b: DUP7
00002c0c: DUP1
00002c0d: EXTCODESIZE
00002c0e: ISZERO
00002c0f: DUP1
00002c10: ISZERO
00002c11: PUSH2 0x2c19
00002c14: JUMPI
00002c15: PUSH1 0x00
00002c17: DUP1
00002c18: REVERT
00002c19: JUMPDEST
00002c1a: POP
00002c1b: GAS
00002c1c: STATICCALL
00002c1d: ISZERO
00002c1e: DUP1
00002c1f: ISZERO
00002c20: PUSH2 0x2c2d
00002c23: JUMPI
00002c24: RETURNDATASIZE
00002c25: PUSH1 0x00
00002c27: DUP1
00002c28: RETURNDATACOPY
00002c29: RETURNDATASIZE
00002c2a: PUSH1 0x00
00002c2c: REVERT
00002c2d: JUMPDEST
00002c2e: POP
00002c2f: POP
00002c30: POP
00002c31: POP
00002c32: PUSH1 0x40
00002c34: MLOAD
00002c35: RETURNDATASIZE
00002c36: PUSH1 0x20
00002c38: DUP2
00002c39: LT
00002c3a: ISZERO
00002c3b: PUSH2 0x2c43
00002c3e: JUMPI
00002c3f: PUSH1 0x00
00002c41: DUP1
00002c42: REVERT
00002c43: JUMPDEST
00002c44: POP
00002c45: MLOAD
00002c46: PUSH1 0x40
00002c48: DUP1
00002c49: MLOAD
00002c4a: PUSH4 0x0cbefec9
00002c4f: PUSH1 0xe3
00002c51: SHL
00002c52: DUP2
00002c53: MSTORE
00002c54: SWAP1
00002c55: MLOAD
00002c56: PUSH1 0x01
00002c58: PUSH1 0x01
00002c5a: PUSH1 0xa0
00002c5c: SHL
00002c5d: SUB
00002c5e: SWAP1
00002c5f: SWAP3
00002c60: AND
00002c61: SWAP2
00002c62: PUSH4 0x65f7f648
00002c67: SWAP2
00002c68: PUSH1 0x04
00002c6a: DUP1
00002c6b: DUP3
00002c6c: ADD
00002c6d: SWAP3
00002c6e: PUSH1 0x20
00002c70: SWAP3
00002c71: SWAP1
00002c72: SWAP2
00002c73: SWAP1
00002c74: DUP3
00002c75: SWAP1
00002c76: SUB
00002c77: ADD
00002c78: DUP2
00002c79: DUP7
00002c7a: DUP1
00002c7b: EXTCODESIZE
00002c7c: ISZERO
00002c7d: DUP1
00002c7e: ISZERO
00002c7f: PUSH2 0x2c87
00002c82: JUMPI
00002c83: PUSH1 0x00
00002c85: DUP1
00002c86: REVERT
00002c87: JUMPDEST
00002c88: POP
00002c89: GAS
00002c8a: STATICCALL
00002c8b: ISZERO
00002c8c: DUP1
00002c8d: ISZERO
00002c8e: PUSH2 0x2c9b
00002c91: JUMPI
00002c92: RETURNDATASIZE
00002c93: PUSH1 0x00
00002c95: DUP1
00002c96: RETURNDATACOPY
00002c97: RETURNDATASIZE
00002c98: PUSH1 0x00
00002c9a: REVERT
00002c9b: JUMPDEST
00002c9c: POP
00002c9d: POP
00002c9e: POP
00002c9f: POP
00002ca0: PUSH1 0x40
00002ca2: MLOAD
00002ca3: RETURNDATASIZE
00002ca4: PUSH1 0x20
00002ca6: DUP2
00002ca7: LT
00002ca8: ISZERO
00002ca9: PUSH2 0x2cb1
00002cac: JUMPI
00002cad: PUSH1 0x00
00002caf: DUP1
00002cb0: REVERT
00002cb1: JUMPDEST
00002cb2: POP
00002cb3: MLOAD
00002cb4: SWAP1
00002cb5: POP
00002cb6: PUSH1 0x00
00002cb8: PUSH2 0x2cc0
00002cbb: DUP5
00002cbc: PUSH2 0x2360
00002cbf: JUMP
00002cc0: JUMPDEST
00002cc1: SWAP1
00002cc2: POP
00002cc3: ADDRESS
00002cc4: PUSH1 0x01
00002cc6: PUSH1 0x01
00002cc8: PUSH1 0xa0
00002cca: SHL
00002ccb: SUB
00002ccc: DUP4
00002ccd: AND
00002cce: EQ
00002ccf: PUSH2 0x2cdb
00002cd2: JUMPI
00002cd3: SWAP2
00002cd4: POP
00002cd5: PUSH2 0x237a
00002cd8: SWAP1
00002cd9: POP
00002cda: JUMP
00002cdb: JUMPDEST
00002cdc: PUSH1 0x01
00002cde: PUSH1 0x01
00002ce0: PUSH1 0xa0
00002ce2: SHL
00002ce3: SUB
00002ce4: DUP5
00002ce5: AND
00002ce6: PUSH1 0x00
00002ce8: SWAP1
00002ce9: DUP2
00002cea: MSTORE
00002ceb: PUSH1 0x93
00002ced: PUSH1 0x20
00002cef: MSTORE
00002cf0: PUSH1 0x40
00002cf2: SWAP1
00002cf3: KECCAK256
00002cf4: SLOAD
00002cf5: DUP1
00002cf6: PUSH2 0x2d0e
00002cf9: JUMPI
00002cfa: PUSH2 0x2d04
00002cfd: DUP3
00002cfe: PUSH1 0x08
00002d00: PUSH2 0x40ca
00002d03: JUMP
00002d04: JUMPDEST
00002d05: SWAP4
00002d06: POP
00002d07: POP
00002d08: POP
00002d09: POP
00002d0a: PUSH2 0x237a
00002d0d: JUMP
00002d0e: JUMPDEST
00002d0f: PUSH4 0x0784ce00
00002d14: DUP2
00002d15: LT
00002d16: PUSH2 0x2d23
00002d19: JUMPI
00002d1a: POP
00002d1b: SWAP2
00002d1c: POP
00002d1d: PUSH2 0x237a
00002d20: SWAP1
00002d21: POP
00002d22: JUMP
00002d23: JUMPDEST
00002d24: PUSH2 0x2d3b
00002d27: PUSH2 0x2d34
00002d2a: DUP3
00002d2b: PUSH4 0x0784ce00
00002d30: PUSH2 0x4530
00002d33: JUMP
00002d34: JUMPDEST
00002d35: DUP4
00002d36: SWAP1
00002d37: PUSH2 0x4548
00002d3a: JUMP
00002d3b: JUMPDEST
00002d3c: SWAP6
00002d3d: SWAP5
00002d3e: POP
00002d3f: POP
00002d40: POP
00002d41: POP
00002d42: POP
00002d43: JUMP
00002d44: JUMPDEST
00002d45: PUSH1 0x02
00002d47: PUSH1 0x65
00002d49: SLOAD
00002d4a: EQ
00002d4b: ISZERO
00002d4c: PUSH2 0x2d9c
00002d4f: JUMPI
00002d50: PUSH1 0x40
00002d52: DUP1
00002d53: MLOAD
00002d54: PUSH3 0x461bcd
00002d58: PUSH1 0xe5
00002d5a: SHL
00002d5b: DUP2
00002d5c: MSTORE
00002d5d: PUSH1 0x20
00002d5f: PUSH1 0x04
00002d61: DUP3
00002d62: ADD
00002d63: MSTORE
00002d64: PUSH1 0x1f
00002d66: PUSH1 0x24
00002d68: DUP3
00002d69: ADD
00002d6a: MSTORE
00002d6b: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00
00002d8c: PUSH1 0x44
00002d8e: DUP3
00002d8f: ADD
00002d90: MSTORE
00002d91: SWAP1
00002d92: MLOAD
00002d93: SWAP1
00002d94: DUP2
00002d95: SWAP1
00002d96: SUB
00002d97: PUSH1 0x64
00002d99: ADD
00002d9a: SWAP1
00002d9b: REVERT
00002d9c: JUMPDEST
00002d9d: PUSH1 0x02
00002d9f: PUSH1 0x65
00002da1: SSTORE
00002da2: PUSH1 0x67
00002da4: SLOAD
00002da5: PUSH1 0x40
00002da7: DUP1
00002da8: MLOAD
00002da9: PUSH4 0x364d1181
00002dae: PUSH1 0xe0
00002db0: SHL
00002db1: DUP2
00002db2: MSTORE
00002db3: CALLER
00002db4: PUSH1 0x04
00002db6: DUP3
00002db7: ADD
00002db8: MSTORE
00002db9: SWAP1
00002dba: MLOAD
00002dbb: PUSH2 0x2ded
00002dbe: SWAP3
00002dbf: PUSH1 0x01
00002dc1: PUSH1 0x01
00002dc3: PUSH1 0xa0
00002dc5: SHL
00002dc6: SUB
00002dc7: AND
00002dc8: SWAP2
00002dc9: PUSH4 0x364d1181
00002dce: SWAP2
00002dcf: PUSH1 0x24
00002dd1: DUP1
00002dd2: DUP4
00002dd3: ADD
00002dd4: SWAP3
00002dd5: PUSH1 0x20
00002dd7: SWAP3
00002dd8: SWAP2
00002dd9: SWAP1
00002dda: DUP3
00002ddb: SWAP1
00002ddc: SUB
00002ddd: ADD
00002dde: DUP2
00002ddf: DUP7
00002de0: DUP1
00002de1: EXTCODESIZE
00002de2: ISZERO
00002de3: DUP1
00002de4: ISZERO
00002de5: PUSH2 0x2058
00002de8: JUMPI
00002de9: PUSH1 0x00
00002deb: DUP1
00002dec: REVERT
00002ded: JUMPDEST
00002dee: PUSH1 0x67
00002df0: SLOAD
00002df1: PUSH1 0x40
00002df3: DUP1
00002df4: MLOAD
00002df5: PUSH4 0x3d634725
00002dfa: PUSH1 0xe2
00002dfc: SHL
00002dfd: DUP2
00002dfe: MSTORE
00002dff: SWAP1
00002e00: MLOAD
00002e01: PUSH2 0x2e33
00002e04: SWAP3
00002e05: PUSH1 0x01
00002e07: PUSH1 0x01
00002e09: PUSH1 0xa0
00002e0b: SHL
00002e0c: SUB
00002e0d: AND
00002e0e: SWAP2
00002e0f: PUSH4 0xf58d1c94
00002e14: SWAP2
00002e15: PUSH1 0x04
00002e17: DUP1
00002e18: DUP4
00002e19: ADD
00002e1a: SWAP3
00002e1b: PUSH1 0x20
00002e1d: SWAP3
00002e1e: SWAP2
00002e1f: SWAP1
00002e20: DUP3
00002e21: SWAP1
00002e22: SUB
00002e23: ADD
00002e24: DUP2
00002e25: DUP7
00002e26: DUP1
00002e27: EXTCODESIZE
00002e28: ISZERO
00002e29: DUP1
00002e2a: ISZERO
00002e2b: PUSH2 0x20d1
00002e2e: JUMPI
00002e2f: PUSH1 0x00
00002e31: DUP1
00002e32: REVERT
00002e33: JUMPDEST
00002e34: PUSH1 0x40
00002e36: DUP1
00002e37: MLOAD
00002e38: PUSH32 0x3b316a46c148535e4353962e052926fc1375db328a64d9bf0d8311a12095015f
00002e59: PUSH1 0x20
00002e5b: DUP1
00002e5c: DUP4
00002e5d: ADD
00002e5e: SWAP2
00002e5f: SWAP1
00002e60: SWAP2
00002e61: MSTORE
00002e62: ADDRESS
00002e63: DUP3
00002e64: DUP5
00002e65: ADD
00002e66: MSTORE
00002e67: PUSH1 0x60
00002e69: DUP3
00002e6a: ADD
00002e6b: DUP14
00002e6c: SWAP1
00002e6d: MSTORE
00002e6e: PUSH1 0x80
00002e70: DUP3
00002e71: ADD
00002e72: DUP13
00002e73: SWAP1
00002e74: MSTORE
00002e75: PUSH1 0xa0
00002e77: DUP3
00002e78: ADD
00002e79: DUP12
00002e7a: SWAP1
00002e7b: MSTORE
00002e7c: PUSH1 0xc0
00002e7e: DUP3
00002e7f: ADD
00002e80: DUP11
00002e81: SWAP1
00002e82: MSTORE
00002e83: PUSH1 0xe0
00002e85: DUP3
00002e86: ADD
00002e87: DUP10
00002e88: SWAP1
00002e89: MSTORE
00002e8a: PUSH2 0x0100
00002e8d: DUP3
00002e8e: ADD
00002e8f: DUP9
00002e90: SWAP1
00002e91: MSTORE
00002e92: PUSH1 0x01
00002e94: PUSH1 0x01
00002e96: PUSH1 0xa0
00002e98: SHL
00002e99: SUB
00002e9a: DUP8
00002e9b: AND
00002e9c: PUSH2 0x0120
00002e9f: DUP1
00002ea0: DUP5
00002ea1: ADD
00002ea2: SWAP2
00002ea3: SWAP1
00002ea4: SWAP2
00002ea5: MSTORE
00002ea6: DUP4
00002ea7: MLOAD
00002ea8: DUP1
00002ea9: DUP5
00002eaa: SUB
00002eab: SWAP1
00002eac: SWAP2
00002ead: ADD
00002eae: DUP2
00002eaf: MSTORE
00002eb0: PUSH2 0x0140
00002eb3: SWAP1
00002eb4: SWAP3
00002eb5: ADD
00002eb6: SWAP1
00002eb7: SWAP3
00002eb8: MSTORE
00002eb9: DUP1
00002eba: MLOAD
00002ebb: SWAP2
00002ebc: ADD
00002ebd: KECCAK256
00002ebe: PUSH1 0x00
00002ec0: SWAP1
00002ec1: PUSH2 0x2ec9
00002ec4: SWAP1
00002ec5: PUSH2 0x3668
00002ec8: JUMP
00002ec9: JUMPDEST
00002eca: SWAP1
00002ecb: POP
00002ecc: PUSH2 0x2ed8
00002ecf: DUP4
00002ed0: DUP7
00002ed1: DUP10
00002ed2: DUP5
00002ed3: DUP7
00002ed4: PUSH2 0x36b9
00002ed7: JUMP
00002ed8: JUMPDEST
00002ed9: PUSH2 0x16c6
00002edc: DUP12
00002edd: DUP11
00002ede: DUP8
00002edf: DUP7
00002ee0: DUP9
00002ee1: PUSH1 0x77
00002ee3: SLOAD
00002ee4: PUSH1 0x00
00002ee6: PUSH2 0x37a6
00002ee9: JUMP
00002eea: JUMPDEST
00002eeb: PUSH1 0x75
00002eed: SLOAD
00002eee: DUP2
00002eef: JUMP
00002ef0: JUMPDEST
00002ef1: PUSH1 0x02
00002ef3: PUSH1 0x65
00002ef5: SLOAD
00002ef6: EQ
00002ef7: ISZERO
00002ef8: PUSH2 0x2f48
00002efb: JUMPI
00002efc: PUSH1 0x40
00002efe: DUP1
00002eff: MLOAD
00002f00: PUSH3 0x461bcd
00002f04: PUSH1 0xe5
00002f06: SHL
00002f07: DUP2
00002f08: MSTORE
00002f09: PUSH1 0x20
00002f0b: PUSH1 0x04
00002f0d: DUP3
00002f0e: ADD
00002f0f: MSTORE
00002f10: PUSH1 0x1f
00002f12: PUSH1 0x24
00002f14: DUP3
00002f15: ADD
00002f16: MSTORE
00002f17: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00
00002f38: PUSH1 0x44
00002f3a: DUP3
00002f3b: ADD
00002f3c: MSTORE
00002f3d: SWAP1
00002f3e: MLOAD
00002f3f: SWAP1
00002f40: DUP2
00002f41: SWAP1
00002f42: SUB
00002f43: PUSH1 0x64
00002f45: ADD
00002f46: SWAP1
00002f47: REVERT
00002f48: JUMPDEST
00002f49: PUSH1 0x02
00002f4b: PUSH1 0x65
00002f4d: SSTORE
00002f4e: PUSH2 0x2f57
00002f51: DUP4
00002f52: DUP10
00002f53: PUSH2 0x35be
00002f56: JUMP
00002f57: JUMPDEST
00002f58: PUSH1 0x40
00002f5a: DUP1
00002f5b: MLOAD
00002f5c: PUSH32 0x48e615d8fee5c01aae8a4beb02057e459c71d65cdc5cf029e76a47019d54e5af
00002f7d: PUSH1 0x20
00002f7f: DUP1
00002f80: DUP4
00002f81: ADD
00002f82: SWAP2
00002f83: SWAP1
00002f84: SWAP2
00002f85: MSTORE
00002f86: ADDRESS
00002f87: DUP3
00002f88: DUP5
00002f89: ADD
00002f8a: MSTORE
00002f8b: PUSH1 0x60
00002f8d: DUP3
00002f8e: ADD
00002f8f: DUP15
00002f90: SWAP1
00002f91: MSTORE
00002f92: PUSH1 0x80
00002f94: DUP3
00002f95: ADD
00002f96: DUP14
00002f97: SWAP1
00002f98: MSTORE
00002f99: PUSH1 0xa0
00002f9b: DUP3
00002f9c: ADD
00002f9d: DUP13
00002f9e: SWAP1
00002f9f: MSTORE
00002fa0: PUSH1 0xc0
00002fa2: DUP3
00002fa3: ADD
00002fa4: DUP12
00002fa5: SWAP1
00002fa6: MSTORE
00002fa7: DUP10
00002fa8: ISZERO
00002fa9: ISZERO
00002faa: PUSH1 0xe0
00002fac: DUP1
00002fad: DUP5
00002fae: ADD
00002faf: SWAP2
00002fb0: SWAP1
00002fb1: SWAP2
00002fb2: MSTORE
00002fb3: DUP4
00002fb4: MLOAD
00002fb5: DUP1
00002fb6: DUP5
00002fb7: SUB
00002fb8: SWAP1
00002fb9: SWAP2
00002fba: ADD
00002fbb: DUP2
00002fbc: MSTORE
00002fbd: PUSH2 0x0100
00002fc0: SWAP1
00002fc1: SWAP3
00002fc2: ADD
00002fc3: SWAP1
00002fc4: SWAP3
00002fc5: MSTORE
00002fc6: DUP1
00002fc7: MLOAD
00002fc8: SWAP2
00002fc9: ADD
00002fca: KECCAK256
00002fcb: PUSH1 0x00
00002fcd: SWAP1
00002fce: PUSH2 0x2fd6
00002fd1: SWAP1
00002fd2: PUSH2 0x3668
00002fd5: JUMP
00002fd6: JUMPDEST
00002fd7: SWAP1
00002fd8: POP
00002fd9: PUSH2 0x2fe5
00002fdc: DUP4
00002fdd: DUP5
00002fde: DUP13
00002fdf: DUP5
00002fe0: DUP7
00002fe1: PUSH2 0x36b9
00002fe4: JUMP
00002fe5: JUMPDEST
00002fe6: PUSH2 0x2ffe
00002fe9: DUP13
00002fea: PUSH2 0x2ff3
00002fed: DUP14
00002fee: DUP13
00002fef: PUSH2 0x3796
00002ff2: JUMP
00002ff3: JUMPDEST
00002ff4: DUP6
00002ff5: DUP12
00002ff6: DUP12
00002ff7: DUP12
00002ff8: DUP12
00002ff9: DUP12
00002ffa: PUSH2 0x4560
00002ffd: JUMP
00002ffe: JUMPDEST
00002fff: POP
00003000: POP
00003001: PUSH1 0x01
00003003: PUSH1 0x65
00003005: SSTORE
00003006: POP
00003007: POP
00003008: POP
00003009: POP
0000300a: POP
0000300b: POP
0000300c: POP
0000300d: POP
0000300e: POP
0000300f: POP
00003010: JUMP
00003011: JUMPDEST
00003012: PUSH1 0x8c
00003014: SLOAD
00003015: DUP2
00003016: JUMP
00003017: JUMPDEST
00003018: PUSH1 0x02
0000301a: PUSH1 0x65
0000301c: SLOAD
0000301d: EQ
0000301e: ISZERO
0000301f: PUSH2 0x306f
00003022: JUMPI
00003023: PUSH1 0x40
00003025: DUP1
00003026: MLOAD
00003027: PUSH3 0x461bcd
0000302b: PUSH1 0xe5
0000302d: SHL
0000302e: DUP2
0000302f: MSTORE
00003030: PUSH1 0x20
00003032: PUSH1 0x04
00003034: DUP3
00003035: ADD
00003036: MSTORE
00003037: PUSH1 0x1f
00003039: PUSH1 0x24
0000303b: DUP3
0000303c: ADD
0000303d: MSTORE
0000303e: PUSH32 0x5265656e7472616e637947756172643a207265656e7472616e742063616c6c00
0000305f: PUSH1 0x44
00003061: DUP3
00003062: ADD
00003063: MSTORE
00003064: SWAP1
00003065: MLOAD
00003066: SWAP1
00003067: DUP2
00003068: SWAP1
00003069: SUB
0000306a: PUSH1 0x64
0000306c: ADD
0000306d: SWAP1
0000306e: REVERT
0000306f: JUMPDEST
00003070: PUSH1 0x02
00003072: PUSH1 0x65
00003074: SSTORE
00003075: PUSH2 0x308a
00003078: CALLER
00003079: PUSH1 0x01
0000307b: PUSH1 0x01
0000307d: PUSH1 0xa0
0000307f: SHL
00003080: SUB
00003081: DUP6
00003082: AND
00003083: EQ
00003084: PUSH1 0x0f
00003086: PUSH2 0x403a
00003089: JUMP
0000308a: JUMPDEST
0000308b: PUSH2 0x3113
0000308e: DUP6
0000308f: DUP6
00003090: DUP6
00003091: DUP6
00003092: DUP6
00003093: PUSH2 0x309a
00003096: PUSH2 0x4131
00003099: JUMP
0000309a: JUMPDEST
0000309b: DUP9
0000309c: PUSH2 0x30a6
0000309f: JUMPI
000030a0: PUSH1 0x00
000030a2: PUSH2 0x310c
000030a5: JUMP
000030a6: JUMPDEST
000030a7: DUP8
000030a8: PUSH1 0x01
000030aa: PUSH1 0x01
000030ac: PUSH1 0xa0
000030ae: SHL
000030af: SUB
000030b0: AND
000030b1: PUSH4 0x0126c606
000030b6: PUSH1 0x40
000030b8: MLOAD
000030b9: DUP2
000030ba: PUSH4 0xffffffff
000030bf: AND
000030c0: PUSH1 0xe0
000030c2: SHL
000030c3: DUP2
000030c4: MSTORE
000030c5: PUSH1 0x04
000030c7: ADD
000030c8: PUSH1 0x20
000030ca: PUSH1 0x40
000030cc: MLOAD
000030cd: DUP1
000030ce: DUP4
000030cf: SUB
000030d0: DUP2
000030d1: DUP7
000030d2: DUP1
000030d3: EXTCODESIZE
000030d4: ISZERO
000030d5: DUP1
000030d6: ISZERO
000030d7: PUSH2 0x30df
000030da: JUMPI
000030db: PUSH1 0x00
000030dd: DUP1
000030de: REVERT
000030df: JUMPDEST
000030e0: POP
000030e1: GAS
000030e2: STATICCALL
000030e3: ISZERO
000030e4: DUP1
000030e5: ISZERO
000030e6: PUSH2 0x30f3
000030e9: JUMPI
000030ea: RETURNDATASIZE
000030eb: PUSH1 0x00
000030ed: DUP1
000030ee: RETURNDATACOPY
000030ef: RETURNDATASIZE
000030f0: PUSH1 0x00
000030f2: REVERT
000030f3: JUMPDEST
000030f4: POP
000030f5: POP
000030f6: POP
000030f7: POP
000030f8: PUSH1 0x40
000030fa: MLOAD
000030fb: RETURNDATASIZE
000030fc: PUSH1 0x20
000030fe: DUP2
000030ff: LT
00003100: ISZERO
00003101: PUSH2 0x3109
00003104: JUMPI
00003105: PUSH1 0x00
00003107: DUP1
00003108: REVERT
00003109: JUMPDEST
0000310a: POP
0000310b: MLOAD
0000310c: JUMPDEST
0000310d: PUSH1 0x00
0000310f: PUSH2 0x4560
00003112: JUMP
00003113: JUMPDEST
00003114: POP
00003115: POP
00003116: PUSH1 0x01
00003118: PUSH1 0x65
0000311a: SSTORE
0000311b: POP
0000311c: POP
0000311d: POP
0000311e: JUMP
0000311f: JUMPDEST
00003120: PUSH1 0x01
00003122: PUSH1 0x01
00003124: PUSH1 0xa0
00003126: SHL
00003127: SUB
00003128: SWAP2
00003129: DUP3
0000312a: AND
0000312b: PUSH1 0x00
0000312d: SWAP1
0000312e: DUP2
0000312f: MSTORE
00003130: PUSH1 0x34
00003132: PUSH1 0x20
00003134: SWAP1
00003135: DUP2
00003136: MSTORE
00003137: PUSH1 0x40
00003139: DUP1
0000313a: DUP4
0000313b: KECCAK256
0000313c: SWAP4
0000313d: SWAP1
0000313e: SWAP5
0000313f: AND
00003140: DUP3
00003141: MSTORE
00003142: SWAP2
00003143: SWAP1
00003144: SWAP2
00003145: MSTORE
00003146: KECCAK256
00003147: SLOAD
00003148: SWAP1
00003149: JUMP
0000314a: JUMPDEST
0000314b: PUSH1 0x72
0000314d: SLOAD
0000314e: DUP2
0000314f: JUMP
00003150: JUMPDEST
00003151: PUSH1 0x67
00003153: SLOAD
00003154: PUSH1 0x01
00003156: PUSH1 0x01
00003158: PUSH1 0xa0
0000315a: SHL
0000315b: SUB
0000315c: AND
0000315d: DUP2
0000315e: JUMP
0000315f: JUMPDEST
00003160: PUSH1 0x66
00003162: SLOAD
00003163: PUSH1 0x01
00003165: PUSH1 0x01
00003167: PUSH1 0xa0
00003169: SHL
0000316a: SUB
0000316b: AND
0000316c: DUP2
0000316d: JUMP
0000316e: JUMPDEST
0000316f: PUSH1 0x40
00003171: MLOAD
00003172: PUSH32 0x0d74157700000000000000000000000000000000000000000000000000000000
00003193: DUP2
00003194: MSTORE
00003195: PUSH1 0x00
00003197: SWAP1
00003198: PUSH1 0x01
0000319a: PUSH1 0x01
0000319c: PUSH1 0xa0
0000319e: SHL
0000319f: SUB
000031a0: PUSH32 0x000000000000000000000000aaacb63ab80969af93b811deb81ddeb4c8710591
000031c1: AND
000031c2: SWAP1
000031c3: PUSH4 0x0d741577
000031c8: SWAP1
000031c9: PUSH2 0x31e1
000031cc: SWAP1
000031cd: PUSH1 0x01
000031cf: PUSH1 0x01
000031d1: PUSH1 0xe0
000031d3: SHL
000031d4: SUB
000031d5: NOT
000031d6: DUP6
000031d7: CALLDATALOAD
000031d8: AND
000031d9: SWAP1
000031da: PUSH1 0x04
000031dc: ADD
000031dd: PUSH2 0x59cc
000031e0: JUMP
000031e1: JUMPDEST
000031e2: PUSH1 0x20
000031e4: PUSH1 0x40
000031e6: MLOAD
000031e7: DUP1
000031e8: DUP4
000031e9: SUB
000031ea: DUP2
000031eb: DUP7
000031ec: DUP1
000031ed: EXTCODESIZE
000031ee: ISZERO
000031ef: DUP1
000031f0: ISZERO
000031f1: PUSH2 0x31f9
000031f4: JUMPI
000031f5: PUSH1 0x00
000031f7: DUP1
000031f8: REVERT
000031f9: JUMPDEST
000031fa: POP
000031fb: GAS
000031fc: STATICCALL
000031fd: ISZERO
000031fe: DUP1
000031ff: ISZERO
00003200: PUSH2 0x320d
00003203: JUMPI
00003204: RETURNDATASIZE
00003205: PUSH1 0x00
00003207: DUP1
00003208: RETURNDATACOPY
00003209: RETURNDATASIZE
0000320a: PUSH1 0x00
0000320c: REVERT
0000320d: JUMPDEST
0000320e: POP
0000320f: POP
00003210: POP
00003211: POP
00003212: PUSH1 0x40
00003214: MLOAD
00003215: RETURNDATASIZE
00003216: PUSH1 0x1f
00003218: NOT
00003219: PUSH1 0x1f
0000321b: DUP3
0000321c: ADD
0000321d: AND
0000321e: DUP3
0000321f: ADD
00003220: DUP1
00003221: PUSH1 0x40
00003223: MSTORE
00003224: POP
00003225: DUP2
00003226: ADD
00003227: SWAP1
00003228: PUSH2 0x3231
0000322b: SWAP2
0000322c: SWAP1
0000322d: PUSH2 0x59a5
00003230: JUMP
00003231: JUMPDEST
00003232: SWAP1
00003233: POP
00003234: SWAP1
00003235: JUMP
00003236: JUMPDEST
00003237: CALLDATASIZE
00003238: PUSH1 0x00
0000323a: DUP1
0000323b: CALLDATACOPY
0000323c: PUSH1 0x00
0000323e: DUP1
0000323f: CALLDATASIZE
00003240: PUSH1 0x00
00003242: DUP5
00003243: GAS
00003244: DELEGATECALL
00003245: RETURNDATASIZE
00003246: PUSH1 0x00
00003248: DUP1
00003249: RETURNDATACOPY
0000324a: DUP1
0000324b: DUP1
0000324c: ISZERO
0000324d: PUSH2 0x3255
00003250: JUMPI
00003251: RETURNDATASIZE
00003252: PUSH1 0x00
00003254: RETURN
00003255: JUMPDEST
00003256: RETURNDATASIZE
00003257: PUSH1 0x00
00003259: REVERT
0000325a: JUMPDEST
0000325b: CALLER
0000325c: SWAP1
0000325d: JUMP
0000325e: JUMPDEST
0000325f: PUSH1 0x01
00003261: PUSH1 0x01
00003263: PUSH1 0xa0
00003265: SHL
00003266: SUB
00003267: DUP4
00003268: AND
00003269: PUSH2 0x32a3
0000326c: JUMPI
0000326d: PUSH1 0x40
0000326f: MLOAD
00003270: PUSH3 0x461bcd
00003274: PUSH1 0xe5
00003276: SHL
00003277: DUP2
00003278: MSTORE
00003279: PUSH1 0x04
0000327b: ADD
0000327c: DUP1
0000327d: DUP1
0000327e: PUSH1 0x20
00003280: ADD
00003281: DUP3
00003282: DUP2
00003283: SUB
00003284: DUP3
00003285: MSTORE
00003286: PUSH1 0x24
00003288: DUP2
00003289: MSTORE
0000328a: PUSH1 0x20
0000328c: ADD
0000328d: DUP1
0000328e: PUSH2 0x5bab
00003291: PUSH1 0x24
00003293: SWAP2
00003294: CODECOPY
00003295: PUSH1 0x40
00003297: ADD
00003298: SWAP2
00003299: POP
0000329a: POP
0000329b: PUSH1 0x40
0000329d: MLOAD
0000329e: DUP1
0000329f: SWAP2
000032a0: SUB
000032a1: SWAP1
000032a2: REVERT
000032a3: JUMPDEST
000032a4: PUSH1 0x01
000032a6: PUSH1 0x01
000032a8: PUSH1 0xa0
000032aa: SHL
000032ab: SUB
000032ac: DUP3
000032ad: AND
000032ae: PUSH2 0x32e8
000032b1: JUMPI
000032b2: PUSH1 0x40
000032b4: MLOAD
000032b5: PUSH3 0x461bcd
000032b9: PUSH1 0xe5
000032bb: SHL
000032bc: DUP2
000032bd: MSTORE
000032be: PUSH1 0x04
000032c0: ADD
000032c1: DUP1
000032c2: DUP1
000032c3: PUSH1 0x20
000032c5: ADD
000032c6: DUP3
000032c7: DUP2
000032c8: SUB
000032c9: DUP3
000032ca: MSTORE
000032cb: PUSH1 0x22
000032cd: DUP2
000032ce: MSTORE
000032cf: PUSH1 0x20
000032d1: ADD
000032d2: DUP1
000032d3: PUSH2 0x5a27
000032d6: PUSH1 0x22
000032d8: SWAP2
000032d9: CODECOPY
000032da: PUSH1 0x40
000032dc: ADD
000032dd: SWAP2
000032de: POP
000032df: POP
000032e0: PUSH1 0x40
000032e2: MLOAD
000032e3: DUP1
000032e4: SWAP2
000032e5: SUB
000032e6: SWAP1
000032e7: REVERT
000032e8: JUMPDEST
000032e9: PUSH1 0x01
000032eb: PUSH1 0x01
000032ed: PUSH1 0xa0
000032ef: SHL
000032f0: SUB
000032f1: DUP1
000032f2: DUP5
000032f3: AND
000032f4: PUSH1 0x00
000032f6: DUP2
000032f7: DUP2
000032f8: MSTORE
000032f9: PUSH1 0x34
000032fb: PUSH1 0x20
000032fd: SWAP1
000032fe: DUP2
000032ff: MSTORE
00003300: PUSH1 0x40
00003302: DUP1
00003303: DUP4
00003304: KECCAK256
00003305: SWAP5
00003306: DUP8
00003307: AND
00003308: DUP1
00003309: DUP5
0000330a: MSTORE
0000330b: SWAP5
0000330c: DUP3
0000330d: MSTORE
0000330e: SWAP2
0000330f: DUP3
00003310: SWAP1
00003311: KECCAK256
00003312: DUP6
00003313: SWAP1
00003314: SSTORE
00003315: DUP2
00003316: MLOAD
00003317: DUP6
00003318: DUP2
00003319: MSTORE
0000331a: SWAP2
0000331b: MLOAD
0000331c: PUSH32 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925
0000333d: SWAP3
0000333e: DUP2
0000333f: SWAP1
00003340: SUB
00003341: SWAP1
00003342: SWAP2
00003343: ADD
00003344: SWAP1
00003345: LOG3
00003346: POP
00003347: POP
00003348: POP
00003349: JUMP
0000334a: JUMPDEST
0000334b: PUSH1 0x00
0000334d: DUP2
0000334e: MLOAD
0000334f: PUSH1 0x41
00003351: EQ
00003352: PUSH2 0x33a2
00003355: JUMPI
00003356: PUSH1 0x40
00003358: DUP1
00003359: MLOAD
0000335a: PUSH3 0x461bcd
0000335e: PUSH1 0xe5
00003360: SHL
00003361: DUP2
00003362: MSTORE
00003363: PUSH1 0x20
00003365: PUSH1 0x04
00003367: DUP3
00003368: ADD
00003369: MSTORE
0000336a: PUSH1 0x1f
0000336c: PUSH1 0x24
0000336e: DUP3
0000336f: ADD
00003370: MSTORE
00003371: PUSH32 0x45434453413a20696e76616c6964207369676e6174757265206c656e67746800
00003392: PUSH1 0x44
00003394: DUP3
00003395: ADD
00003396: MSTORE
00003397: SWAP1
00003398: MLOAD
00003399: SWAP1
0000339a: DUP2
0000339b: SWAP1
0000339c: SUB
0000339d: PUSH1 0x64
0000339f: ADD
000033a0: SWAP1
000033a1: REVERT
000033a2: JUMPDEST
000033a3: PUSH1 0x20
000033a5: DUP3
000033a6: ADD
000033a7: MLOAD
000033a8: PUSH1 0x40
000033aa: DUP4
000033ab: ADD
000033ac: MLOAD
000033ad: PUSH1 0x60
000033af: DUP5
000033b0: ADD
000033b1: MLOAD
000033b2: PUSH1 0x00
000033b4: BYTE
000033b5: PUSH2 0x33c0
000033b8: DUP7
000033b9: DUP3
000033ba: DUP6
000033bb: DUP6
000033bc: PUSH2 0x47c8
000033bf: JUMP
000033c0: JUMPDEST
000033c1: SWAP7
000033c2: SWAP6
000033c3: POP
000033c4: POP
000033c5: POP
000033c6: POP
000033c7: POP
000033c8: POP
000033c9: JUMP
000033ca: JUMPDEST
000033cb: PUSH1 0x01
000033cd: PUSH1 0x01
000033cf: PUSH1 0xa0
000033d1: SHL
000033d2: SUB
000033d3: DUP4
000033d4: AND
000033d5: PUSH2 0x340f
000033d8: JUMPI
000033d9: PUSH1 0x40
000033db: MLOAD
000033dc: PUSH3 0x461bcd
000033e0: PUSH1 0xe5
000033e2: SHL
000033e3: DUP2
000033e4: MSTORE
000033e5: PUSH1 0x04
000033e7: ADD
000033e8: DUP1
000033e9: DUP1
000033ea: PUSH1 0x20
000033ec: ADD
000033ed: DUP3
000033ee: DUP2
000033ef: SUB
000033f0: DUP3
000033f1: MSTORE
000033f2: PUSH1 0x25
000033f4: DUP2
000033f5: MSTORE
000033f6: PUSH1 0x20
000033f8: ADD
000033f9: DUP1
000033fa: PUSH2 0x5b86
000033fd: PUSH1 0x25
000033ff: SWAP2
00003400: CODECOPY
00003401: PUSH1 0x40
00003403: ADD
00003404: SWAP2
00003405: POP
00003406: POP
00003407: PUSH1 0x40
00003409: MLOAD
0000340a: DUP1
0000340b: SWAP2
0000340c: SUB
0000340d: SWAP1
0000340e: REVERT
0000340f: JUMPDEST
00003410: PUSH1 0x01
00003412: PUSH1 0x01
00003414: PUSH1 0xa0
00003416: SHL
00003417: SUB
00003418: DUP3
00003419: AND
0000341a: PUSH2 0x3454
0000341d: JUMPI
0000341e: PUSH1 0x40
00003420: MLOAD
00003421: PUSH3 0x461bcd
00003425: PUSH1 0xe5
00003427: SHL
00003428: DUP2
00003429: MSTORE
0000342a: PUSH1 0x04
0000342c: ADD
0000342d: DUP1
0000342e: DUP1
0000342f: PUSH1 0x20
00003431: ADD
00003432: DUP3
00003433: DUP2
00003434: SUB
00003435: DUP3
00003436: MSTORE
00003437: PUSH1 0x23
00003439: DUP2
0000343a: MSTORE
0000343b: PUSH1 0x20
0000343d: ADD
0000343e: DUP1
0000343f: PUSH2 0x59e2
00003442: PUSH1 0x23
00003444: SWAP2
00003445: CODECOPY
00003446: PUSH1 0x40
00003448: ADD
00003449: SWAP2
0000344a: POP
0000344b: POP
0000344c: PUSH1 0x40
0000344e: MLOAD
0000344f: DUP1
00003450: SWAP2
00003451: SUB
00003452: SWAP1
00003453: REVERT
00003454: JUMPDEST
00003455: PUSH2 0x345f
00003458: DUP4
00003459: DUP4
0000345a: DUP4
0000345b: PUSH2 0x493d
0000345e: JUMP
0000345f: JUMPDEST
00003460: PUSH2 0x349c
00003463: DUP2
00003464: PUSH1 0x40
00003466: MLOAD
00003467: DUP1
00003468: PUSH1 0x60
0000346a: ADD
0000346b: PUSH1 0x40
0000346d: MSTORE
0000346e: DUP1
0000346f: PUSH1 0x26
00003471: DUP2
00003472: MSTORE
00003473: PUSH1 0x20
00003475: ADD
00003476: PUSH2 0x5a49
00003479: PUSH1 0x26
0000347b: SWAP2
0000347c: CODECOPY
0000347d: PUSH1 0x01
0000347f: PUSH1 0x01
00003481: PUSH1 0xa0
00003483: SHL
00003484: SUB
00003485: DUP7
00003486: AND
00003487: PUSH1 0x00
00003489: SWAP1
0000348a: DUP2
0000348b: MSTORE
0000348c: PUSH1 0x33
0000348e: PUSH1 0x20
00003490: MSTORE
00003491: PUSH1 0x40
00003493: SWAP1
00003494: KECCAK256
00003495: SLOAD
00003496: SWAP2
00003497: SWAP1
00003498: PUSH2 0x3527
0000349b: JUMP
0000349c: JUMPDEST
0000349d: PUSH1 0x01
0000349f: PUSH1 0x01
000034a1: PUSH1 0xa0
000034a3: SHL
000034a4: SUB
000034a5: DUP1
000034a6: DUP6
000034a7: AND
000034a8: PUSH1 0x00
000034aa: SWAP1
000034ab: DUP2
000034ac: MSTORE
000034ad: PUSH1 0x33
000034af: PUSH1 0x20
000034b1: MSTORE
000034b2: PUSH1 0x40
000034b4: DUP1
000034b5: DUP3
000034b6: KECCAK256
000034b7: SWAP4
000034b8: SWAP1
000034b9: SWAP4
000034ba: SSTORE
000034bb: SWAP1
000034bc: DUP5
000034bd: AND
000034be: DUP2
000034bf: MSTORE
000034c0: KECCAK256
000034c1: SLOAD
000034c2: PUSH2 0x34cb
000034c5: SWAP1
000034c6: DUP3
000034c7: PUSH2 0x3d3f
000034ca: JUMP
000034cb: JUMPDEST
000034cc: PUSH1 0x01
000034ce: PUSH1 0x01
000034d0: PUSH1 0xa0
000034d2: SHL
000034d3: SUB
000034d4: DUP1
000034d5: DUP5
000034d6: AND
000034d7: PUSH1 0x00
000034d9: DUP2
000034da: DUP2
000034db: MSTORE
000034dc: PUSH1 0x33
000034de: PUSH1 0x20
000034e0: SWAP1
000034e1: DUP2
000034e2: MSTORE
000034e3: PUSH1 0x40
000034e5: SWAP2
000034e6: DUP3
000034e7: SWAP1
000034e8: KECCAK256
000034e9: SWAP5
000034ea: SWAP1
000034eb: SWAP5
000034ec: SSTORE
000034ed: DUP1
000034ee: MLOAD
000034ef: DUP6
000034f0: DUP2
000034f1: MSTORE
000034f2: SWAP1
000034f3: MLOAD
000034f4: SWAP2
000034f5: SWAP4
000034f6: SWAP3
000034f7: DUP8
000034f8: AND
000034f9: SWAP3
000034fa: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
0000351b: SWAP3
0000351c: SWAP2
0000351d: DUP3
0000351e: SWAP1
0000351f: SUB
00003520: ADD
00003521: SWAP1
00003522: LOG3
00003523: POP
00003524: POP
00003525: POP
00003526: JUMP
00003527: JUMPDEST
00003528: PUSH1 0x00
0000352a: DUP2
0000352b: DUP5
0000352c: DUP5
0000352d: GT
0000352e: ISZERO
0000352f: PUSH2 0x35b6
00003532: JUMPI
00003533: PUSH1 0x40
00003535: MLOAD
00003536: PUSH3 0x461bcd
0000353a: PUSH1 0xe5
0000353c: SHL
0000353d: DUP2
0000353e: MSTORE
0000353f: PUSH1 0x04
00003541: ADD
00003542: DUP1
00003543: DUP1
00003544: PUSH1 0x20
00003546: ADD
00003547: DUP3
00003548: DUP2
00003549: SUB
0000354a: DUP3
0000354b: MSTORE
0000354c: DUP4
0000354d: DUP2
0000354e: DUP2
0000354f: MLOAD
00003550: DUP2
00003551: MSTORE
00003552: PUSH1 0x20
00003554: ADD
00003555: SWAP2
00003556: POP
00003557: DUP1
00003558: MLOAD
00003559: SWAP1
0000355a: PUSH1 0x20
0000355c: ADD
0000355d: SWAP1
0000355e: DUP1
0000355f: DUP4
00003560: DUP4
00003561: PUSH1 0x00
00003563: JUMPDEST
00003564: DUP4
00003565: DUP2
00003566: LT
00003567: ISZERO
00003568: PUSH2 0x357b
0000356b: JUMPI
0000356c: DUP2
0000356d: DUP2
0000356e: ADD
0000356f: MLOAD
00003570: DUP4
00003571: DUP3
00003572: ADD
00003573: MSTORE
00003574: PUSH1 0x20
00003576: ADD
00003577: PUSH2 0x3563
0000357a: JUMP
0000357b: JUMPDEST
0000357c: POP
0000357d: POP
0000357e: POP
0000357f: POP
00003580: SWAP1
00003581: POP
00003582: SWAP1
00003583: DUP2
00003584: ADD
00003585: SWAP1
00003586: PUSH1 0x1f
00003588: AND
00003589: DUP1
0000358a: ISZERO
0000358b: PUSH2 0x35a8
0000358e: JUMPI
0000358f: DUP1
00003590: DUP3
00003591: SUB
00003592: DUP1
00003593: MLOAD
00003594: PUSH1 0x01
00003596: DUP4
00003597: PUSH1 0x20
00003599: SUB
0000359a: PUSH2 0x0100
0000359d: EXP
0000359e: SUB
0000359f: NOT
000035a0: AND
000035a1: DUP2
000035a2: MSTORE
000035a3: PUSH1 0x20
000035a5: ADD
000035a6: SWAP2
000035a7: POP
000035a8: JUMPDEST
000035a9: POP
000035aa: SWAP3
000035ab: POP
000035ac: POP
000035ad: POP
000035ae: PUSH1 0x40
000035b0: MLOAD
000035b1: DUP1
000035b2: SWAP2
000035b3: SUB
000035b4: SWAP1
000035b5: REVERT
000035b6: JUMPDEST
000035b7: POP
000035b8: POP
000035b9: POP
000035ba: SWAP1
000035bb: SUB
000035bc: SWAP1
000035bd: JUMP
000035be: JUMPDEST
000035bf: PUSH1 0x67
000035c1: SLOAD
000035c2: PUSH1 0x40
000035c4: DUP1
000035c5: MLOAD
000035c6: PUSH32 0x411137c300000000000000000000000000000000000000000000000000000000
000035e7: DUP2
000035e8: MSTORE
000035e9: CALLER
000035ea: PUSH1 0x04
000035ec: DUP3
000035ed: ADD
000035ee: MSTORE
000035ef: SWAP1
000035f0: MLOAD
000035f1: PUSH2 0x3656
000035f4: SWAP3
000035f5: PUSH1 0x01
000035f7: PUSH1 0x01
000035f9: PUSH1 0xa0
000035fb: SHL
000035fc: SUB
000035fd: AND
000035fe: SWAP2
000035ff: PUSH4 0x411137c3
00003604: SWAP2
00003605: PUSH1 0x24
00003607: DUP1
00003608: DUP4
00003609: ADD
0000360a: SWAP3
0000360b: PUSH1 0x20
0000360d: SWAP3
0000360e: SWAP2
0000360f: SWAP1
00003610: DUP3
00003611: SWAP1
00003612: SUB
00003613: ADD
00003614: DUP2
00003615: DUP7
00003616: DUP1
00003617: EXTCODESIZE
00003618: ISZERO
00003619: DUP1
0000361a: ISZERO
0000361b: PUSH2 0x3623
0000361e: JUMPI
0000361f: PUSH1 0x00
00003621: DUP1
00003622: REVERT
00003623: JUMPDEST
00003624: POP
00003625: GAS
00003626: STATICCALL
00003627: ISZERO
00003628: DUP1
00003629: ISZERO
0000362a: PUSH2 0x3637
0000362d: JUMPI
0000362e: RETURNDATASIZE
0000362f: PUSH1 0x00
00003631: DUP1
00003632: RETURNDATACOPY
00003633: RETURNDATASIZE
00003634: PUSH1 0x00
00003636: REVERT
00003637: JUMPDEST
00003638: POP
00003639: POP
0000363a: POP
0000363b: POP
0000363c: PUSH1 0x40
0000363e: MLOAD
0000363f: RETURNDATASIZE
00003640: PUSH1 0x20
00003642: DUP2
00003643: LT
00003644: ISZERO
00003645: PUSH2 0x364d
00003648: JUMPI
00003649: PUSH1 0x00
0000364b: DUP1
0000364c: REVERT
0000364d: JUMPDEST
0000364e: POP
0000364f: MLOAD
00003650: PUSH1 0x12
00003652: PUSH2 0x403a
00003655: JUMP
00003656: JUMPDEST
00003657: PUSH2 0x3664
0000365a: DUP2
0000365b: DUP4
0000365c: GT
0000365d: ISZERO
0000365e: PUSH1 0x13
00003660: PUSH2 0x403a
00003663: JUMP
00003664: JUMPDEST
00003665: POP
00003666: POP
00003667: JUMP
00003668: JUMPDEST
00003669: PUSH1 0x40
0000366b: DUP1
0000366c: MLOAD
0000366d: PUSH32 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000
0000368e: PUSH1 0x20
00003690: DUP1
00003691: DUP4
00003692: ADD
00003693: SWAP2
00003694: SWAP1
00003695: SWAP2
00003696: MSTORE
00003697: PUSH1 0x3c
00003699: DUP1
0000369a: DUP4
0000369b: ADD
0000369c: SWAP5
0000369d: SWAP1
0000369e: SWAP5
0000369f: MSTORE
000036a0: DUP3
000036a1: MLOAD
000036a2: DUP1
000036a3: DUP4
000036a4: SUB
000036a5: SWAP1
000036a6: SWAP5
000036a7: ADD
000036a8: DUP5
000036a9: MSTORE
000036aa: PUSH1 0x5c
000036ac: SWAP1
000036ad: SWAP2
000036ae: ADD
000036af: SWAP1
000036b0: SWAP2
000036b1: MSTORE
000036b2: DUP2
000036b3: MLOAD
000036b4: SWAP2
000036b5: ADD
000036b6: KECCAK256
000036b7: SWAP1
000036b8: JUMP
000036b9: JUMPDEST
000036ba: PUSH1 0x01
000036bc: PUSH1 0x01
000036be: PUSH1 0xa0
000036c0: SHL
000036c1: SUB
000036c2: DUP5
000036c3: AND
000036c4: PUSH1 0x00
000036c6: SWAP1
000036c7: DUP2
000036c8: MSTORE
000036c9: PUSH1 0x71
000036cb: PUSH1 0x20
000036cd: MSTORE
000036ce: PUSH1 0x40
000036d0: SWAP1
000036d1: KECCAK256
000036d2: PUSH1 0x07
000036d4: ADD
000036d5: SLOAD
000036d6: PUSH2 0x36e2
000036d9: SWAP1
000036da: DUP5
000036db: EQ
000036dc: PUSH1 0x59
000036de: PUSH2 0x403a
000036e1: JUMP
000036e2: JUMPDEST
000036e3: PUSH2 0x2af4
000036e6: PUSH2 0x36f9
000036e9: PUSH1 0x01
000036eb: PUSH1 0x01
000036ed: PUSH1 0xa0
000036ef: SHL
000036f0: SUB
000036f1: DUP8
000036f2: AND
000036f3: DUP5
000036f4: DUP5
000036f5: PUSH2 0x4b8e
000036f8: JUMP
000036f9: JUMPDEST
000036fa: PUSH1 0x58
000036fc: PUSH2 0x403a
000036ff: JUMP
00003700: JUMPDEST
00003701: PUSH1 0x00
00003703: PUSH2 0x149e
00003706: DUP3
00003707: PUSH2 0x3790
0000370a: PUSH1 0x66
0000370c: PUSH1 0x00
0000370e: SWAP1
0000370f: SLOAD
00003710: SWAP1
00003711: PUSH2 0x0100
00003714: EXP
00003715: SWAP1
00003716: DIV
00003717: PUSH1 0x01
00003719: PUSH1 0x01
0000371b: PUSH1 0xa0
0000371d: SHL
0000371e: SUB
0000371f: AND
00003720: PUSH1 0x01
00003722: PUSH1 0x01
00003724: PUSH1 0xa0
00003726: SHL
00003727: SUB
00003728: AND
00003729: PUSH4 0x313ce567
0000372e: PUSH1 0x40
00003730: MLOAD
00003731: DUP2
00003732: PUSH4 0xffffffff
00003737: AND
00003738: PUSH1 0xe0
0000373a: SHL
0000373b: DUP2
0000373c: MSTORE
0000373d: PUSH1 0x04
0000373f: ADD
00003740: PUSH1 0x20
00003742: PUSH1 0x40
00003744: MLOAD
00003745: DUP1
00003746: DUP4
00003747: SUB
00003748: DUP2
00003749: DUP7
0000374a: DUP1
0000374b: EXTCODESIZE
0000374c: ISZERO
0000374d: DUP1
0000374e: ISZERO
0000374f: PUSH2 0x3757
00003752: JUMPI
00003753: PUSH1 0x00
00003755: DUP1
00003756: REVERT
00003757: JUMPDEST
00003758: POP
00003759: GAS
0000375a: STATICCALL
0000375b: ISZERO
0000375c: DUP1
0000375d: ISZERO
0000375e: PUSH2 0x376b
00003761: JUMPI
00003762: RETURNDATASIZE
00003763: PUSH1 0x00
00003765: DUP1
00003766: RETURNDATACOPY
00003767: RETURNDATASIZE
00003768: PUSH1 0x00
0000376a: REVERT
0000376b: JUMPDEST
0000376c: POP
0000376d: POP
0000376e: POP
0000376f: POP
00003770: PUSH1 0x40
00003772: MLOAD
00003773: RETURNDATASIZE
00003774: PUSH1 0x20
00003776: DUP2
00003777: LT
00003778: ISZERO
00003779: PUSH2 0x3781
0000377c: JUMPI
0000377d: PUSH1 0x00
0000377f: DUP1
00003780: REVERT
00003781: JUMPDEST
00003782: POP
00003783: MLOAD
00003784: DUP7
00003785: SWAP1
00003786: PUSH1 0xff
00003788: AND
00003789: PUSH1 0x0a
0000378b: EXP
0000378c: PUSH2 0x4530
0000378f: JUMP
00003790: JUMPDEST
00003791: SWAP1
00003792: PUSH2 0x4530
00003795: JUMP
00003796: JUMPDEST
00003797: DUP1
00003798: DUP3
00003799: SUB
0000379a: DUP3
0000379b: DUP2
0000379c: GT
0000379d: ISZERO
0000379e: PUSH2 0x1442
000037a1: JUMPI
000037a2: PUSH1 0x00
000037a4: DUP1
000037a5: REVERT
000037a6: JUMPDEST
000037a7: PUSH2 0x37ae
000037aa: PUSH2 0x4cbd
000037ad: JUMP
000037ae: JUMPDEST
000037af: PUSH2 0x37b7
000037b2: DUP6
000037b3: PUSH2 0x4d56
000037b6: JUMP
000037b7: JUMPDEST
000037b8: PUSH2 0x37c0
000037bb: DUP4
000037bc: PUSH2 0x4d6c
000037bf: JUMP
000037c0: JUMPDEST
000037c1: PUSH1 0x69
000037c3: SLOAD
000037c4: PUSH1 0x00
000037c6: SWAP1
000037c7: PUSH1 0x01
000037c9: PUSH1 0xa8
000037cb: SHL
000037cc: SWAP1
000037cd: DIV
000037ce: PUSH1 0xff
000037d0: AND
000037d1: ISZERO
000037d2: DUP1
000037d3: PUSH2 0x38e7
000037d6: JUMPI
000037d7: POP
000037d8: PUSH1 0x67
000037da: PUSH1 0x00
000037dc: SWAP1
000037dd: SLOAD
000037de: SWAP1
000037df: PUSH2 0x0100
000037e2: EXP
000037e3: SWAP1
000037e4: DIV
000037e5: PUSH1 0x01
000037e7: PUSH1 0x01
000037e9: PUSH1 0xa0
000037eb: SHL
000037ec: SUB
000037ed: AND
000037ee: PUSH1 0x01
000037f0: PUSH1 0x01
000037f2: PUSH1 0xa0
000037f4: SHL
000037f5: SUB
000037f6: AND
000037f7: PUSH4 0x0ebdb9a2
000037fc: PUSH1 0x40
000037fe: MLOAD
000037ff: DUP2
00003800: PUSH4 0xffffffff
00003805: AND
00003806: PUSH1 0xe0
00003808: SHL
00003809: DUP2
0000380a: MSTORE
0000380b: PUSH1 0x04
0000380d: ADD
0000380e: PUSH1 0x20
00003810: PUSH1 0x40
00003812: MLOAD
00003813: DUP1
00003814: DUP4
00003815: SUB
00003816: DUP2
00003817: DUP7
00003818: DUP1
00003819: EXTCODESIZE
0000381a: ISZERO
0000381b: DUP1
0000381c: ISZERO
0000381d: PUSH2 0x3825
00003820: JUMPI
00003821: PUSH1 0x00
00003823: DUP1
00003824: REVERT
00003825: JUMPDEST
00003826: POP
00003827: GAS
00003828: STATICCALL
00003829: ISZERO
0000382a: DUP1
0000382b: ISZERO
0000382c: PUSH2 0x3839
0000382f: JUMPI
00003830: RETURNDATASIZE
00003831: PUSH1 0x00
00003833: DUP1
00003834: RETURNDATACOPY
00003835: RETURNDATASIZE
00003836: PUSH1 0x00
00003838: REVERT
00003839: JUMPDEST
0000383a: POP
0000383b: POP
0000383c: POP
0000383d: POP
0000383e: PUSH1 0x40
00003840: MLOAD
00003841: RETURNDATASIZE
00003842: PUSH1 0x20
00003844: DUP2
00003845: LT
00003846: ISZERO
00003847: PUSH2 0x384f
0000384a: JUMPI
0000384b: PUSH1 0x00
0000384d: DUP1
0000384e: REVERT
0000384f: JUMPDEST
00003850: POP
00003851: MLOAD
00003852: PUSH1 0x40
00003854: DUP1
00003855: MLOAD
00003856: PUSH32 0xc7ec5d5d00000000000000000000000000000000000000000000000000000000
00003877: DUP2
00003878: MSTORE
00003879: ADDRESS
0000387a: PUSH1 0x04
0000387c: DUP3
0000387d: ADD
0000387e: MSTORE
0000387f: PUSH1 0x01
00003881: PUSH1 0x01
00003883: PUSH1 0xa0
00003885: SHL
00003886: SUB
00003887: DUP10
00003888: DUP2
00003889: AND
0000388a: PUSH1 0x24
0000388c: DUP4
0000388d: ADD
0000388e: MSTORE
0000388f: SWAP2
00003890: MLOAD
00003891: SWAP2
00003892: SWAP1
00003893: SWAP3
00003894: AND
00003895: SWAP2
00003896: PUSH4 0xc7ec5d5d
0000389b: SWAP2
0000389c: PUSH1 0x44
0000389e: DUP1
0000389f: DUP4
000038a0: ADD
000038a1: SWAP3
000038a2: PUSH1 0x20
000038a4: SWAP3
000038a5: SWAP2
000038a6: SWAP1
000038a7: DUP3
000038a8: SWAP1
000038a9: SUB
000038aa: ADD
000038ab: DUP2
000038ac: DUP7
000038ad: DUP1
000038ae: EXTCODESIZE
000038af: ISZERO
000038b0: DUP1
000038b1: ISZERO
000038b2: PUSH2 0x38ba
000038b5: JUMPI
000038b6: PUSH1 0x00
000038b8: DUP1
000038b9: REVERT
000038ba: JUMPDEST
000038bb: POP
000038bc: GAS
000038bd: STATICCALL
000038be: ISZERO
000038bf: DUP1
000038c0: ISZERO
000038c1: PUSH2 0x38ce
000038c4: JUMPI
000038c5: RETURNDATASIZE
000038c6: PUSH1 0x00
000038c8: DUP1
000038c9: RETURNDATACOPY
000038ca: RETURNDATASIZE
000038cb: PUSH1 0x00
000038cd: REVERT
000038ce: JUMPDEST
000038cf: POP
000038d0: POP
000038d1: POP
000038d2: POP
000038d3: PUSH1 0x40
000038d5: MLOAD
000038d6: RETURNDATASIZE
000038d7: PUSH1 0x20
000038d9: DUP2
000038da: LT
000038db: ISZERO
000038dc: PUSH2 0x38e4
000038df: JUMPI
000038e0: PUSH1 0x00
000038e2: DUP1
000038e3: REVERT
000038e4: JUMPDEST
000038e5: POP
000038e6: MLOAD
000038e7: JUMPDEST
000038e8: SWAP1
000038e9: POP
000038ea: PUSH2 0x3904
000038ed: PUSH2 0x38f5
000038f0: DUP8
000038f1: PUSH2 0x4e63
000038f4: JUMP
000038f5: JUMPDEST
000038f6: DUP1
000038f7: PUSH2 0x38fd
000038fa: JUMPI
000038fb: POP
000038fc: DUP2
000038fd: JUMPDEST
000038fe: PUSH1 0x1d
00003900: PUSH2 0x403a
00003903: JUMP
00003904: JUMPDEST
00003905: PUSH1 0x74
00003907: SLOAD
00003908: ISZERO
00003909: PUSH2 0x3927
0000390c: JUMPI
0000390d: PUSH2 0x3927
00003910: PUSH1 0x74
00003912: SLOAD
00003913: PUSH2 0x391e
00003916: DUP11
00003917: PUSH2 0x2335
0000391a: PUSH2 0x4f10
0000391d: JUMP
0000391e: JUMPDEST
0000391f: GT
00003920: ISZERO
00003921: PUSH1 0x00
00003923: PUSH2 0x403a
00003926: JUMP
00003927: JUMPDEST
00003928: PUSH2 0x3935
0000392b: DUP4
0000392c: DUP10
0000392d: LT
0000392e: ISZERO
0000392f: PUSH1 0x01
00003931: PUSH2 0x403a
00003934: JUMP
00003935: JUMPDEST
00003936: PUSH1 0x66
00003938: SLOAD
00003939: PUSH1 0x40
0000393b: DUP1
0000393c: MLOAD
0000393d: PUSH4 0x70a08231
00003942: PUSH1 0xe0
00003944: SHL
00003945: DUP2
00003946: MSTORE
00003947: ADDRESS
00003948: PUSH1 0x04
0000394a: DUP3
0000394b: ADD
0000394c: MSTORE
0000394d: SWAP1
0000394e: MLOAD
0000394f: PUSH1 0x00
00003951: SWAP3
00003952: PUSH1 0x01
00003954: PUSH1 0x01
00003956: PUSH1 0xa0
00003958: SHL
00003959: SUB
0000395a: AND
0000395b: SWAP2
0000395c: PUSH4 0x70a08231
00003961: SWAP2
00003962: PUSH1 0x24
00003964: DUP1
00003965: DUP4
00003966: ADD
00003967: SWAP3
00003968: PUSH1 0x20
0000396a: SWAP3
0000396b: SWAP2
0000396c: SWAP1
0000396d: DUP3
0000396e: SWAP1
0000396f: SUB
00003970: ADD
00003971: DUP2
00003972: DUP7
00003973: DUP1
00003974: EXTCODESIZE
00003975: ISZERO
00003976: DUP1
00003977: ISZERO
00003978: PUSH2 0x3980
0000397b: JUMPI
0000397c: PUSH1 0x00
0000397e: DUP1
0000397f: REVERT
00003980: JUMPDEST
00003981: POP
00003982: GAS
00003983: STATICCALL
00003984: ISZERO
00003985: DUP1
00003986: ISZERO
00003987: PUSH2 0x3994
0000398a: JUMPI
0000398b: RETURNDATASIZE
0000398c: PUSH1 0x00
0000398e: DUP1
0000398f: RETURNDATACOPY
00003990: RETURNDATASIZE
00003991: PUSH1 0x00
00003993: REVERT
00003994: JUMPDEST
00003995: POP
00003996: POP
00003997: POP
00003998: POP
00003999: PUSH1 0x40
0000399b: MLOAD
0000399c: RETURNDATASIZE
0000399d: PUSH1 0x20
0000399f: DUP2
000039a0: LT
000039a1: ISZERO
000039a2: PUSH2 0x39aa
000039a5: JUMPI
000039a6: PUSH1 0x00
000039a8: DUP1
000039a9: REVERT
000039aa: JUMPDEST
000039ab: POP
000039ac: MLOAD
000039ad: PUSH1 0x66
000039af: SLOAD
000039b0: SWAP1
000039b1: SWAP2
000039b2: POP
000039b3: PUSH1 0x01
000039b5: PUSH1 0x01
000039b7: PUSH1 0xa0
000039b9: SHL
000039ba: SUB
000039bb: AND
000039bc: PUSH20 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
000039d1: EQ
000039d2: DUP1
000039d3: ISZERO
000039d4: PUSH2 0x39dd
000039d7: JUMPI
000039d8: POP
000039d9: PUSH1 0x00
000039db: CALLVALUE
000039dc: GT
000039dd: JUMPDEST
000039de: ISZERO
000039df: PUSH2 0x3a4f
000039e2: JUMPI
000039e3: PUSH20 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
000039f8: PUSH1 0x01
000039fa: PUSH1 0x01
000039fc: PUSH1 0xa0
000039fe: SHL
000039ff: SUB
00003a00: AND
00003a01: PUSH4 0xd0e30db0
00003a06: CALLVALUE
00003a07: PUSH1 0x40
00003a09: MLOAD
00003a0a: DUP3
00003a0b: PUSH4 0xffffffff
00003a10: AND
00003a11: PUSH1 0xe0
00003a13: SHL
00003a14: DUP2
00003a15: MSTORE
00003a16: PUSH1 0x04
00003a18: ADD
00003a19: PUSH1 0x00
00003a1b: PUSH1 0x40
00003a1d: MLOAD
00003a1e: DUP1
00003a1f: DUP4
00003a20: SUB
00003a21: DUP2
00003a22: DUP6
00003a23: DUP9
00003a24: DUP1
00003a25: EXTCODESIZE
00003a26: ISZERO
00003a27: DUP1
00003a28: ISZERO
00003a29: PUSH2 0x3a31
00003a2c: JUMPI
00003a2d: PUSH1 0x00
00003a2f: DUP1
00003a30: REVERT
00003a31: JUMPDEST
00003a32: POP
00003a33: GAS
00003a34: CALL
00003a35: ISZERO
00003a36: DUP1
00003a37: ISZERO
00003a38: PUSH2 0x3a45
00003a3b: JUMPI
00003a3c: RETURNDATASIZE
00003a3d: PUSH1 0x00
00003a3f: DUP1
00003a40: RETURNDATACOPY
00003a41: RETURNDATASIZE
00003a42: PUSH1 0x00
00003a44: REVERT
00003a45: JUMPDEST
00003a46: POP
00003a47: POP
00003a48: POP
00003a49: POP
00003a4a: POP
00003a4b: PUSH2 0x3a67
00003a4e: JUMP
00003a4f: JUMPDEST
00003a50: PUSH1 0x66
00003a52: SLOAD
00003a53: PUSH2 0x3a67
00003a56: SWAP1
00003a57: PUSH1 0x01
00003a59: PUSH1 0x01
00003a5b: PUSH1 0xa0
00003a5d: SHL
00003a5e: SUB
00003a5f: AND
00003a60: DUP8
00003a61: ADDRESS
00003a62: DUP13
00003a63: PUSH2 0x3cc6
00003a66: JUMP
00003a67: JUMPDEST
00003a68: PUSH1 0x66
00003a6a: SLOAD
00003a6b: PUSH1 0x40
00003a6d: DUP1
00003a6e: MLOAD
00003a6f: PUSH4 0x70a08231
00003a74: PUSH1 0xe0
00003a76: SHL
00003a77: DUP2
00003a78: MSTORE
00003a79: ADDRESS
00003a7a: PUSH1 0x04
00003a7c: DUP3
00003a7d: ADD
00003a7e: MSTORE
00003a7f: SWAP1
00003a80: MLOAD
00003a81: PUSH2 0x3af5
00003a84: SWAP3
00003a85: DUP13
00003a86: SWAP3
00003a87: PUSH2 0x3aed
00003a8a: SWAP3
00003a8b: DUP7
00003a8c: SWAP3
00003a8d: PUSH1 0x01
00003a8f: PUSH1 0x01
00003a91: PUSH1 0xa0
00003a93: SHL
00003a94: SUB
00003a95: AND
00003a96: SWAP2
00003a97: PUSH4 0x70a08231
00003a9c: SWAP2
00003a9d: PUSH1 0x24
00003a9f: DUP1
00003aa0: DUP4
00003aa1: ADD
00003aa2: SWAP3
00003aa3: PUSH1 0x20
00003aa5: SWAP3
00003aa6: SWAP2
00003aa7: SWAP1
00003aa8: DUP3
00003aa9: SWAP1
00003aaa: SUB
00003aab: ADD
00003aac: DUP2
00003aad: DUP7
00003aae: DUP1
00003aaf: EXTCODESIZE
00003ab0: ISZERO
00003ab1: DUP1
00003ab2: ISZERO
00003ab3: PUSH2 0x3abb
00003ab6: JUMPI
00003ab7: PUSH1 0x00
00003ab9: DUP1
00003aba: REVERT
00003abb: JUMPDEST
00003abc: POP
00003abd: GAS
00003abe: STATICCALL
00003abf: ISZERO
00003ac0: DUP1
00003ac1: ISZERO
00003ac2: PUSH2 0x3acf
00003ac5: JUMPI
00003ac6: RETURNDATASIZE
00003ac7: PUSH1 0x00
00003ac9: DUP1
00003aca: RETURNDATACOPY
00003acb: RETURNDATASIZE
00003acc: PUSH1 0x00
00003ace: REVERT
00003acf: JUMPDEST
00003ad0: POP
00003ad1: POP
00003ad2: POP
00003ad3: POP
00003ad4: PUSH1 0x40
00003ad6: MLOAD
00003ad7: RETURNDATASIZE
00003ad8: PUSH1 0x20
00003ada: DUP2
00003adb: LT
00003adc: ISZERO
00003add: PUSH2 0x3ae5
00003ae0: JUMPI
00003ae1: PUSH1 0x00
00003ae3: DUP1
00003ae4: REVERT
00003ae5: JUMPDEST
00003ae6: POP
00003ae7: MLOAD
00003ae8: SWAP1
00003ae9: PUSH2 0x3796
00003aec: JUMP
00003aed: JUMPDEST
00003aee: EQ
00003aef: PUSH1 0x05
00003af1: PUSH2 0x403a
00003af4: JUMP
00003af5: JUMPDEST
00003af6: PUSH1 0x00
00003af8: PUSH2 0x3b00
00003afb: DUP9
00003afc: PUSH2 0x2360
00003aff: JUMP
00003b00: JUMPDEST
00003b01: SWAP1
00003b02: POP
00003b03: PUSH1 0x00
00003b05: PUSH2 0x3b8e
00003b08: PUSH1 0x66
00003b0a: PUSH1 0x00
00003b0c: SWAP1
00003b0d: SLOAD
00003b0e: SWAP1
00003b0f: PUSH2 0x0100
00003b12: EXP
00003b13: SWAP1
00003b14: DIV
00003b15: PUSH1 0x01
00003b17: PUSH1 0x01
00003b19: PUSH1 0xa0
00003b1b: SHL
00003b1c: SUB
00003b1d: AND
00003b1e: PUSH1 0x01
00003b20: PUSH1 0x01
00003b22: PUSH1 0xa0
00003b24: SHL
00003b25: SUB
00003b26: AND
00003b27: PUSH4 0x313ce567
00003b2c: PUSH1 0x40
00003b2e: MLOAD
00003b2f: DUP2
00003b30: PUSH4 0xffffffff
00003b35: AND
00003b36: PUSH1 0xe0
00003b38: SHL
00003b39: DUP2
00003b3a: MSTORE
00003b3b: PUSH1 0x04
00003b3d: ADD
00003b3e: PUSH1 0x20
00003b40: PUSH1 0x40
00003b42: MLOAD
00003b43: DUP1
00003b44: DUP4
00003b45: SUB
00003b46: DUP2
00003b47: DUP7
00003b48: DUP1
00003b49: EXTCODESIZE
00003b4a: ISZERO
00003b4b: DUP1
00003b4c: ISZERO
00003b4d: PUSH2 0x3b55
00003b50: JUMPI
00003b51: PUSH1 0x00
00003b53: DUP1
00003b54: REVERT
00003b55: JUMPDEST
00003b56: POP
00003b57: GAS
00003b58: STATICCALL
00003b59: ISZERO
00003b5a: DUP1
00003b5b: ISZERO
00003b5c: PUSH2 0x3b69
00003b5f: JUMPI
00003b60: RETURNDATASIZE
00003b61: PUSH1 0x00
00003b63: DUP1
00003b64: RETURNDATACOPY
00003b65: RETURNDATASIZE
00003b66: PUSH1 0x00
00003b68: REVERT
00003b69: JUMPDEST
00003b6a: POP
00003b6b: POP
00003b6c: POP
00003b6d: POP
00003b6e: PUSH1 0x40
00003b70: MLOAD
00003b71: RETURNDATASIZE
00003b72: PUSH1 0x20
00003b74: DUP2
00003b75: LT
00003b76: ISZERO
00003b77: PUSH2 0x3b7f
00003b7a: JUMPI
00003b7b: PUSH1 0x00
00003b7d: DUP1
00003b7e: REVERT
00003b7f: JUMPDEST
00003b80: POP
00003b81: MLOAD
00003b82: DUP13
00003b83: SWAP1
00003b84: PUSH1 0xff
00003b86: AND
00003b87: PUSH1 0x0a
00003b89: EXP
00003b8a: PUSH2 0x4530
00003b8d: JUMP
00003b8e: JUMPDEST
00003b8f: SWAP1
00003b90: POP
00003b91: PUSH1 0x00
00003b93: PUSH2 0x3b9c
00003b96: DUP3
00003b97: DUP10
00003b98: PUSH2 0x4530
00003b9b: JUMP
00003b9c: JUMPDEST
00003b9d: SWAP1
00003b9e: POP
00003b9f: PUSH2 0x3bac
00003ba2: DUP12
00003ba3: DUP3
00003ba4: LT
00003ba5: ISZERO
00003ba6: PUSH1 0x56
00003ba8: PUSH2 0x403a
00003bab: JUMP
00003bac: JUMPDEST
00003bad: PUSH2 0x3bb6
00003bb0: DUP11
00003bb1: DUP3
00003bb2: PUSH2 0x443e
00003bb5: JUMP
00003bb6: JUMPDEST
00003bb7: PUSH1 0x67
00003bb9: SLOAD
00003bba: PUSH1 0x01
00003bbc: PUSH1 0x01
00003bbe: PUSH1 0xa0
00003bc0: SHL
00003bc1: SUB
00003bc2: SWAP1
00003bc3: DUP2
00003bc4: AND
00003bc5: SWAP1
00003bc6: PUSH4 0xc432ae45
00003bcb: SWAP1
00003bcc: DUP12
00003bcd: SWAP1
00003bce: DUP10
00003bcf: AND
00003bd0: PUSH2 0x3bd9
00003bd3: JUMPI
00003bd4: DUP12
00003bd5: PUSH2 0x3bdb
00003bd8: JUMP
00003bd9: JUMPDEST
00003bda: DUP9
00003bdb: JUMPDEST
00003bdc: DUP16
00003bdd: PUSH1 0x40
00003bdf: MLOAD
00003be0: DUP5
00003be1: PUSH4 0xffffffff
00003be6: AND
00003be7: PUSH1 0xe0
00003be9: SHL
00003bea: DUP2
00003beb: MSTORE
00003bec: PUSH1 0x04
00003bee: ADD
00003bef: DUP1
00003bf0: DUP5
00003bf1: PUSH1 0x01
00003bf3: PUSH1 0x01
00003bf5: PUSH1 0xa0
00003bf7: SHL
00003bf8: SUB
00003bf9: AND
00003bfa: DUP2
00003bfb: MSTORE
00003bfc: PUSH1 0x20
00003bfe: ADD
00003bff: DUP4
00003c00: PUSH1 0x01
00003c02: PUSH1 0x01
00003c04: PUSH1 0xa0
00003c06: SHL
00003c07: SUB
00003c08: AND
00003c09: DUP2
00003c0a: MSTORE
00003c0b: PUSH1 0x20
00003c0d: ADD
00003c0e: DUP3
00003c0f: DUP2
00003c10: MSTORE
00003c11: PUSH1 0x20
00003c13: ADD
00003c14: SWAP4
00003c15: POP
00003c16: POP
00003c17: POP
00003c18: POP
00003c19: PUSH1 0x00
00003c1b: PUSH1 0x40
00003c1d: MLOAD
00003c1e: DUP1
00003c1f: DUP4
00003c20: SUB
00003c21: DUP2
00003c22: PUSH1 0x00
00003c24: DUP8
00003c25: DUP1
00003c26: EXTCODESIZE
00003c27: ISZERO
00003c28: DUP1
00003c29: ISZERO
00003c2a: PUSH2 0x3c32
00003c2d: JUMPI
00003c2e: PUSH1 0x00
00003c30: DUP1
00003c31: REVERT
00003c32: JUMPDEST
00003c33: POP
00003c34: GAS
00003c35: CALL
00003c36: ISZERO
00003c37: DUP1
00003c38: ISZERO
00003c39: PUSH2 0x3c46
00003c3c: JUMPI
00003c3d: RETURNDATASIZE
00003c3e: PUSH1 0x00
00003c40: DUP1
00003c41: RETURNDATACOPY
00003c42: RETURNDATASIZE
00003c43: PUSH1 0x00
00003c45: REVERT
00003c46: JUMPDEST
00003c47: POP
00003c48: POP
00003c49: POP
00003c4a: POP
00003c4b: PUSH2 0x3c56
00003c4e: DUP11
00003c4f: DUP5
00003c50: DUP15
00003c51: DUP5
00003c52: PUSH2 0x4f8e
00003c55: JUMP
00003c56: JUMPDEST
00003c57: PUSH1 0x01
00003c59: PUSH1 0x01
00003c5b: PUSH1 0xa0
00003c5d: SHL
00003c5e: SUB
00003c5f: DUP11
00003c60: AND
00003c61: PUSH1 0x00
00003c63: DUP2
00003c64: DUP2
00003c65: MSTORE
00003c66: PUSH1 0x71
00003c68: PUSH1 0x20
00003c6a: SWAP1
00003c6b: DUP2
00003c6c: MSTORE
00003c6d: PUSH1 0x40
00003c6f: SWAP2
00003c70: DUP3
00003c71: SWAP1
00003c72: KECCAK256
00003c73: PUSH1 0x07
00003c75: ADD
00003c76: DUP1
00003c77: SLOAD
00003c78: PUSH1 0x01
00003c7a: ADD
00003c7b: SWAP1
00003c7c: SSTORE
00003c7d: DUP2
00003c7e: MLOAD
00003c7f: DUP15
00003c80: DUP2
00003c81: MSTORE
00003c82: SWAP1
00003c83: DUP2
00003c84: ADD
00003c85: DUP16
00003c86: SWAP1
00003c87: MSTORE
00003c88: TIMESTAMP
00003c89: DUP2
00003c8a: DUP4
00003c8b: ADD
00003c8c: MSTORE
00003c8d: SWAP1
00003c8e: MLOAD
00003c8f: PUSH32 0x8d878fd0c5092c0e518d34fa1f3d23c8b3a1b2b7f86174bdba0ceaabf68b5a53
00003cb0: SWAP2
00003cb1: DUP2
00003cb2: SWAP1
00003cb3: SUB
00003cb4: PUSH1 0x60
00003cb6: ADD
00003cb7: SWAP1
00003cb8: LOG2
00003cb9: POP
00003cba: POP
00003cbb: POP
00003cbc: POP
00003cbd: POP
00003cbe: POP
00003cbf: POP
00003cc0: POP
00003cc1: POP
00003cc2: POP
00003cc3: POP
00003cc4: POP
00003cc5: JUMP
00003cc6: JUMPDEST
00003cc7: PUSH1 0x40
00003cc9: DUP1
00003cca: MLOAD
00003ccb: PUSH1 0x01
00003ccd: PUSH1 0x01
00003ccf: PUSH1 0xa0
00003cd1: SHL
00003cd2: SUB
00003cd3: DUP1
00003cd4: DUP7
00003cd5: AND
00003cd6: PUSH1 0x24
00003cd8: DUP4
00003cd9: ADD
00003cda: MSTORE
00003cdb: DUP5
00003cdc: AND
00003cdd: PUSH1 0x44
00003cdf: DUP3
00003ce0: ADD
00003ce1: MSTORE
00003ce2: PUSH1 0x64
00003ce4: DUP1
00003ce5: DUP3
00003ce6: ADD
00003ce7: DUP5
00003ce8: SWAP1
00003ce9: MSTORE
00003cea: DUP3
00003ceb: MLOAD
00003cec: DUP1
00003ced: DUP4
00003cee: SUB
00003cef: SWAP1
00003cf0: SWAP2
00003cf1: ADD
00003cf2: DUP2
00003cf3: MSTORE
00003cf4: PUSH1 0x84
00003cf6: SWAP1
00003cf7: SWAP2
00003cf8: ADD
00003cf9: SWAP1
00003cfa: SWAP2
00003cfb: MSTORE
00003cfc: PUSH1 0x20
00003cfe: DUP2
00003cff: ADD
00003d00: DUP1
00003d01: MLOAD
00003d02: PUSH1 0x01
00003d04: PUSH1 0x01
00003d06: PUSH1 0xe0
00003d08: SHL
00003d09: SUB
00003d0a: AND
00003d0b: PUSH32 0x23b872dd00000000000000000000000000000000000000000000000000000000
00003d2c: OR
00003d2d: SWAP1
00003d2e: MSTORE
00003d2f: PUSH2 0x3d39
00003d32: SWAP1
00003d33: DUP6
00003d34: SWAP1
00003d35: PUSH2 0x5071
00003d38: JUMP
00003d39: JUMPDEST
00003d3a: POP
00003d3b: POP
00003d3c: POP
00003d3d: POP
00003d3e: JUMP
00003d3f: JUMPDEST
00003d40: PUSH1 0x00
00003d42: DUP3
00003d43: DUP3
00003d44: ADD
00003d45: DUP4
00003d46: DUP2
00003d47: LT
00003d48: ISZERO
00003d49: PUSH2 0x149e
00003d4c: JUMPI
00003d4d: PUSH1 0x40
00003d4f: DUP1
00003d50: MLOAD
00003d51: PUSH3 0x461bcd
00003d55: PUSH1 0xe5
00003d57: SHL
00003d58: DUP2
00003d59: MSTORE
00003d5a: PUSH1 0x20
00003d5c: PUSH1 0x04
00003d5e: DUP3
00003d5f: ADD
00003d60: MSTORE
00003d61: PUSH1 0x1b
00003d63: PUSH1 0x24
00003d65: DUP3
00003d66: ADD
00003d67: MSTORE
00003d68: PUSH32 0x536166654d6174683a206164646974696f6e206f766572666c6f770000000000
00003d89: PUSH1 0x44
00003d8b: DUP3
00003d8c: ADD
00003d8d: MSTORE
00003d8e: SWAP1
00003d8f: MLOAD
00003d90: SWAP1
00003d91: DUP2
00003d92: SWAP1
00003d93: SUB
00003d94: PUSH1 0x64
00003d96: ADD
00003d97: SWAP1
00003d98: REVERT
00003d99: JUMPDEST
00003d9a: PUSH2 0x3da7
00003d9d: PUSH1 0x14
00003d9f: DUP3
00003da0: LT
00003da1: PUSH1 0x28
00003da3: PUSH2 0x403a
00003da6: JUMP
00003da7: JUMPDEST
00003da8: PUSH1 0x00
00003daa: JUMPDEST
00003dab: DUP2
00003dac: DUP2
00003dad: LT
00003dae: ISZERO
00003daf: PUSH2 0x2007
00003db2: JUMPI
00003db3: PUSH1 0x01
00003db5: DUP2
00003db6: ADD
00003db7: JUMPDEST
00003db8: DUP3
00003db9: DUP2
00003dba: LT
00003dbb: ISZERO
00003dbc: PUSH2 0x3e1d
00003dbf: JUMPI
00003dc0: PUSH2 0x3e15
00003dc3: DUP5
00003dc4: DUP5
00003dc5: DUP4
00003dc6: DUP2
00003dc7: DUP2
00003dc8: LT
00003dc9: PUSH2 0x3dce
00003dcc: JUMPI
00003dcd: INVALID
00003dce: JUMPDEST
00003dcf: SWAP1
00003dd0: POP
00003dd1: PUSH1 0x20
00003dd3: MUL
00003dd4: ADD
00003dd5: CALLDATALOAD
00003dd6: PUSH1 0x01
00003dd8: PUSH1 0x01
00003dda: PUSH1 0xa0
00003ddc: SHL
00003ddd: SUB
00003dde: AND
00003ddf: PUSH1 0x01
00003de1: PUSH1 0x01
00003de3: PUSH1 0xa0
00003de5: SHL
00003de6: SUB
00003de7: AND
00003de8: DUP6
00003de9: DUP6
00003dea: DUP6
00003deb: DUP2
00003dec: DUP2
00003ded: LT
00003dee: PUSH2 0x3df3
00003df1: JUMPI
00003df2: INVALID
00003df3: JUMPDEST
00003df4: SWAP1
00003df5: POP
00003df6: PUSH1 0x20
00003df8: MUL
00003df9: ADD
00003dfa: CALLDATALOAD
00003dfb: PUSH1 0x01
00003dfd: PUSH1 0x01
00003dff: PUSH1 0xa0
00003e01: SHL
00003e02: SUB
00003e03: AND
00003e04: PUSH1 0x01
00003e06: PUSH1 0x01
00003e08: PUSH1 0xa0
00003e0a: SHL
00003e0b: SUB
00003e0c: AND
00003e0d: EQ
00003e0e: ISZERO
00003e0f: PUSH1 0x28
00003e11: PUSH2 0x403a
00003e14: JUMP
00003e15: JUMPDEST
00003e16: PUSH1 0x01
00003e18: ADD
00003e19: PUSH2 0x3db7
00003e1c: JUMP
00003e1d: JUMPDEST
00003e1e: POP
00003e1f: PUSH1 0x01
00003e21: ADD
00003e22: PUSH2 0x3daa
00003e25: JUMP
00003e26: JUMPDEST
00003e27: PUSH1 0x01
00003e29: PUSH1 0x01
00003e2b: PUSH1 0xa0
00003e2d: SHL
00003e2e: SUB
00003e2f: DUP5
00003e30: AND
00003e31: PUSH1 0x00
00003e33: SWAP1
00003e34: DUP2
00003e35: MSTORE
00003e36: PUSH1 0x71
00003e38: PUSH1 0x20
00003e3a: MSTORE
00003e3b: PUSH1 0x40
00003e3d: SWAP1
00003e3e: KECCAK256
00003e3f: PUSH2 0x3e46
00003e42: PUSH2 0x4cbd
00003e45: JUMP
00003e46: JUMPDEST
00003e47: PUSH2 0x3e58
00003e4a: PUSH1 0x00
00003e4c: DUP3
00003e4d: PUSH1 0x07
00003e4f: ADD
00003e50: SLOAD
00003e51: GT
00003e52: PUSH1 0x0f
00003e54: PUSH2 0x403a
00003e57: JUMP
00003e58: JUMPDEST
00003e59: PUSH2 0x3e71
00003e5c: PUSH1 0x00
00003e5e: DUP6
00003e5f: GT
00003e60: DUP1
00003e61: PUSH2 0x3e6a
00003e64: JUMPI
00003e65: POP
00003e66: PUSH1 0x00
00003e68: DUP5
00003e69: GT
00003e6a: JUMPDEST
00003e6b: PUSH1 0x52
00003e6d: PUSH2 0x403a
00003e70: JUMP
00003e71: JUMPDEST
00003e72: PUSH2 0x3e81
00003e75: DUP4
00003e76: PUSH1 0x6b
00003e78: SLOAD
00003e79: LT
00003e7a: ISZERO
00003e7b: PUSH1 0x56
00003e7d: PUSH2 0x403a
00003e80: JUMP
00003e81: JUMPDEST
00003e82: PUSH2 0x3e92
00003e85: DUP2
00003e86: PUSH1 0x02
00003e88: ADD
00003e89: SLOAD
00003e8a: TIMESTAMP
00003e8b: GT
00003e8c: PUSH1 0x0c
00003e8e: PUSH2 0x403a
00003e91: JUMP
00003e92: JUMPDEST
00003e93: PUSH1 0x07
00003e95: DUP2
00003e96: ADD
00003e97: DUP1
00003e98: SLOAD
00003e99: PUSH1 0x01
00003e9b: ADD
00003e9c: SWAP1
00003e9d: SSTORE
00003e9e: TIMESTAMP
00003e9f: PUSH1 0x02
00003ea1: DUP3
00003ea2: ADD
00003ea3: SSTORE
00003ea4: DUP3
00003ea5: ISZERO
00003ea6: PUSH2 0x3f0e
00003ea9: JUMPI
00003eaa: PUSH1 0x04
00003eac: DUP2
00003ead: ADD
00003eae: SLOAD
00003eaf: PUSH2 0x3eb8
00003eb2: SWAP1
00003eb3: DUP5
00003eb4: PUSH2 0x4096
00003eb7: JUMP
00003eb8: JUMPDEST
00003eb9: PUSH1 0x04
00003ebb: DUP3
00003ebc: ADD
00003ebd: SSTORE
00003ebe: PUSH1 0x6b
00003ec0: SLOAD
00003ec1: PUSH2 0x3eca
00003ec4: SWAP1
00003ec5: DUP5
00003ec6: PUSH2 0x3796
00003ec9: JUMP
00003eca: JUMPDEST
00003ecb: PUSH1 0x6b
00003ecd: SSTORE
00003ece: PUSH2 0x3ed7
00003ed1: DUP6
00003ed2: DUP5
00003ed3: PUSH2 0x5122
00003ed6: JUMP
00003ed7: JUMPDEST
00003ed8: PUSH1 0x40
00003eda: MLOAD
00003edb: DUP4
00003edc: SWAP1
00003edd: PUSH1 0x01
00003edf: PUSH1 0x01
00003ee1: PUSH1 0xa0
00003ee3: SHL
00003ee4: SUB
00003ee5: DUP8
00003ee6: AND
00003ee7: SWAP1
00003ee8: PUSH32 0x4dacaff8a707e7b54321fbdedb3b65d1f3316b59787949c034bae8946d6ff4e1
00003f09: SWAP1
00003f0a: PUSH1 0x00
00003f0c: SWAP1
00003f0d: LOG3
00003f0e: JUMPDEST
00003f0f: DUP4
00003f10: ISZERO
00003f11: PUSH2 0x2af4
00003f14: JUMPI
00003f15: PUSH1 0x68
00003f17: SLOAD
00003f18: PUSH1 0x00
00003f1a: SWAP1
00003f1b: PUSH1 0x01
00003f1d: PUSH1 0x01
00003f1f: PUSH1 0xa0
00003f21: SHL
00003f22: SUB
00003f23: AND
00003f24: PUSH4 0x8ce90e82
00003f29: DUP5
00003f2a: PUSH2 0x3f33
00003f2d: JUMPI
00003f2e: DUP8
00003f2f: PUSH2 0x3f35
00003f32: JUMP
00003f33: JUMPDEST
00003f34: ADDRESS
00003f35: JUMPDEST
00003f36: DUP8
00003f37: PUSH1 0x40
00003f39: MLOAD
00003f3a: DUP4
00003f3b: PUSH4 0xffffffff
00003f40: AND
00003f41: PUSH1 0xe0
00003f43: SHL
00003f44: DUP2
00003f45: MSTORE
00003f46: PUSH1 0x04
00003f48: ADD
00003f49: DUP1
00003f4a: DUP4
00003f4b: PUSH1 0x01
00003f4d: PUSH1 0x01
00003f4f: PUSH1 0xa0
00003f51: SHL
00003f52: SUB
00003f53: AND
00003f54: DUP2
00003f55: MSTORE
00003f56: PUSH1 0x20
00003f58: ADD
00003f59: DUP3
00003f5a: DUP2
00003f5b: MSTORE
00003f5c: PUSH1 0x20
00003f5e: ADD
00003f5f: SWAP3
00003f60: POP
00003f61: POP
00003f62: POP
00003f63: PUSH1 0x20
00003f65: PUSH1 0x40
00003f67: MLOAD
00003f68: DUP1
00003f69: DUP4
00003f6a: SUB
00003f6b: DUP2
00003f6c: PUSH1 0x00
00003f6e: DUP8
00003f6f: DUP1
00003f70: EXTCODESIZE
00003f71: ISZERO
00003f72: DUP1
00003f73: ISZERO
00003f74: PUSH2 0x3f7c
00003f77: JUMPI
00003f78: PUSH1 0x00
00003f7a: DUP1
00003f7b: REVERT
00003f7c: JUMPDEST
00003f7d: POP
00003f7e: GAS
00003f7f: CALL
00003f80: ISZERO
00003f81: DUP1
00003f82: ISZERO
00003f83: PUSH2 0x3f90
00003f86: JUMPI
00003f87: RETURNDATASIZE
00003f88: PUSH1 0x00
00003f8a: DUP1
00003f8b: RETURNDATACOPY
00003f8c: RETURNDATASIZE
00003f8d: PUSH1 0x00
00003f8f: REVERT
00003f90: JUMPDEST
00003f91: POP
00003f92: POP
00003f93: POP
00003f94: POP
00003f95: PUSH1 0x40
00003f97: MLOAD
00003f98: RETURNDATASIZE
00003f99: PUSH1 0x20
00003f9b: DUP2
00003f9c: LT
00003f9d: ISZERO
00003f9e: PUSH2 0x3fa6
00003fa1: JUMPI
00003fa2: PUSH1 0x00
00003fa4: DUP1
00003fa5: REVERT
00003fa6: JUMPDEST
00003fa7: POP
00003fa8: MLOAD
00003fa9: PUSH1 0x03
00003fab: DUP4
00003fac: ADD
00003fad: SLOAD
00003fae: SWAP1
00003faf: SWAP2
00003fb0: POP
00003fb1: PUSH2 0x3fba
00003fb4: SWAP1
00003fb5: DUP3
00003fb6: PUSH2 0x4096
00003fb9: JUMP
00003fba: JUMPDEST
00003fbb: PUSH1 0x03
00003fbd: DUP4
00003fbe: ADD
00003fbf: SSTORE
00003fc0: PUSH1 0x40
00003fc2: DUP1
00003fc3: MLOAD
00003fc4: DUP3
00003fc5: DUP2
00003fc6: MSTORE
00003fc7: SWAP1
00003fc8: MLOAD
00003fc9: PUSH1 0x01
00003fcb: PUSH1 0x01
00003fcd: PUSH1 0xa0
00003fcf: SHL
00003fd0: SUB
00003fd1: DUP9
00003fd2: AND
00003fd3: SWAP2
00003fd4: PUSH32 0x09703ae9c781fcf86e1d44c6d854c2684b3f5dcfe234dfc64f4d356d0e3cd73e
00003ff5: SWAP2
00003ff6: SWAP1
00003ff7: DUP2
00003ff8: SWAP1
00003ff9: SUB
00003ffa: PUSH1 0x20
00003ffc: ADD
00003ffd: SWAP1
00003ffe: LOG2
00003fff: POP
00004000: POP
00004001: POP
00004002: POP
00004003: POP
00004004: POP
00004005: JUMP
00004006: JUMPDEST
00004007: PUSH2 0x3664
0000400a: PUSH1 0x01
0000400c: PUSH1 0x01
0000400e: PUSH1 0xa0
00004010: SHL
00004011: SUB
00004012: PUSH32 0x000000000000000000000000f4dc48d260c93ad6a96c5ce563e70ca578987c74
00004033: AND
00004034: DUP4
00004035: DUP4
00004036: PUSH2 0x51ea
00004039: JUMP
0000403a: JUMPDEST
0000403b: DUP2
0000403c: PUSH2 0x3664
0000403f: JUMPI
00004040: PUSH2 0x3664
00004043: DUP2
00004044: PUSH2 0x532f
00004047: JUMP
00004048: JUMPDEST
00004049: POP
0000404a: PUSH1 0x6f
0000404c: SLOAD
0000404d: SWAP1
0000404e: JUMP
0000404f: JUMPDEST
00004050: PUSH1 0x01
00004052: PUSH1 0x01
00004054: PUSH1 0xa0
00004056: SHL
00004057: SUB
00004058: DUP2
00004059: AND
0000405a: PUSH1 0x00
0000405c: SWAP1
0000405d: DUP2
0000405e: MSTORE
0000405f: PUSH1 0x71
00004061: PUSH1 0x20
00004063: MSTORE
00004064: PUSH1 0x40
00004066: DUP2
00004067: KECCAK256
00004068: SLOAD
00004069: PUSH1 0x8f
0000406b: SLOAD
0000406c: GT
0000406d: PUSH2 0x408e
00004070: JUMPI
00004071: PUSH1 0x01
00004073: PUSH1 0x01
00004075: PUSH1 0xa0
00004077: SHL
00004078: SUB
00004079: DUP3
0000407a: AND
0000407b: PUSH1 0x00
0000407d: SWAP1
0000407e: DUP2
0000407f: MSTORE
00004080: PUSH1 0x71
00004082: PUSH1 0x20
00004084: MSTORE
00004085: PUSH1 0x40
00004087: SWAP1
00004088: KECCAK256
00004089: SLOAD
0000408a: PUSH2 0x1442
0000408d: JUMP
0000408e: JUMPDEST
0000408f: POP
00004090: POP
00004091: PUSH1 0x8f
00004093: SLOAD
00004094: SWAP1
00004095: JUMP
00004096: JUMPDEST
00004097: DUP1
00004098: DUP3
00004099: ADD
0000409a: DUP3
0000409b: DUP2
0000409c: LT
0000409d: ISZERO
0000409e: PUSH2 0x1442
000040a1: JUMPI
000040a2: PUSH1 0x00
000040a4: DUP1
000040a5: REVERT
000040a6: JUMPDEST
000040a7: PUSH1 0x00
000040a9: DUP3
000040aa: ISZERO
000040ab: DUP1
000040ac: PUSH2 0x40c1
000040af: JUMPI
000040b0: POP
000040b1: POP
000040b2: DUP2
000040b3: DUP2
000040b4: MUL
000040b5: DUP2
000040b6: DUP4
000040b7: DUP3
000040b8: DUP2
000040b9: PUSH2 0x40be
000040bc: JUMPI
000040bd: INVALID
000040be: JUMPDEST
000040bf: DIV
000040c0: EQ
000040c1: JUMPDEST
000040c2: PUSH2 0x1442
000040c5: JUMPI
000040c6: PUSH1 0x00
000040c8: DUP1
000040c9: REVERT
000040ca: JUMPDEST
000040cb: PUSH1 0x00
000040cd: DUP1
000040ce: DUP3
000040cf: GT
000040d0: PUSH2 0x4120
000040d3: JUMPI
000040d4: PUSH1 0x40
000040d6: DUP1
000040d7: MLOAD
000040d8: PUSH3 0x461bcd
000040dc: PUSH1 0xe5
000040de: SHL
000040df: DUP2
000040e0: MSTORE
000040e1: PUSH1 0x20
000040e3: PUSH1 0x04
000040e5: DUP3
000040e6: ADD
000040e7: MSTORE
000040e8: PUSH1 0x1a
000040ea: PUSH1 0x24
000040ec: DUP3
000040ed: ADD
000040ee: MSTORE
000040ef: PUSH32 0x536166654d6174683a206469766973696f6e206279207a65726f000000000000
00004110: PUSH1 0x44
00004112: DUP3
00004113: ADD
00004114: MSTORE
00004115: SWAP1
00004116: MLOAD
00004117: SWAP1
00004118: DUP2
00004119: SWAP1
0000411a: SUB
0000411b: PUSH1 0x64
0000411d: ADD
0000411e: SWAP1
0000411f: REVERT
00004120: JUMPDEST
00004121: DUP2
00004122: DUP4
00004123: DUP2
00004124: PUSH2 0x4129
00004127: JUMPI
00004128: INVALID
00004129: JUMPDEST
0000412a: DIV
0000412b: SWAP4
0000412c: SWAP3
0000412d: POP
0000412e: POP
0000412f: POP
00004130: JUMP
00004131: JUMPDEST
00004132: PUSH1 0x7f
00004134: SLOAD
00004135: PUSH1 0x00
00004137: SWAP1
00004138: PUSH2 0x4200
0000413b: JUMPI
0000413c: PUSH2 0x4143
0000413f: PUSH2 0x14ae
00004142: JUMP
00004143: JUMPDEST
00004144: ISZERO
00004145: PUSH2 0x41f1
00004148: JUMPI
00004149: PUSH2 0x41ec
0000414c: PUSH2 0x4153
0000414f: PUSH2 0x14ae
00004152: JUMP
00004153: JUMPDEST
00004154: PUSH1 0x66
00004156: SLOAD
00004157: PUSH1 0x40
00004159: DUP1
0000415a: MLOAD
0000415b: PUSH32 0x313ce56700000000000000000000000000000000000000000000000000000000
0000417c: DUP2
0000417d: MSTORE
0000417e: SWAP1
0000417f: MLOAD
00004180: PUSH2 0x3790
00004183: SWAP3
00004184: PUSH1 0x01
00004186: PUSH1 0x01
00004188: PUSH1 0xa0
0000418a: SHL
0000418b: SUB
0000418c: AND
0000418d: SWAP2
0000418e: PUSH4 0x313ce567
00004193: SWAP2
00004194: PUSH1 0x04
00004196: DUP1
00004197: DUP4
00004198: ADD
00004199: SWAP3
0000419a: PUSH1 0x20
0000419c: SWAP3
0000419d: SWAP2
0000419e: SWAP1
0000419f: DUP3
000041a0: SWAP1
000041a1: SUB
000041a2: ADD
000041a3: DUP2
000041a4: DUP7
000041a5: DUP1
000041a6: EXTCODESIZE
000041a7: ISZERO
000041a8: DUP1
000041a9: ISZERO
000041aa: PUSH2 0x41b2
000041ad: JUMPI
000041ae: PUSH1 0x00
000041b0: DUP1
000041b1: REVERT
000041b2: JUMPDEST
000041b3: POP
000041b4: GAS
000041b5: STATICCALL
000041b6: ISZERO
000041b7: DUP1
000041b8: ISZERO
000041b9: PUSH2 0x41c6
000041bc: JUMPI
000041bd: RETURNDATASIZE
000041be: PUSH1 0x00
000041c0: DUP1
000041c1: RETURNDATACOPY
000041c2: RETURNDATASIZE
000041c3: PUSH1 0x00
000041c5: REVERT
000041c6: JUMPDEST
000041c7: POP
000041c8: POP
000041c9: POP
000041ca: POP
000041cb: PUSH1 0x40
000041cd: MLOAD
000041ce: RETURNDATASIZE
000041cf: PUSH1 0x20
000041d1: DUP2
000041d2: LT
000041d3: ISZERO
000041d4: PUSH2 0x41dc
000041d7: JUMPI
000041d8: PUSH1 0x00
000041da: DUP1
000041db: REVERT
000041dc: JUMPDEST
000041dd: POP
000041de: MLOAD
000041df: PUSH1 0xff
000041e1: AND
000041e2: PUSH1 0x0a
000041e4: EXP
000041e5: PUSH2 0x3790
000041e8: PUSH2 0x4f10
000041eb: JUMP
000041ec: JUMPDEST
000041ed: PUSH2 0x41f9
000041f0: JUMP
000041f1: JUMPDEST
000041f2: PUSH2 0x41f9
000041f5: PUSH2 0x5382
000041f8: JUMP
000041f9: JUMPDEST
000041fa: SWAP1
000041fb: POP
000041fc: PUSH2 0x1427
000041ff: JUMP
00004200: JUMPDEST
00004201: PUSH1 0x67
00004203: PUSH1 0x00
00004205: SWAP1
00004206: SLOAD
00004207: SWAP1
00004208: PUSH2 0x0100
0000420b: EXP
0000420c: SWAP1
0000420d: DIV
0000420e: PUSH1 0x01
00004210: PUSH1 0x01
00004212: PUSH1 0xa0
00004214: SHL
00004215: SUB
00004216: AND
00004217: PUSH1 0x01
00004219: PUSH1 0x01
0000421b: PUSH1 0xa0
0000421d: SHL
0000421e: SUB
0000421f: AND
00004220: PUSH4 0x294d237c
00004225: PUSH1 0x40
00004227: MLOAD
00004228: DUP2
00004229: PUSH4 0xffffffff
0000422e: AND
0000422f: PUSH1 0xe0
00004231: SHL
00004232: DUP2
00004233: MSTORE
00004234: PUSH1 0x04
00004236: ADD
00004237: PUSH1 0x20
00004239: PUSH1 0x40
0000423b: MLOAD
0000423c: DUP1
0000423d: DUP4
0000423e: SUB
0000423f: DUP2
00004240: DUP7
00004241: DUP1
00004242: EXTCODESIZE
00004243: ISZERO
00004244: DUP1
00004245: ISZERO
00004246: PUSH2 0x424e
00004249: JUMPI
0000424a: PUSH1 0x00
0000424c: DUP1
0000424d: REVERT
0000424e: JUMPDEST
0000424f: POP
00004250: GAS
00004251: STATICCALL
00004252: ISZERO
00004253: DUP1
00004254: ISZERO
00004255: PUSH2 0x4262
00004258: JUMPI
00004259: RETURNDATASIZE
0000425a: PUSH1 0x00
0000425c: DUP1
0000425d: RETURNDATACOPY
0000425e: RETURNDATASIZE
0000425f: PUSH1 0x00
00004261: REVERT
00004262: JUMPDEST
00004263: POP
00004264: POP
00004265: POP
00004266: POP
00004267: PUSH1 0x40
00004269: MLOAD
0000426a: RETURNDATASIZE
0000426b: PUSH1 0x20
0000426d: DUP2
0000426e: LT
0000426f: ISZERO
00004270: PUSH2 0x4278
00004273: JUMPI
00004274: PUSH1 0x00
00004276: DUP1
00004277: REVERT
00004278: JUMPDEST
00004279: POP
0000427a: MLOAD
0000427b: PUSH1 0x66
0000427d: SLOAD
0000427e: PUSH1 0x40
00004280: DUP1
00004281: MLOAD
00004282: PUSH32 0xbc14773a00000000000000000000000000000000000000000000000000000000
000042a3: DUP2
000042a4: MSTORE
000042a5: ADDRESS
000042a6: PUSH1 0x04
000042a8: DUP3
000042a9: ADD
000042aa: MSTORE
000042ab: PUSH1 0x01
000042ad: PUSH1 0x01
000042af: PUSH1 0xa0
000042b1: SHL
000042b2: SUB
000042b3: SWAP3
000042b4: DUP4
000042b5: AND
000042b6: PUSH1 0x24
000042b8: DUP3
000042b9: ADD
000042ba: MSTORE
000042bb: SWAP1
000042bc: MLOAD
000042bd: SWAP2
000042be: SWAP1
000042bf: SWAP3
000042c0: AND
000042c1: SWAP2
000042c2: PUSH4 0xbc14773a
000042c7: SWAP2
000042c8: PUSH1 0x44
000042ca: DUP1
000042cb: DUP4
000042cc: ADD
000042cd: SWAP3
000042ce: PUSH1 0x20
000042d0: SWAP3
000042d1: SWAP2
000042d2: SWAP1
000042d3: DUP3
000042d4: SWAP1
000042d5: SUB
000042d6: ADD
000042d7: DUP2
000042d8: DUP7
000042d9: DUP1
000042da: EXTCODESIZE
000042db: ISZERO
000042dc: DUP1
000042dd: ISZERO
000042de: PUSH2 0x42e6
000042e1: JUMPI
000042e2: PUSH1 0x00
000042e4: DUP1
000042e5: REVERT
000042e6: JUMPDEST
000042e7: POP
000042e8: GAS
000042e9: STATICCALL
000042ea: ISZERO
000042eb: DUP1
000042ec: ISZERO
000042ed: PUSH2 0x42fa
000042f0: JUMPI
000042f1: RETURNDATASIZE
000042f2: PUSH1 0x00
000042f4: DUP1
000042f5: RETURNDATACOPY
000042f6: RETURNDATASIZE
000042f7: PUSH1 0x00
000042f9: REVERT
000042fa: JUMPDEST
000042fb: POP
000042fc: POP
000042fd: POP
000042fe: POP
000042ff: PUSH1 0x40
00004301: MLOAD
00004302: RETURNDATASIZE
00004303: PUSH1 0x20
00004305: DUP2
00004306: LT
00004307: ISZERO
00004308: PUSH2 0x4310
0000430b: JUMPI
0000430c: PUSH1 0x00
0000430e: DUP1
0000430f: REVERT
00004310: JUMPDEST
00004311: POP
00004312: MLOAD
00004313: SWAP1
00004314: POP
00004315: PUSH2 0x1427
00004318: JUMP
00004319: JUMPDEST
0000431a: DUP1
0000431b: PUSH1 0x01
0000431d: PUSH1 0x01
0000431f: PUSH1 0xa0
00004321: SHL
00004322: SUB
00004323: AND
00004324: PUSH4 0x8da5cb5b
00004329: PUSH1 0x40
0000432b: MLOAD
0000432c: DUP2
0000432d: PUSH4 0xffffffff
00004332: AND
00004333: PUSH1 0xe0
00004335: SHL
00004336: DUP2
00004337: MSTORE
00004338: PUSH1 0x04
0000433a: ADD
0000433b: PUSH1 0x20
0000433d: PUSH1 0x40
0000433f: MLOAD
00004340: DUP1
00004341: DUP4
00004342: SUB
00004343: DUP2
00004344: DUP7
00004345: DUP1
00004346: EXTCODESIZE
00004347: ISZERO
00004348: DUP1
00004349: ISZERO
0000434a: PUSH2 0x4352
0000434d: JUMPI
0000434e: PUSH1 0x00
00004350: DUP1
00004351: REVERT
00004352: JUMPDEST
00004353: POP
00004354: GAS
00004355: STATICCALL
00004356: ISZERO
00004357: DUP1
00004358: ISZERO
00004359: PUSH2 0x4366
0000435c: JUMPI
0000435d: RETURNDATASIZE
0000435e: PUSH1 0x00
00004360: DUP1
00004361: RETURNDATACOPY
00004362: RETURNDATASIZE
00004363: PUSH1 0x00
00004365: REVERT
00004366: JUMPDEST
00004367: POP
00004368: POP
00004369: POP
0000436a: POP
0000436b: PUSH1 0x40
0000436d: MLOAD
0000436e: RETURNDATASIZE
0000436f: PUSH1 0x20
00004371: DUP2
00004372: LT
00004373: ISZERO
00004374: PUSH2 0x437c
00004377: JUMPI
00004378: PUSH1 0x00
0000437a: DUP1
0000437b: REVERT
0000437c: JUMPDEST
0000437d: POP
0000437e: MLOAD
0000437f: PUSH1 0x01
00004381: PUSH1 0x01
00004383: PUSH1 0xa0
00004385: SHL
00004386: SUB
00004387: AND
00004388: CALLER
00004389: EQ
0000438a: DUP1
0000438b: PUSH2 0x4400
0000438e: JUMPI
0000438f: POP
00004390: DUP1
00004391: PUSH1 0x01
00004393: PUSH1 0x01
00004395: PUSH1 0xa0
00004397: SHL
00004398: SUB
00004399: AND
0000439a: PUSH4 0x8d97e043
0000439f: PUSH1 0x40
000043a1: MLOAD
000043a2: DUP2
000043a3: PUSH4 0xffffffff
000043a8: AND
000043a9: PUSH1 0xe0
000043ab: SHL
000043ac: DUP2
000043ad: MSTORE
000043ae: PUSH1 0x04
000043b0: ADD
000043b1: PUSH1 0x20
000043b3: PUSH1 0x40
000043b5: MLOAD
000043b6: DUP1
000043b7: DUP4
000043b8: SUB
000043b9: DUP2
000043ba: DUP7
000043bb: DUP1
000043bc: EXTCODESIZE
000043bd: ISZERO
000043be: DUP1
000043bf: ISZERO
000043c0: PUSH2 0x43c8
000043c3: JUMPI
000043c4: PUSH1 0x00
000043c6: DUP1
000043c7: REVERT
000043c8: JUMPDEST
000043c9: POP
000043ca: GAS
000043cb: STATICCALL
000043cc: ISZERO
000043cd: DUP1
000043ce: ISZERO
000043cf: PUSH2 0x43dc
000043d2: JUMPI
000043d3: RETURNDATASIZE
000043d4: PUSH1 0x00
000043d6: DUP1
000043d7: RETURNDATACOPY
000043d8: RETURNDATASIZE
000043d9: PUSH1 0x00
000043db: REVERT
000043dc: JUMPDEST
000043dd: POP
000043de: POP
000043df: POP
000043e0: POP
000043e1: PUSH1 0x40
000043e3: MLOAD
000043e4: RETURNDATASIZE
000043e5: PUSH1 0x20
000043e7: DUP2
000043e8: LT
000043e9: ISZERO
000043ea: PUSH2 0x43f2
000043ed: JUMPI
000043ee: PUSH1 0x00
000043f0: DUP1
000043f1: REVERT
000043f2: JUMPDEST
000043f3: POP
000043f4: MLOAD
000043f5: PUSH1 0x01
000043f7: PUSH1 0x01
000043f9: PUSH1 0xa0
000043fb: SHL
000043fc: SUB
000043fd: AND
000043fe: CALLER
000043ff: EQ
00004400: JUMPDEST
00004401: PUSH2 0x443b
00004404: JUMPI
00004405: PUSH1 0x40
00004407: MLOAD
00004408: PUSH3 0x461bcd
0000440c: PUSH1 0xe5
0000440e: SHL
0000440f: DUP2
00004410: MSTORE
00004411: PUSH1 0x04
00004413: ADD
00004414: DUP1
00004415: DUP1
00004416: PUSH1 0x20
00004418: ADD
00004419: DUP3
0000441a: DUP2
0000441b: SUB
0000441c: DUP3
0000441d: MSTORE
0000441e: PUSH1 0x2a
00004420: DUP2
00004421: MSTORE
00004422: PUSH1 0x20
00004424: ADD
00004425: DUP1
00004426: PUSH2 0x5b5c
00004429: PUSH1 0x2a
0000442b: SWAP2
0000442c: CODECOPY
0000442d: PUSH1 0x40
0000442f: ADD
00004430: SWAP2
00004431: POP
00004432: POP
00004433: PUSH1 0x40
00004435: MLOAD
00004436: DUP1
00004437: SWAP2
00004438: SUB
00004439: SWAP1
0000443a: REVERT
0000443b: JUMPDEST
0000443c: POP
0000443d: JUMP
0000443e: JUMPDEST
0000443f: PUSH1 0x01
00004441: PUSH1 0x01
00004443: PUSH1 0xa0
00004445: SHL
00004446: SUB
00004447: DUP3
00004448: AND
00004449: PUSH2 0x4499
0000444c: JUMPI
0000444d: PUSH1 0x40
0000444f: DUP1
00004450: MLOAD
00004451: PUSH3 0x461bcd
00004455: PUSH1 0xe5
00004457: SHL
00004458: DUP2
00004459: MSTORE
0000445a: PUSH1 0x20
0000445c: PUSH1 0x04
0000445e: DUP3
0000445f: ADD
00004460: MSTORE
00004461: PUSH1 0x1f
00004463: PUSH1 0x24
00004465: DUP3
00004466: ADD
00004467: MSTORE
00004468: PUSH32 0x45524332303a206d696e7420746f20746865207a65726f206164647265737300
00004489: PUSH1 0x44
0000448b: DUP3
0000448c: ADD
0000448d: MSTORE
0000448e: SWAP1
0000448f: MLOAD
00004490: SWAP1
00004491: DUP2
00004492: SWAP1
00004493: SUB
00004494: PUSH1 0x64
00004496: ADD
00004497: SWAP1
00004498: REVERT
00004499: JUMPDEST
0000449a: PUSH2 0x44a5
0000449d: PUSH1 0x00
0000449f: DUP4
000044a0: DUP4
000044a1: PUSH2 0x493d
000044a4: JUMP
000044a5: JUMPDEST
000044a6: PUSH1 0x35
000044a8: SLOAD
000044a9: PUSH2 0x44b2
000044ac: SWAP1
000044ad: DUP3
000044ae: PUSH2 0x3d3f
000044b1: JUMP
000044b2: JUMPDEST
000044b3: PUSH1 0x35
000044b5: SSTORE
000044b6: PUSH1 0x01
000044b8: PUSH1 0x01
000044ba: PUSH1 0xa0
000044bc: SHL
000044bd: SUB
000044be: DUP3
000044bf: AND
000044c0: PUSH1 0x00
000044c2: SWAP1
000044c3: DUP2
000044c4: MSTORE
000044c5: PUSH1 0x33
000044c7: PUSH1 0x20
000044c9: MSTORE
000044ca: PUSH1 0x40
000044cc: SWAP1
000044cd: KECCAK256
000044ce: SLOAD
000044cf: PUSH2 0x44d8
000044d2: SWAP1
000044d3: DUP3
000044d4: PUSH2 0x3d3f
000044d7: JUMP
000044d8: JUMPDEST
000044d9: PUSH1 0x01
000044db: PUSH1 0x01
000044dd: PUSH1 0xa0
000044df: SHL
000044e0: SUB
000044e1: DUP4
000044e2: AND
000044e3: PUSH1 0x00
000044e5: DUP2
000044e6: DUP2
000044e7: MSTORE
000044e8: PUSH1 0x33
000044ea: PUSH1 0x20
000044ec: SWAP1
000044ed: DUP2
000044ee: MSTORE
000044ef: PUSH1 0x40
000044f1: DUP1
000044f2: DUP4
000044f3: KECCAK256
000044f4: SWAP5
000044f5: SWAP1
000044f6: SWAP5
000044f7: SSTORE
000044f8: DUP4
000044f9: MLOAD
000044fa: DUP6
000044fb: DUP2
000044fc: MSTORE
000044fd: SWAP4
000044fe: MLOAD
000044ff: SWAP3
00004500: SWAP4
00004501: SWAP2
00004502: SWAP3
00004503: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
00004524: SWAP3
00004525: DUP2
00004526: SWAP1
00004527: SUB
00004528: SWAP1
00004529: SWAP2
0000452a: ADD
0000452b: SWAP1
0000452c: LOG3
0000452d: POP
0000452e: POP
0000452f: JUMP
00004530: JUMPDEST
00004531: PUSH1 0x00
00004533: PUSH2 0x149e
00004536: DUP3
00004537: PUSH2 0x233b
0000453a: DUP6
0000453b: PUSH8 0x0de0b6b3a7640000
00004544: PUSH2 0x40a6
00004547: JUMP
00004548: JUMPDEST
00004549: PUSH1 0x00
0000454b: PUSH2 0x149e
0000454e: PUSH8 0x0de0b6b3a7640000
00004557: PUSH2 0x233b
0000455a: DUP6
0000455b: DUP6
0000455c: PUSH2 0x40a6
0000455f: JUMP
00004560: JUMPDEST
00004561: PUSH2 0x4568
00004564: PUSH2 0x4cbd
00004567: JUMP
00004568: JUMPDEST
00004569: PUSH2 0x4571
0000456c: DUP4
0000456d: PUSH2 0x4d6c
00004570: JUMP
00004571: JUMPDEST
00004572: PUSH1 0x00
00004574: PUSH2 0x457c
00004577: DUP8
00004578: PUSH2 0x2360
0000457b: JUMP
0000457c: JUMPDEST
0000457d: SWAP1
0000457e: POP
0000457f: PUSH2 0x458c
00004582: PUSH1 0x00
00004584: DUP3
00004585: GT
00004586: PUSH1 0x0f
00004588: PUSH2 0x403a
0000458b: JUMP
0000458c: JUMPDEST
0000458d: PUSH2 0x45ad
00004590: PUSH2 0x4598
00004593: DUP9
00004594: PUSH2 0x4048
00004597: JUMP
00004598: JUMPDEST
00004599: PUSH2 0x45a4
0000459c: PUSH2 0x227e
0000459f: DUP11
000045a0: PUSH2 0x404f
000045a3: JUMP
000045a4: JUMPDEST
000045a5: LT
000045a6: ISZERO
000045a7: PUSH1 0x03
000045a9: PUSH2 0x403a
000045ac: JUMP
000045ad: JUMPDEST
000045ae: PUSH1 0x01
000045b0: PUSH1 0x01
000045b2: PUSH1 0xa0
000045b4: SHL
000045b5: SUB
000045b6: DUP8
000045b7: AND
000045b8: PUSH1 0x00
000045ba: SWAP1
000045bb: DUP2
000045bc: MSTORE
000045bd: PUSH1 0x71
000045bf: PUSH1 0x20
000045c1: MSTORE
000045c2: PUSH1 0x40
000045c4: SWAP1
000045c5: KECCAK256
000045c6: PUSH1 0x08
000045c8: ADD
000045c9: SLOAD
000045ca: PUSH2 0x45d3
000045cd: DUP3
000045ce: DUP3
000045cf: PUSH2 0x3796
000045d2: JUMP
000045d3: JUMPDEST
000045d4: DUP11
000045d5: GT
000045d6: PUSH2 0x45df
000045d9: JUMPI
000045da: DUP10
000045db: PUSH2 0x45e9
000045de: JUMP
000045df: JUMPDEST
000045e0: PUSH2 0x45e9
000045e3: DUP3
000045e4: DUP3
000045e5: PUSH2 0x3796
000045e8: JUMP
000045e9: JUMPDEST
000045ea: SWAP10
000045eb: POP
000045ec: PUSH2 0x4602
000045ef: PUSH2 0x45f8
000045f2: DUP4
000045f3: DUP4
000045f4: PUSH2 0x3796
000045f7: JUMP
000045f8: JUMPDEST
000045f9: DUP12
000045fa: GT
000045fb: ISZERO
000045fc: PUSH1 0x07
000045fe: PUSH2 0x403a
00004601: JUMP
00004602: JUMPDEST
00004603: PUSH1 0x00
00004605: PUSH2 0x460e
00004608: DUP12
00004609: DUP8
0000460a: PUSH2 0x538e
0000460d: JUMP
0000460e: JUMPDEST
0000460f: SWAP1
00004610: POP
00004611: DUP8
00004612: DUP1
00004613: ISZERO
00004614: PUSH2 0x4623
00004617: JUMPI
00004618: POP
00004619: DUP1
0000461a: PUSH2 0x4621
0000461d: PUSH2 0x4f10
00004620: JUMP
00004621: JUMPDEST
00004622: LT
00004623: JUMPDEST
00004624: ISZERO
00004625: PUSH2 0x46cf
00004628: JUMPI
00004629: PUSH2 0x4643
0000462c: PUSH2 0x463c
0000462f: DUP3
00004630: PUSH7 0x58d15e17628000
00004638: PUSH2 0x4548
0000463b: JUMP
0000463c: JUMPDEST
0000463d: DUP3
0000463e: SWAP1
0000463f: PUSH2 0x3796
00004642: JUMP
00004643: JUMPDEST
00004644: SWAP1
00004645: POP
00004646: PUSH2 0x464e
00004649: DUP8
0000464a: PUSH2 0x4d56
0000464d: JUMP
0000464e: JUMPDEST
0000464f: PUSH1 0x01
00004651: PUSH1 0x01
00004653: PUSH1 0xa0
00004655: SHL
00004656: SUB
00004657: DUP8
00004658: AND
00004659: PUSH4 0xfa9bacac
0000465e: PUSH2 0x4678
00004661: PUSH2 0x4671
00004664: DUP5
00004665: PUSH7 0xb1a2bc2ec50000
0000466d: PUSH2 0x4548
00004670: JUMP
00004671: JUMPDEST
00004672: DUP5
00004673: SWAP1
00004674: PUSH2 0x4096
00004677: JUMP
00004678: JUMPDEST
00004679: DUP8
0000467a: PUSH1 0x40
0000467c: MLOAD
0000467d: DUP4
0000467e: PUSH4 0xffffffff
00004683: AND
00004684: PUSH1 0xe0
00004686: SHL
00004687: DUP2
00004688: MSTORE
00004689: PUSH1 0x04
0000468b: ADD
0000468c: DUP1
0000468d: DUP4
0000468e: DUP2
0000468f: MSTORE
00004690: PUSH1 0x20
00004692: ADD
00004693: DUP3
00004694: DUP2
00004695: MSTORE
00004696: PUSH1 0x20
00004698: ADD
00004699: SWAP3
0000469a: POP
0000469b: POP
0000469c: POP
0000469d: PUSH1 0x00
0000469f: PUSH1 0x40
000046a1: MLOAD
000046a2: DUP1
000046a3: DUP4
000046a4: SUB
000046a5: DUP2
000046a6: PUSH1 0x00
000046a8: DUP8
000046a9: DUP1
000046aa: EXTCODESIZE
000046ab: ISZERO
000046ac: DUP1
000046ad: ISZERO
000046ae: PUSH2 0x46b6
000046b1: JUMPI
000046b2: PUSH1 0x00
000046b4: DUP1
000046b5: REVERT
000046b6: JUMPDEST
000046b7: POP
000046b8: GAS
000046b9: CALL
000046ba: ISZERO
000046bb: DUP1
000046bc: ISZERO
000046bd: PUSH2 0x46ca
000046c0: JUMPI
000046c1: RETURNDATASIZE
000046c2: PUSH1 0x00
000046c4: DUP1
000046c5: RETURNDATACOPY
000046c6: RETURNDATASIZE
000046c7: PUSH1 0x00
000046c9: REVERT
000046ca: JUMPDEST
000046cb: POP
000046cc: POP
000046cd: POP
000046ce: POP
000046cf: JUMPDEST
000046d0: PUSH2 0x46e9
000046d3: DUP11
000046d4: DUP3
000046d5: LT
000046d6: ISZERO
000046d7: DUP1
000046d8: ISZERO
000046d9: PUSH2 0x46e2
000046dc: JUMPI
000046dd: POP
000046de: PUSH1 0x00
000046e0: DUP13
000046e1: GT
000046e2: JUMPDEST
000046e3: PUSH1 0x56
000046e5: PUSH2 0x403a
000046e8: JUMP
000046e9: JUMPDEST
000046ea: PUSH2 0x46fe
000046ed: DUP2
000046ee: PUSH2 0x46f5
000046f1: PUSH2 0x4f10
000046f4: JUMP
000046f5: JUMPDEST
000046f6: LT
000046f7: ISZERO
000046f8: PUSH1 0x04
000046fa: PUSH2 0x403a
000046fd: JUMP
000046fe: JUMPDEST
000046ff: PUSH2 0x4708
00004702: DUP10
00004703: DUP13
00004704: PUSH2 0x541d
00004707: JUMP
00004708: JUMPDEST
00004709: DUP4
0000470a: ISZERO
0000470b: PUSH2 0x4725
0000470e: JUMPI
0000470f: PUSH1 0x66
00004711: SLOAD
00004712: PUSH2 0x4725
00004715: SWAP1
00004716: PUSH1 0x01
00004718: PUSH1 0x01
0000471a: PUSH1 0xa0
0000471c: SHL
0000471d: SUB
0000471e: AND
0000471f: CALLER
00004720: DUP7
00004721: PUSH2 0x5519
00004724: JUMP
00004725: JUMPDEST
00004726: PUSH2 0x473a
00004729: DUP10
0000472a: DUP3
0000472b: DUP6
0000472c: PUSH2 0x4734
0000472f: DUP14
00004730: PUSH2 0x2360
00004733: JUMP
00004734: JUMPDEST
00004735: DUP16
00004736: PUSH2 0x5584
00004739: JUMP
0000473a: JUMPDEST
0000473b: PUSH1 0x01
0000473d: PUSH1 0x01
0000473f: PUSH1 0xa0
00004741: SHL
00004742: SUB
00004743: DUP10
00004744: AND
00004745: PUSH1 0x00
00004747: SWAP1
00004748: DUP2
00004749: MSTORE
0000474a: PUSH1 0x71
0000474c: PUSH1 0x20
0000474e: MSTORE
0000474f: PUSH1 0x40
00004751: SWAP1
00004752: KECCAK256
00004753: PUSH1 0x07
00004755: ADD
00004756: DUP1
00004757: SLOAD
00004758: PUSH1 0x01
0000475a: ADD
0000475b: SWAP1
0000475c: SSTORE
0000475d: PUSH2 0x476f
00004760: DUP10
00004761: PUSH2 0x476a
00004764: DUP4
00004765: DUP8
00004766: PUSH2 0x3796
00004769: JUMP
0000476a: JUMPDEST
0000476b: PUSH2 0x5122
0000476e: JUMP
0000476f: JUMPDEST
00004770: PUSH1 0x40
00004772: DUP1
00004773: MLOAD
00004774: DUP3
00004775: DUP2
00004776: MSTORE
00004777: PUSH1 0x20
00004779: DUP2
0000477a: ADD
0000477b: DUP14
0000477c: SWAP1
0000477d: MSTORE
0000477e: TIMESTAMP
0000477f: DUP2
00004780: DUP4
00004781: ADD
00004782: MSTORE
00004783: SWAP1
00004784: MLOAD
00004785: PUSH1 0x01
00004787: PUSH1 0x01
00004789: PUSH1 0xa0
0000478b: SHL
0000478c: SUB
0000478d: DUP12
0000478e: AND
0000478f: SWAP2
00004790: DUP3
00004791: SWAP2
00004792: PUSH32 0x32a44bf15c44dad7691e20191a033527995d56d46ebe5115756d9e2eec16d333
000047b3: SWAP2
000047b4: DUP2
000047b5: SWAP1
000047b6: SUB
000047b7: PUSH1 0x60
000047b9: ADD
000047ba: SWAP1
000047bb: LOG3
000047bc: POP
000047bd: POP
000047be: POP
000047bf: POP
000047c0: POP
000047c1: POP
000047c2: POP
000047c3: POP
000047c4: POP
000047c5: POP
000047c6: POP
000047c7: JUMP
000047c8: JUMPDEST
000047c9: PUSH1 0x00
000047cb: PUSH32 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0
000047ec: DUP3
000047ed: GT
000047ee: ISZERO
000047ef: PUSH2 0x4829
000047f2: JUMPI
000047f3: PUSH1 0x40
000047f5: MLOAD
000047f6: PUSH3 0x461bcd
000047fa: PUSH1 0xe5
000047fc: SHL
000047fd: DUP2
000047fe: MSTORE
000047ff: PUSH1 0x04
00004801: ADD
00004802: DUP1
00004803: DUP1
00004804: PUSH1 0x20
00004806: ADD
00004807: DUP3
00004808: DUP2
00004809: SUB
0000480a: DUP3
0000480b: MSTORE
0000480c: PUSH1 0x22
0000480e: DUP2
0000480f: MSTORE
00004810: PUSH1 0x20
00004812: ADD
00004813: DUP1
00004814: PUSH2 0x5aa9
00004817: PUSH1 0x22
00004819: SWAP2
0000481a: CODECOPY
0000481b: PUSH1 0x40
0000481d: ADD
0000481e: SWAP2
0000481f: POP
00004820: POP
00004821: PUSH1 0x40
00004823: MLOAD
00004824: DUP1
00004825: SWAP2
00004826: SUB
00004827: SWAP1
00004828: REVERT
00004829: JUMPDEST
0000482a: DUP4
0000482b: PUSH1 0xff
0000482d: AND
0000482e: PUSH1 0x1b
00004830: EQ
00004831: DUP1
00004832: PUSH2 0x483e
00004835: JUMPI
00004836: POP
00004837: DUP4
00004838: PUSH1 0xff
0000483a: AND
0000483b: PUSH1 0x1c
0000483d: EQ
0000483e: JUMPDEST
0000483f: PUSH2 0x4879
00004842: JUMPI
00004843: PUSH1 0x40
00004845: MLOAD
00004846: PUSH3 0x461bcd
0000484a: PUSH1 0xe5
0000484c: SHL
0000484d: DUP2
0000484e: MSTORE
0000484f: PUSH1 0x04
00004851: ADD
00004852: DUP1
00004853: DUP1
00004854: PUSH1 0x20
00004856: ADD
00004857: DUP3
00004858: DUP2
00004859: SUB
0000485a: DUP3
0000485b: MSTORE
0000485c: PUSH1 0x22
0000485e: DUP2
0000485f: MSTORE
00004860: PUSH1 0x20
00004862: ADD
00004863: DUP1
00004864: PUSH2 0x5af1
00004867: PUSH1 0x22
00004869: SWAP2
0000486a: CODECOPY
0000486b: PUSH1 0x40
0000486d: ADD
0000486e: SWAP2
0000486f: POP
00004870: POP
00004871: PUSH1 0x40
00004873: MLOAD
00004874: DUP1
00004875: SWAP2
00004876: SUB
00004877: SWAP1
00004878: REVERT
00004879: JUMPDEST
0000487a: PUSH1 0x00
0000487c: PUSH1 0x01
0000487e: DUP7
0000487f: DUP7
00004880: DUP7
00004881: DUP7
00004882: PUSH1 0x40
00004884: MLOAD
00004885: PUSH1 0x00
00004887: DUP2
00004888: MSTORE
00004889: PUSH1 0x20
0000488b: ADD
0000488c: PUSH1 0x40
0000488e: MSTORE
0000488f: PUSH1 0x40
00004891: MLOAD
00004892: DUP1
00004893: DUP6
00004894: DUP2
00004895: MSTORE
00004896: PUSH1 0x20
00004898: ADD
00004899: DUP5
0000489a: PUSH1 0xff
0000489c: AND
0000489d: DUP2
0000489e: MSTORE
0000489f: PUSH1 0x20
000048a1: ADD
000048a2: DUP4
000048a3: DUP2
000048a4: MSTORE
000048a5: PUSH1 0x20
000048a7: ADD
000048a8: DUP3
000048a9: DUP2
000048aa: MSTORE
000048ab: PUSH1 0x20
000048ad: ADD
000048ae: SWAP5
000048af: POP
000048b0: POP
000048b1: POP
000048b2: POP
000048b3: POP
000048b4: PUSH1 0x20
000048b6: PUSH1 0x40
000048b8: MLOAD
000048b9: PUSH1 0x20
000048bb: DUP2
000048bc: SUB
000048bd: SWAP1
000048be: DUP1
000048bf: DUP5
000048c0: SUB
000048c1: SWAP1
000048c2: DUP6
000048c3: GAS
000048c4: STATICCALL
000048c5: ISZERO
000048c6: DUP1
000048c7: ISZERO
000048c8: PUSH2 0x48d5
000048cb: JUMPI
000048cc: RETURNDATASIZE
000048cd: PUSH1 0x00
000048cf: DUP1
000048d0: RETURNDATACOPY
000048d1: RETURNDATASIZE
000048d2: PUSH1 0x00
000048d4: REVERT
000048d5: JUMPDEST
000048d6: POP
000048d7: POP
000048d8: PUSH1 0x40
000048da: MLOAD
000048db: PUSH1 0x1f
000048dd: NOT
000048de: ADD
000048df: MLOAD
000048e0: SWAP2
000048e1: POP
000048e2: POP
000048e3: PUSH1 0x01
000048e5: PUSH1 0x01
000048e7: PUSH1 0xa0
000048e9: SHL
000048ea: SUB
000048eb: DUP2
000048ec: AND
000048ed: PUSH2 0x2d3b
000048f0: JUMPI
000048f1: PUSH1 0x40
000048f3: DUP1
000048f4: MLOAD
000048f5: PUSH3 0x461bcd
000048f9: PUSH1 0xe5
000048fb: SHL
000048fc: DUP2
000048fd: MSTORE
000048fe: PUSH1 0x20
00004900: PUSH1 0x04
00004902: DUP3
00004903: ADD
00004904: MSTORE
00004905: PUSH1 0x18
00004907: PUSH1 0x24
00004909: DUP3
0000490a: ADD
0000490b: MSTORE
0000490c: PUSH32 0x45434453413a20696e76616c6964207369676e61747572650000000000000000
0000492d: PUSH1 0x44
0000492f: DUP3
00004930: ADD
00004931: MSTORE
00004932: SWAP1
00004933: MLOAD
00004934: SWAP1
00004935: DUP2
00004936: SWAP1
00004937: SUB
00004938: PUSH1 0x64
0000493a: ADD
0000493b: SWAP1
0000493c: REVERT
0000493d: JUMPDEST
0000493e: PUSH2 0x4948
00004941: DUP4
00004942: DUP4
00004943: DUP4
00004944: PUSH2 0x2007
00004947: JUMP
00004948: JUMPDEST
00004949: PUSH2 0x4a05
0000494c: PUSH1 0x01
0000494e: PUSH1 0x01
00004950: PUSH1 0xa0
00004952: SHL
00004953: SUB
00004954: DUP5
00004955: AND
00004956: ISZERO
00004957: DUP1
00004958: PUSH2 0x4968
0000495b: JUMPI
0000495c: POP
0000495d: PUSH1 0x01
0000495f: PUSH1 0x01
00004961: PUSH1 0xa0
00004963: SHL
00004964: SUB
00004965: DUP4
00004966: AND
00004967: ISZERO
00004968: JUMPDEST
00004969: DUP1
0000496a: PUSH2 0x49fe
0000496d: JUMPI
0000496e: POP
0000496f: PUSH1 0x67
00004971: PUSH1 0x00
00004973: SWAP1
00004974: SLOAD
00004975: SWAP1
00004976: PUSH2 0x0100
00004979: EXP
0000497a: SWAP1
0000497b: DIV
0000497c: PUSH1 0x01
0000497e: PUSH1 0x01
00004980: PUSH1 0xa0
00004982: SHL
00004983: SUB
00004984: AND
00004985: PUSH1 0x01
00004987: PUSH1 0x01
00004989: PUSH1 0xa0
0000498b: SHL
0000498c: SUB
0000498d: AND
0000498e: PUSH4 0x393bfe49
00004993: PUSH1 0x40
00004995: MLOAD
00004996: DUP2
00004997: PUSH4 0xffffffff
0000499c: AND
0000499d: PUSH1 0xe0
0000499f: SHL
000049a0: DUP2
000049a1: MSTORE
000049a2: PUSH1 0x04
000049a4: ADD
000049a5: PUSH1 0x20
000049a7: PUSH1 0x40
000049a9: MLOAD
000049aa: DUP1
000049ab: DUP4
000049ac: SUB
000049ad: DUP2
000049ae: DUP7
000049af: DUP1
000049b0: EXTCODESIZE
000049b1: ISZERO
000049b2: DUP1
000049b3: ISZERO
000049b4: PUSH2 0x49bc
000049b7: JUMPI
000049b8: PUSH1 0x00
000049ba: DUP1
000049bb: REVERT
000049bc: JUMPDEST
000049bd: POP
000049be: GAS
000049bf: STATICCALL
000049c0: ISZERO
000049c1: DUP1
000049c2: ISZERO
000049c3: PUSH2 0x49d0
000049c6: JUMPI
000049c7: RETURNDATASIZE
000049c8: PUSH1 0x00
000049ca: DUP1
000049cb: RETURNDATACOPY
000049cc: RETURNDATASIZE
000049cd: PUSH1 0x00
000049cf: REVERT
000049d0: JUMPDEST
000049d1: POP
000049d2: POP
000049d3: POP
000049d4: POP
000049d5: PUSH1 0x40
000049d7: MLOAD
000049d8: RETURNDATASIZE
000049d9: PUSH1 0x20
000049db: DUP2
000049dc: LT
000049dd: ISZERO
000049de: PUSH2 0x49e6
000049e1: JUMPI
000049e2: PUSH1 0x00
000049e4: DUP1
000049e5: REVERT
000049e6: JUMPDEST
000049e7: POP
000049e8: MLOAD
000049e9: DUP1
000049ea: ISZERO
000049eb: PUSH2 0x49fe
000049ee: JUMPI
000049ef: POP
000049f0: PUSH1 0x69
000049f2: SLOAD
000049f3: PUSH1 0x01
000049f5: PUSH1 0xa8
000049f7: SHL
000049f8: SWAP1
000049f9: DIV
000049fa: PUSH1 0xff
000049fc: AND
000049fd: ISZERO
000049fe: JUMPDEST
000049ff: PUSH1 0x3b
00004a01: PUSH2 0x403a
00004a04: JUMP
00004a05: JUMPDEST
00004a06: PUSH1 0x01
00004a08: PUSH1 0x01
00004a0a: PUSH1 0xa0
00004a0c: SHL
00004a0d: SUB
00004a0e: DUP4
00004a0f: AND
00004a10: ISZERO
00004a11: DUP1
00004a12: ISZERO
00004a13: SWAP1
00004a14: PUSH2 0x4a25
00004a17: JUMPI
00004a18: POP
00004a19: PUSH1 0x01
00004a1b: PUSH1 0x01
00004a1d: PUSH1 0xa0
00004a1f: SHL
00004a20: SUB
00004a21: DUP3
00004a22: AND
00004a23: ISZERO
00004a24: ISZERO
00004a25: JUMPDEST
00004a26: DUP1
00004a27: ISZERO
00004a28: PUSH2 0x4a43
00004a2b: JUMPI
00004a2c: POP
00004a2d: DUP2
00004a2e: PUSH1 0x01
00004a30: PUSH1 0x01
00004a32: PUSH1 0xa0
00004a34: SHL
00004a35: SUB
00004a36: AND
00004a37: DUP4
00004a38: PUSH1 0x01
00004a3a: PUSH1 0x01
00004a3c: PUSH1 0xa0
00004a3e: SHL
00004a3f: SUB
00004a40: AND
00004a41: EQ
00004a42: ISZERO
00004a43: JUMPDEST
00004a44: ISZERO
00004a45: PUSH2 0x2007
00004a48: JUMPI
00004a49: PUSH1 0x00
00004a4b: PUSH2 0x4a53
00004a4e: DUP5
00004a4f: PUSH2 0x2360
00004a52: JUMP
00004a53: JUMPDEST
00004a54: PUSH1 0x01
00004a56: PUSH1 0x01
00004a58: PUSH1 0xa0
00004a5a: SHL
00004a5b: SUB
00004a5c: DUP6
00004a5d: AND
00004a5e: PUSH1 0x00
00004a60: SWAP1
00004a61: DUP2
00004a62: MSTORE
00004a63: PUSH1 0x71
00004a65: PUSH1 0x20
00004a67: MSTORE
00004a68: PUSH1 0x40
00004a6a: SWAP1
00004a6b: KECCAK256
00004a6c: PUSH1 0x08
00004a6e: ADD
00004a6f: SLOAD
00004a70: SWAP1
00004a71: SWAP2
00004a72: POP
00004a73: PUSH2 0x4a89
00004a76: DUP4
00004a77: PUSH2 0x4a80
00004a7a: DUP5
00004a7b: DUP5
00004a7c: PUSH2 0x3796
00004a7f: JUMP
00004a80: JUMPDEST
00004a81: LT
00004a82: ISZERO
00004a83: PUSH1 0x07
00004a85: PUSH2 0x403a
00004a88: JUMP
00004a89: JUMPDEST
00004a8a: PUSH1 0x01
00004a8c: PUSH1 0x01
00004a8e: PUSH1 0xa0
00004a90: SHL
00004a91: SUB
00004a92: DUP1
00004a93: DUP7
00004a94: AND
00004a95: PUSH1 0x00
00004a97: SWAP1
00004a98: DUP2
00004a99: MSTORE
00004a9a: PUSH1 0x93
00004a9c: PUSH1 0x20
00004a9e: MSTORE
00004a9f: PUSH1 0x40
00004aa1: DUP1
00004aa2: DUP3
00004aa3: KECCAK256
00004aa4: SLOAD
00004aa5: SWAP3
00004aa6: DUP8
00004aa7: AND
00004aa8: DUP3
00004aa9: MSTORE
00004aaa: SWAP1
00004aab: KECCAK256
00004aac: SLOAD
00004aad: PUSH2 0x4ab9
00004ab0: SWAP2
00004ab1: GT
00004ab2: ISZERO
00004ab3: PUSH1 0x86
00004ab5: PUSH2 0x403a
00004ab8: JUMP
00004ab9: JUMPDEST
00004aba: PUSH1 0x01
00004abc: PUSH1 0x01
00004abe: PUSH1 0xa0
00004ac0: SHL
00004ac1: SUB
00004ac2: DUP1
00004ac3: DUP6
00004ac4: AND
00004ac5: PUSH1 0x00
00004ac7: SWAP1
00004ac8: DUP2
00004ac9: MSTORE
00004aca: PUSH1 0x93
00004acc: PUSH1 0x20
00004ace: MSTORE
00004acf: PUSH1 0x40
00004ad1: DUP1
00004ad2: DUP3
00004ad3: KECCAK256
00004ad4: SLOAD
00004ad5: SWAP3
00004ad6: DUP9
00004ad7: AND
00004ad8: DUP3
00004ad9: MSTORE
00004ada: SWAP1
00004adb: KECCAK256
00004adc: SLOAD
00004add: LT
00004ade: ISZERO
00004adf: PUSH2 0x4b62
00004ae2: JUMPI
00004ae3: PUSH1 0x00
00004ae5: PUSH2 0x4aed
00004ae8: DUP6
00004ae9: PUSH2 0x2360
00004aec: JUMP
00004aed: JUMPDEST
00004aee: SWAP1
00004aef: POP
00004af0: PUSH2 0x4b47
00004af3: PUSH2 0x4afc
00004af6: DUP5
00004af7: DUP4
00004af8: PUSH2 0x4096
00004afb: JUMP
00004afc: JUMPDEST
00004afd: PUSH1 0x01
00004aff: PUSH1 0x01
00004b01: PUSH1 0xa0
00004b03: SHL
00004b04: SUB
00004b05: DUP8
00004b06: AND
00004b07: PUSH1 0x00
00004b09: SWAP1
00004b0a: DUP2
00004b0b: MSTORE
00004b0c: PUSH1 0x93
00004b0e: PUSH1 0x20
00004b10: MSTORE
00004b11: PUSH1 0x40
00004b13: SWAP1
00004b14: KECCAK256
00004b15: SLOAD
00004b16: PUSH2 0x233b
00004b19: SWAP1
00004b1a: PUSH2 0x4b24
00004b1d: SWAP1
00004b1e: DUP6
00004b1f: SWAP1
00004b20: PUSH2 0x40a6
00004b23: JUMP
00004b24: JUMPDEST
00004b25: PUSH1 0x01
00004b27: PUSH1 0x01
00004b29: PUSH1 0xa0
00004b2b: SHL
00004b2c: SUB
00004b2d: DUP11
00004b2e: AND
00004b2f: PUSH1 0x00
00004b31: SWAP1
00004b32: DUP2
00004b33: MSTORE
00004b34: PUSH1 0x93
00004b36: PUSH1 0x20
00004b38: MSTORE
00004b39: PUSH1 0x40
00004b3b: SWAP1
00004b3c: KECCAK256
00004b3d: SLOAD
00004b3e: PUSH2 0x2335
00004b41: SWAP1
00004b42: DUP9
00004b43: PUSH2 0x40a6
00004b46: JUMP
00004b47: JUMPDEST
00004b48: PUSH1 0x01
00004b4a: PUSH1 0x01
00004b4c: PUSH1 0xa0
00004b4e: SHL
00004b4f: SUB
00004b50: DUP7
00004b51: AND
00004b52: PUSH1 0x00
00004b54: SWAP1
00004b55: DUP2
00004b56: MSTORE
00004b57: PUSH1 0x93
00004b59: PUSH1 0x20
00004b5b: MSTORE
00004b5c: PUSH1 0x40
00004b5e: SWAP1
00004b5f: KECCAK256
00004b60: SSTORE
00004b61: POP
00004b62: JUMPDEST
00004b63: PUSH2 0x4b79
00004b66: DUP6
00004b67: PUSH1 0x00
00004b69: DUP5
00004b6a: PUSH2 0x4b73
00004b6d: DUP2
00004b6e: DUP9
00004b6f: PUSH2 0x3796
00004b72: JUMP
00004b73: JUMPDEST
00004b74: DUP8
00004b75: PUSH2 0x5584
00004b78: JUMP
00004b79: JUMPDEST
00004b7a: PUSH2 0x2af4
00004b7d: DUP5
00004b7e: PUSH2 0x4b86
00004b81: DUP7
00004b82: PUSH2 0x2360
00004b85: JUMP
00004b86: JUMPDEST
00004b87: PUSH1 0x00
00004b89: DUP7
00004b8a: PUSH2 0x4f8e
00004b8d: JUMP
00004b8e: JUMPDEST
00004b8f: PUSH1 0x00
00004b91: PUSH2 0x4b99
00004b94: DUP5
00004b95: PUSH2 0x5685
00004b98: JUMP
00004b99: JUMPDEST
00004b9a: ISZERO
00004b9b: PUSH2 0x4c98
00004b9e: JUMPI
00004b9f: PUSH1 0x40
00004ba1: DUP1
00004ba2: MLOAD
00004ba3: PUSH4 0x0b135d3f
00004ba8: PUSH1 0xe1
00004baa: SHL
00004bab: DUP2
00004bac: MSTORE
00004bad: PUSH1 0x04
00004baf: DUP2
00004bb0: ADD
00004bb1: DUP6
00004bb2: DUP2
00004bb3: MSTORE
00004bb4: PUSH1 0x24
00004bb6: DUP3
00004bb7: ADD
00004bb8: SWAP3
00004bb9: DUP4
00004bba: MSTORE
00004bbb: DUP5
00004bbc: MLOAD
00004bbd: PUSH1 0x44
00004bbf: DUP4
00004bc0: ADD
00004bc1: MSTORE
00004bc2: DUP5
00004bc3: MLOAD
00004bc4: PUSH1 0x01
00004bc6: PUSH1 0x01
00004bc8: PUSH1 0xa0
00004bca: SHL
00004bcb: SUB
00004bcc: DUP9
00004bcd: AND
00004bce: SWAP4
00004bcf: PUSH4 0x1626ba7e
00004bd4: SWAP4
00004bd5: DUP9
00004bd6: SWAP4
00004bd7: DUP9
00004bd8: SWAP4
00004bd9: SWAP1
00004bda: SWAP3
00004bdb: SWAP2
00004bdc: PUSH1 0x64
00004bde: ADD
00004bdf: SWAP1
00004be0: PUSH1 0x20
00004be2: DUP6
00004be3: ADD
00004be4: SWAP1
00004be5: DUP1
00004be6: DUP4
00004be7: DUP4
00004be8: PUSH1 0x00
00004bea: JUMPDEST
00004beb: DUP4
00004bec: DUP2
00004bed: LT
00004bee: ISZERO
00004bef: PUSH2 0x4c02
00004bf2: JUMPI
00004bf3: DUP2
00004bf4: DUP2
00004bf5: ADD
00004bf6: MLOAD
00004bf7: DUP4
00004bf8: DUP3
00004bf9: ADD
00004bfa: MSTORE
00004bfb: PUSH1 0x20
00004bfd: ADD
00004bfe: PUSH2 0x4bea
00004c01: JUMP
00004c02: JUMPDEST
00004c03: POP
00004c04: POP
00004c05: POP
00004c06: POP
00004c07: SWAP1
00004c08: POP
00004c09: SWAP1
00004c0a: DUP2
00004c0b: ADD
00004c0c: SWAP1
00004c0d: PUSH1 0x1f
00004c0f: AND
00004c10: DUP1
00004c11: ISZERO
00004c12: PUSH2 0x4c2f
00004c15: JUMPI
00004c16: DUP1
00004c17: DUP3
00004c18: SUB
00004c19: DUP1
00004c1a: MLOAD
00004c1b: PUSH1 0x01
00004c1d: DUP4
00004c1e: PUSH1 0x20
00004c20: SUB
00004c21: PUSH2 0x0100
00004c24: EXP
00004c25: SUB
00004c26: NOT
00004c27: AND
00004c28: DUP2
00004c29: MSTORE
00004c2a: PUSH1 0x20
00004c2c: ADD
00004c2d: SWAP2
00004c2e: POP
00004c2f: JUMPDEST
00004c30: POP
00004c31: SWAP4
00004c32: POP
00004c33: POP
00004c34: POP
00004c35: POP
00004c36: PUSH1 0x20
00004c38: PUSH1 0x40
00004c3a: MLOAD
00004c3b: DUP1
00004c3c: DUP4
00004c3d: SUB
00004c3e: DUP2
00004c3f: DUP7
00004c40: DUP1
00004c41: EXTCODESIZE
00004c42: ISZERO
00004c43: DUP1
00004c44: ISZERO
00004c45: PUSH2 0x4c4d
00004c48: JUMPI
00004c49: PUSH1 0x00
00004c4b: DUP1
00004c4c: REVERT
00004c4d: JUMPDEST
00004c4e: POP
00004c4f: GAS
00004c50: STATICCALL
00004c51: SWAP3
00004c52: POP
00004c53: POP
00004c54: POP
00004c55: DUP1
00004c56: ISZERO
00004c57: PUSH2 0x4c72
00004c5a: JUMPI
00004c5b: POP
00004c5c: PUSH1 0x40
00004c5e: MLOAD
00004c5f: RETURNDATASIZE
00004c60: PUSH1 0x20
00004c62: DUP2
00004c63: LT
00004c64: ISZERO
00004c65: PUSH2 0x4c6d
00004c68: JUMPI
00004c69: PUSH1 0x00
00004c6b: DUP1
00004c6c: REVERT
00004c6d: JUMPDEST
00004c6e: POP
00004c6f: MLOAD
00004c70: PUSH1 0x01
00004c72: JUMPDEST
00004c73: PUSH2 0x4c7e
00004c76: JUMPI
00004c77: POP
00004c78: PUSH1 0x00
00004c7a: PUSH2 0x149e
00004c7d: JUMP
00004c7e: JUMPDEST
00004c7f: PUSH1 0x01
00004c81: PUSH1 0x01
00004c83: PUSH1 0xe0
00004c85: SHL
00004c86: SUB
00004c87: NOT
00004c88: AND
00004c89: PUSH4 0x0b135d3f
00004c8e: PUSH1 0xe1
00004c90: SHL
00004c91: EQ
00004c92: SWAP1
00004c93: POP
00004c94: PUSH2 0x149e
00004c97: JUMP
00004c98: JUMPDEST
00004c99: DUP4
00004c9a: PUSH1 0x01
00004c9c: PUSH1 0x01
00004c9e: PUSH1 0xa0
00004ca0: SHL
00004ca1: SUB
00004ca2: AND
00004ca3: PUSH2 0x4cac
00004ca6: DUP5
00004ca7: DUP5
00004ca8: PUSH2 0x334a
00004cab: JUMP
00004cac: JUMPDEST
00004cad: PUSH1 0x01
00004caf: PUSH1 0x01
00004cb1: PUSH1 0xa0
00004cb3: SHL
00004cb4: SUB
00004cb5: AND
00004cb6: EQ
00004cb7: SWAP1
00004cb8: POP
00004cb9: PUSH2 0x149e
00004cbc: JUMP
00004cbd: JUMPDEST
00004cbe: PUSH1 0x67
00004cc0: SLOAD
00004cc1: PUSH1 0x40
00004cc3: DUP1
00004cc4: MLOAD
00004cc5: PUSH32 0x5b14f18300000000000000000000000000000000000000000000000000000000
00004ce6: DUP2
00004ce7: MSTORE
00004ce8: ADDRESS
00004ce9: PUSH1 0x04
00004ceb: DUP3
00004cec: ADD
00004ced: MSTORE
00004cee: SWAP1
00004cef: MLOAD
00004cf0: PUSH2 0x136d
00004cf3: SWAP3
00004cf4: PUSH1 0x01
00004cf6: PUSH1 0x01
00004cf8: PUSH1 0xa0
00004cfa: SHL
00004cfb: SUB
00004cfc: AND
00004cfd: SWAP2
00004cfe: PUSH4 0x5b14f183
00004d03: SWAP2
00004d04: PUSH1 0x24
00004d06: DUP1
00004d07: DUP4
00004d08: ADD
00004d09: SWAP3
00004d0a: PUSH1 0x20
00004d0c: SWAP3
00004d0d: SWAP2
00004d0e: SWAP1
00004d0f: DUP3
00004d10: SWAP1
00004d11: SUB
00004d12: ADD
00004d13: DUP2
00004d14: DUP7
00004d15: DUP1
00004d16: EXTCODESIZE
00004d17: ISZERO
00004d18: DUP1
00004d19: ISZERO
00004d1a: PUSH2 0x4d22
00004d1d: JUMPI
00004d1e: PUSH1 0x00
00004d20: DUP1
00004d21: REVERT
00004d22: JUMPDEST
00004d23: POP
00004d24: GAS
00004d25: STATICCALL
00004d26: ISZERO
00004d27: DUP1
00004d28: ISZERO
00004d29: PUSH2 0x4d36
00004d2c: JUMPI
00004d2d: RETURNDATASIZE
00004d2e: PUSH1 0x00
00004d30: DUP1
00004d31: RETURNDATACOPY
00004d32: RETURNDATASIZE
00004d33: PUSH1 0x00
00004d35: REVERT
00004d36: JUMPDEST
00004d37: POP
00004d38: POP
00004d39: POP
00004d3a: POP
00004d3b: PUSH1 0x40
00004d3d: MLOAD
00004d3e: RETURNDATASIZE
00004d3f: PUSH1 0x20
00004d41: DUP2
00004d42: LT
00004d43: ISZERO
00004d44: PUSH2 0x4d4c
00004d47: JUMPI
00004d48: PUSH1 0x00
00004d4a: DUP1
00004d4b: REVERT
00004d4c: JUMPDEST
00004d4d: POP
00004d4e: MLOAD
00004d4f: ISZERO
00004d50: PUSH1 0x53
00004d52: PUSH2 0x403a
00004d55: JUMP
00004d56: JUMPDEST
00004d57: PUSH2 0x443b
00004d5a: PUSH1 0x01
00004d5c: PUSH1 0x01
00004d5e: PUSH1 0xa0
00004d60: SHL
00004d61: SUB
00004d62: DUP3
00004d63: AND
00004d64: ISZERO
00004d65: ISZERO
00004d66: PUSH1 0x17
00004d68: PUSH2 0x403a
00004d6b: JUMP
00004d6c: JUMPDEST
00004d6d: PUSH1 0x00
00004d6f: DUP1
00004d70: PUSH1 0x8d
00004d72: SLOAD
00004d73: GT
00004d74: PUSH2 0x4d85
00004d77: JUMPI
00004d78: PUSH8 0x03782dace9d90000
00004d81: PUSH2 0x4d89
00004d84: JUMP
00004d85: JUMPDEST
00004d86: PUSH1 0x8d
00004d88: SLOAD
00004d89: JUMPDEST
00004d8a: SWAP1
00004d8b: POP
00004d8c: PUSH1 0x00
00004d8e: DUP1
00004d8f: PUSH1 0x8c
00004d91: SLOAD
00004d92: GT
00004d93: PUSH2 0x4da4
00004d96: JUMPI
00004d97: PUSH8 0x0de0b6b3a7640000
00004da0: PUSH2 0x4da8
00004da3: JUMP
00004da4: JUMPDEST
00004da5: PUSH1 0x8c
00004da7: SLOAD
00004da8: JUMPDEST
00004da9: SWAP1
00004daa: POP
00004dab: PUSH1 0x8a
00004dad: SLOAD
00004dae: PUSH1 0x00
00004db0: EQ
00004db1: PUSH2 0x4e58
00004db4: JUMPI
00004db5: PUSH2 0x4de5
00004db8: PUSH2 0x4dde
00004dbb: DUP3
00004dbc: PUSH2 0x4dd8
00004dbf: PUSH4 0x01e13380
00004dc4: PUSH2 0x3790
00004dc7: PUSH1 0x8b
00004dc9: SLOAD
00004dca: TIMESTAMP
00004dcb: PUSH2 0x3796
00004dce: SWAP1
00004dcf: SWAP2
00004dd0: SWAP1
00004dd1: PUSH4 0xffffffff
00004dd6: AND
00004dd7: JUMP
00004dd8: JUMPDEST
00004dd9: SWAP1
00004dda: PUSH2 0x4548
00004ddd: JUMP
00004dde: JUMPDEST
00004ddf: DUP4
00004de0: SWAP1
00004de1: PUSH2 0x4096
00004de4: JUMP
00004de5: JUMPDEST
00004de6: SWAP2
00004de7: POP
00004de8: PUSH1 0x8a
00004dea: SLOAD
00004deb: DUP4
00004dec: GT
00004ded: ISZERO
00004dee: PUSH2 0x4e1e
00004df1: JUMPI
00004df2: PUSH1 0x8a
00004df4: SLOAD
00004df5: PUSH2 0x4e19
00004df8: SWAP1
00004df9: PUSH2 0x4e02
00004dfc: SWAP1
00004dfd: DUP5
00004dfe: PUSH2 0x4548
00004e01: JUMP
00004e02: JUMPDEST
00004e03: PUSH1 0x8a
00004e05: SLOAD
00004e06: PUSH2 0x4e10
00004e09: SWAP1
00004e0a: DUP7
00004e0b: SWAP1
00004e0c: PUSH2 0x3796
00004e0f: JUMP
00004e10: JUMPDEST
00004e11: GT
00004e12: ISZERO
00004e13: PUSH1 0x76
00004e15: PUSH2 0x403a
00004e18: JUMP
00004e19: JUMPDEST
00004e1a: PUSH2 0x4e58
00004e1d: JUMP
00004e1e: JUMPDEST
00004e1f: PUSH2 0x4e58
00004e22: PUSH2 0x4e4b
00004e25: PUSH2 0x4e42
00004e28: PUSH2 0x4e39
00004e2b: DUP6
00004e2c: PUSH8 0x0de0b6b3a7640000
00004e35: PUSH2 0x4096
00004e38: JUMP
00004e39: JUMPDEST
00004e3a: PUSH1 0x8a
00004e3c: SLOAD
00004e3d: SWAP1
00004e3e: PUSH2 0x4530
00004e41: JUMP
00004e42: JUMPDEST
00004e43: PUSH1 0x8a
00004e45: SLOAD
00004e46: SWAP1
00004e47: PUSH2 0x3796
00004e4a: JUMP
00004e4b: JUMPDEST
00004e4c: PUSH1 0x8a
00004e4e: SLOAD
00004e4f: PUSH2 0x4e10
00004e52: SWAP1
00004e53: DUP7
00004e54: PUSH2 0x3796
00004e57: JUMP
00004e58: JUMPDEST
00004e59: POP
00004e5a: POP
00004e5b: PUSH1 0x8a
00004e5d: SSTORE
00004e5e: TIMESTAMP
00004e5f: PUSH1 0x8b
00004e61: SSTORE
00004e62: JUMP
00004e63: JUMPDEST
00004e64: PUSH1 0x00
00004e66: PUSH1 0x01
00004e68: PUSH1 0x01
00004e6a: PUSH1 0xa0
00004e6c: SHL
00004e6d: SUB
00004e6e: DUP3
00004e6f: AND
00004e70: ISZERO
00004e71: DUP1
00004e72: ISZERO
00004e73: SWAP1
00004e74: PUSH2 0x1442
00004e77: JUMPI
00004e78: POP
00004e79: PUSH1 0x01
00004e7b: PUSH1 0x01
00004e7d: PUSH1 0xa0
00004e7f: SHL
00004e80: SUB
00004e81: DUP3
00004e82: AND
00004e83: PUSH1 0x86
00004e85: PUSH1 0x00
00004e87: ADD
00004e88: SLOAD
00004e89: PUSH1 0x01
00004e8b: PUSH1 0x01
00004e8d: PUSH1 0xa0
00004e8f: SHL
00004e90: SUB
00004e91: AND
00004e92: EQ
00004e93: DUP1
00004e94: PUSH2 0x4eb3
00004e97: JUMPI
00004e98: POP
00004e99: PUSH1 0x01
00004e9b: PUSH1 0x01
00004e9d: PUSH1 0xa0
00004e9f: SHL
00004ea0: SUB
00004ea1: DUP3
00004ea2: AND
00004ea3: PUSH1 0x86
00004ea5: PUSH1 0x01
00004ea7: ADD
00004ea8: SLOAD
00004ea9: PUSH1 0x01
00004eab: PUSH1 0x01
00004ead: PUSH1 0xa0
00004eaf: SHL
00004eb0: SUB
00004eb1: AND
00004eb2: EQ
00004eb3: JUMPDEST
00004eb4: DUP1
00004eb5: PUSH2 0x4ed4
00004eb8: JUMPI
00004eb9: POP
00004eba: PUSH1 0x01
00004ebc: PUSH1 0x01
00004ebe: PUSH1 0xa0
00004ec0: SHL
00004ec1: SUB
00004ec2: DUP3
00004ec3: AND
00004ec4: PUSH1 0x86
00004ec6: PUSH1 0x02
00004ec8: ADD
00004ec9: SLOAD
00004eca: PUSH1 0x01
00004ecc: PUSH1 0x01
00004ece: PUSH1 0xa0
00004ed0: SHL
00004ed1: SUB
00004ed2: AND
00004ed3: EQ
00004ed4: JUMPDEST
00004ed5: DUP1
00004ed6: PUSH2 0x4ef5
00004ed9: JUMPI
00004eda: POP
00004edb: PUSH1 0x01
00004edd: PUSH1 0x01
00004edf: PUSH1 0xa0
00004ee1: SHL
00004ee2: SUB
00004ee3: DUP3
00004ee4: AND
00004ee5: PUSH1 0x86
00004ee7: PUSH1 0x03
00004ee9: ADD
00004eea: SLOAD
00004eeb: PUSH1 0x01
00004eed: PUSH1 0x01
00004eef: PUSH1 0xa0
00004ef1: SHL
00004ef2: SUB
00004ef3: AND
00004ef4: EQ
00004ef5: JUMPDEST
00004ef6: DUP1
00004ef7: PUSH2 0x1442
00004efa: JUMPI
00004efb: POP
00004efc: POP
00004efd: PUSH1 0x69
00004eff: SLOAD
00004f00: PUSH1 0x01
00004f02: PUSH1 0x01
00004f04: PUSH1 0xa0
00004f06: SHL
00004f07: SUB
00004f08: SWAP1
00004f09: DUP2
00004f0a: AND
00004f0b: SWAP2
00004f0c: AND
00004f0d: EQ
00004f0e: SWAP1
00004f0f: JUMP
00004f10: JUMPDEST
00004f11: PUSH1 0x6b
00004f13: SLOAD
00004f14: PUSH1 0x66
00004f16: SLOAD
00004f17: PUSH1 0x40
00004f19: DUP1
00004f1a: MLOAD
00004f1b: PUSH4 0x70a08231
00004f20: PUSH1 0xe0
00004f22: SHL
00004f23: DUP2
00004f24: MSTORE
00004f25: ADDRESS
00004f26: PUSH1 0x04
00004f28: DUP3
00004f29: ADD
00004f2a: MSTORE
00004f2b: SWAP1
00004f2c: MLOAD
00004f2d: PUSH1 0x00
00004f2f: SWAP4
00004f30: DUP5
00004f31: SWAP4
00004f32: PUSH2 0x4f68
00004f35: SWAP4
00004f36: SWAP2
00004f37: SWAP3
00004f38: PUSH1 0x01
00004f3a: PUSH1 0x01
00004f3c: PUSH1 0xa0
00004f3e: SHL
00004f3f: SUB
00004f40: SWAP1
00004f41: SWAP2
00004f42: AND
00004f43: SWAP2
00004f44: PUSH4 0x70a08231
00004f49: SWAP2
00004f4a: PUSH1 0x24
00004f4c: DUP1
00004f4d: DUP4
00004f4e: ADD
00004f4f: SWAP3
00004f50: PUSH1 0x20
00004f52: SWAP3
00004f53: SWAP2
00004f54: SWAP1
00004f55: DUP3
00004f56: SWAP1
00004f57: SUB
00004f58: ADD
00004f59: DUP2
00004f5a: DUP7
00004f5b: DUP1
00004f5c: EXTCODESIZE
00004f5d: ISZERO
00004f5e: DUP1
00004f5f: ISZERO
00004f60: PUSH2 0x3abb
00004f63: JUMPI
00004f64: PUSH1 0x00
00004f66: DUP1
00004f67: REVERT
00004f68: JUMPDEST
00004f69: SWAP1
00004f6a: POP
00004f6b: PUSH1 0x83
00004f6d: SLOAD
00004f6e: DUP2
00004f6f: GT
00004f70: PUSH2 0x4f7a
00004f73: JUMPI
00004f74: PUSH1 0x00
00004f76: PUSH2 0x4f88
00004f79: JUMP
00004f7a: JUMPDEST
00004f7b: PUSH1 0x83
00004f7d: SLOAD
00004f7e: PUSH2 0x4f88
00004f81: SWAP1
00004f82: DUP3
00004f83: SWAP1
00004f84: PUSH2 0x3796
00004f87: JUMP
00004f88: JUMPDEST
00004f89: SWAP2
00004f8a: POP
00004f8b: POP
00004f8c: SWAP1
00004f8d: JUMP
00004f8e: JUMPDEST
00004f8f: PUSH1 0x01
00004f91: PUSH1 0x01
00004f93: PUSH1 0xa0
00004f95: SHL
00004f96: SUB
00004f97: DUP5
00004f98: AND
00004f99: PUSH1 0x00
00004f9b: SWAP1
00004f9c: DUP2
00004f9d: MSTORE
00004f9e: PUSH1 0x71
00004fa0: PUSH1 0x20
00004fa2: MSTORE
00004fa3: PUSH1 0x40
00004fa5: SWAP1
00004fa6: KECCAK256
00004fa7: DUP4
00004fa8: ISZERO
00004fa9: DUP1
00004faa: PUSH2 0x4fb5
00004fad: JUMPI
00004fae: POP
00004faf: PUSH1 0x01
00004fb1: DUP2
00004fb2: ADD
00004fb3: SLOAD
00004fb4: ISZERO
00004fb5: JUMPDEST
00004fb6: ISZERO
00004fb7: PUSH2 0x4fd2
00004fba: JUMPI
00004fbb: PUSH1 0x72
00004fbd: SLOAD
00004fbe: PUSH2 0x4fc8
00004fc1: SWAP1
00004fc2: PUSH1 0x01
00004fc4: PUSH2 0x4096
00004fc7: JUMP
00004fc8: JUMPDEST
00004fc9: PUSH1 0x72
00004fcb: SSTORE
00004fcc: TIMESTAMP
00004fcd: PUSH1 0x01
00004fcf: DUP3
00004fd0: ADD
00004fd1: SSTORE
00004fd2: JUMPDEST
00004fd3: PUSH1 0x06
00004fd5: DUP2
00004fd6: ADD
00004fd7: SLOAD
00004fd8: PUSH2 0x4fe1
00004fdb: SWAP1
00004fdc: DUP5
00004fdd: PUSH2 0x4096
00004fe0: JUMP
00004fe1: JUMPDEST
00004fe2: PUSH1 0x06
00004fe4: DUP3
00004fe5: ADD
00004fe6: SSTORE
00004fe7: TIMESTAMP
00004fe8: DUP2
00004fe9: SSTORE
00004fea: PUSH1 0x68
00004fec: SLOAD
00004fed: PUSH1 0x40
00004fef: DUP1
00004ff0: MLOAD
00004ff1: PUSH4 0xdf8a4e45
00004ff6: PUSH1 0xe0
00004ff8: SHL
00004ff9: DUP2
00004ffa: MSTORE
00004ffb: ADDRESS
00004ffc: PUSH1 0x04
00004ffe: DUP3
00004fff: ADD
00005000: MSTORE
00005001: PUSH1 0x01
00005003: PUSH1 0x01
00005005: PUSH1 0xa0
00005007: SHL
00005008: SUB
00005009: DUP9
0000500a: DUP2
0000500b: AND
0000500c: PUSH1 0x24
0000500e: DUP4
0000500f: ADD
00005010: MSTORE
00005011: PUSH1 0x44
00005013: DUP3
00005014: ADD
00005015: DUP9
00005016: SWAP1
00005017: MSTORE
00005018: PUSH1 0x64
0000501a: DUP3
0000501b: ADD
0000501c: DUP7
0000501d: SWAP1
0000501e: MSTORE
0000501f: PUSH1 0x01
00005021: PUSH1 0x84
00005023: DUP4
00005024: ADD
00005025: MSTORE
00005026: SWAP2
00005027: MLOAD
00005028: SWAP2
00005029: SWAP1
0000502a: SWAP3
0000502b: AND
0000502c: SWAP2
0000502d: PUSH4 0xdf8a4e45
00005032: SWAP2
00005033: PUSH1 0xa4
00005035: DUP1
00005036: DUP4
00005037: ADD
00005038: SWAP3
00005039: PUSH1 0x00
0000503b: SWAP3
0000503c: SWAP2
0000503d: SWAP1
0000503e: DUP3
0000503f: SWAP1
00005040: SUB
00005041: ADD
00005042: DUP2
00005043: DUP4
00005044: DUP8
00005045: DUP1
00005046: EXTCODESIZE
00005047: ISZERO
00005048: DUP1
00005049: ISZERO
0000504a: PUSH2 0x5052
0000504d: JUMPI
0000504e: PUSH1 0x00
00005050: DUP1
00005051: REVERT
00005052: JUMPDEST
00005053: POP
00005054: GAS
00005055: CALL
00005056: ISZERO
00005057: DUP1
00005058: ISZERO
00005059: PUSH2 0x5066
0000505c: JUMPI
0000505d: RETURNDATASIZE
0000505e: PUSH1 0x00
00005060: DUP1
00005061: RETURNDATACOPY
00005062: RETURNDATASIZE
00005063: PUSH1 0x00
00005065: REVERT
00005066: JUMPDEST
00005067: POP
00005068: POP
00005069: POP
0000506a: POP
0000506b: POP
0000506c: POP
0000506d: POP
0000506e: POP
0000506f: POP
00005070: JUMP
00005071: JUMPDEST
00005072: PUSH1 0x00
00005074: PUSH2 0x50c6
00005077: DUP3
00005078: PUSH1 0x40
0000507a: MLOAD
0000507b: DUP1
0000507c: PUSH1 0x40
0000507e: ADD
0000507f: PUSH1 0x40
00005081: MSTORE
00005082: DUP1
00005083: PUSH1 0x20
00005085: DUP2
00005086: MSTORE
00005087: PUSH1 0x20
00005089: ADD
0000508a: PUSH32 0x5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564
000050ab: DUP2
000050ac: MSTORE
000050ad: POP
000050ae: DUP6
000050af: PUSH1 0x01
000050b1: PUSH1 0x01
000050b3: PUSH1 0xa0
000050b5: SHL
000050b6: SUB
000050b7: AND
000050b8: PUSH2 0x568b
000050bb: SWAP1
000050bc: SWAP3
000050bd: SWAP2
000050be: SWAP1
000050bf: PUSH4 0xffffffff
000050c4: AND
000050c5: JUMP
000050c6: JUMPDEST
000050c7: DUP1
000050c8: MLOAD
000050c9: SWAP1
000050ca: SWAP2
000050cb: POP
000050cc: ISZERO
000050cd: PUSH2 0x2007
000050d0: JUMPI
000050d1: DUP1
000050d2: DUP1
000050d3: PUSH1 0x20
000050d5: ADD
000050d6: SWAP1
000050d7: MLOAD
000050d8: PUSH1 0x20
000050da: DUP2
000050db: LT
000050dc: ISZERO
000050dd: PUSH2 0x50e5
000050e0: JUMPI
000050e1: PUSH1 0x00
000050e3: DUP1
000050e4: REVERT
000050e5: JUMPDEST
000050e6: POP
000050e7: MLOAD
000050e8: PUSH2 0x2007
000050eb: JUMPI
000050ec: PUSH1 0x40
000050ee: MLOAD
000050ef: PUSH3 0x461bcd
000050f3: PUSH1 0xe5
000050f5: SHL
000050f6: DUP2
000050f7: MSTORE
000050f8: PUSH1 0x04
000050fa: ADD
000050fb: DUP1
000050fc: DUP1
000050fd: PUSH1 0x20
000050ff: ADD
00005100: DUP3
00005101: DUP2
00005102: SUB
00005103: DUP3
00005104: MSTORE
00005105: PUSH1 0x2a
00005107: DUP2
00005108: MSTORE
00005109: PUSH1 0x20
0000510b: ADD
0000510c: DUP1
0000510d: PUSH2 0x5bcf
00005110: PUSH1 0x2a
00005112: SWAP2
00005113: CODECOPY
00005114: PUSH1 0x40
00005116: ADD
00005117: SWAP2
00005118: POP
00005119: POP
0000511a: PUSH1 0x40
0000511c: MLOAD
0000511d: DUP1
0000511e: SWAP2
0000511f: SUB
00005120: SWAP1
00005121: REVERT
00005122: JUMPDEST
00005123: PUSH1 0x66
00005125: SLOAD
00005126: PUSH1 0x01
00005128: PUSH1 0x01
0000512a: PUSH1 0xa0
0000512c: SHL
0000512d: SUB
0000512e: AND
0000512f: PUSH20 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
00005144: EQ
00005145: ISZERO
00005146: PUSH2 0x51d3
00005149: JUMPI
0000514a: DUP1
0000514b: SELFBALANCE
0000514c: LT
0000514d: ISZERO
0000514e: PUSH2 0x51c4
00005151: JUMPI
00005152: PUSH20 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
00005167: PUSH4 0x2e1a7d4d
0000516c: PUSH2 0x5175
0000516f: DUP4
00005170: SELFBALANCE
00005171: PUSH2 0x3796
00005174: JUMP
00005175: JUMPDEST
00005176: PUSH1 0x40
00005178: MLOAD
00005179: DUP3
0000517a: PUSH4 0xffffffff
0000517f: AND
00005180: PUSH1 0xe0
00005182: SHL
00005183: DUP2
00005184: MSTORE
00005185: PUSH1 0x04
00005187: ADD
00005188: DUP1
00005189: DUP3
0000518a: DUP2
0000518b: MSTORE
0000518c: PUSH1 0x20
0000518e: ADD
0000518f: SWAP2
00005190: POP
00005191: POP
00005192: PUSH1 0x00
00005194: PUSH1 0x40
00005196: MLOAD
00005197: DUP1
00005198: DUP4
00005199: SUB
0000519a: DUP2
0000519b: PUSH1 0x00
0000519d: DUP8
0000519e: DUP1
0000519f: EXTCODESIZE
000051a0: ISZERO
000051a1: DUP1
000051a2: ISZERO
000051a3: PUSH2 0x51ab
000051a6: JUMPI
000051a7: PUSH1 0x00
000051a9: DUP1
000051aa: REVERT
000051ab: JUMPDEST
000051ac: POP
000051ad: GAS
000051ae: CALL
000051af: ISZERO
000051b0: DUP1
000051b1: ISZERO
000051b2: PUSH2 0x51bf
000051b5: JUMPI
000051b6: RETURNDATASIZE
000051b7: PUSH1 0x00
000051b9: DUP1
000051ba: RETURNDATACOPY
000051bb: RETURNDATASIZE
000051bc: PUSH1 0x00
000051be: REVERT
000051bf: JUMPDEST
000051c0: POP
000051c1: POP
000051c2: POP
000051c3: POP
000051c4: JUMPDEST
000051c5: PUSH2 0x51ce
000051c8: DUP3
000051c9: DUP3
000051ca: PUSH2 0x56a2
000051cd: JUMP
000051ce: JUMPDEST
000051cf: PUSH2 0x3664
000051d2: JUMP
000051d3: JUMPDEST
000051d4: PUSH1 0x66
000051d6: SLOAD
000051d7: PUSH2 0x3664
000051da: SWAP1
000051db: PUSH1 0x01
000051dd: PUSH1 0x01
000051df: PUSH1 0xa0
000051e1: SHL
000051e2: SUB
000051e3: AND
000051e4: DUP4
000051e5: DUP4
000051e6: PUSH2 0x5519
000051e9: JUMP
000051ea: JUMPDEST
000051eb: DUP1
000051ec: ISZERO
000051ed: DUP1
000051ee: PUSH2 0x5289
000051f1: JUMPI
000051f2: POP
000051f3: PUSH1 0x40
000051f5: DUP1
000051f6: MLOAD
000051f7: PUSH32 0xdd62ed3e00000000000000000000000000000000000000000000000000000000
00005218: DUP2
00005219: MSTORE
0000521a: ADDRESS
0000521b: PUSH1 0x04
0000521d: DUP3
0000521e: ADD
0000521f: MSTORE
00005220: PUSH1 0x01
00005222: PUSH1 0x01
00005224: PUSH1 0xa0
00005226: SHL
00005227: SUB
00005228: DUP5
00005229: DUP2
0000522a: AND
0000522b: PUSH1 0x24
0000522d: DUP4
0000522e: ADD
0000522f: MSTORE
00005230: SWAP2
00005231: MLOAD
00005232: SWAP2
00005233: DUP6
00005234: AND
00005235: SWAP2
00005236: PUSH4 0xdd62ed3e
0000523b: SWAP2
0000523c: PUSH1 0x44
0000523e: DUP1
0000523f: DUP3
00005240: ADD
00005241: SWAP3
00005242: PUSH1 0x20
00005244: SWAP3
00005245: SWAP1
00005246: SWAP2
00005247: SWAP1
00005248: DUP3
00005249: SWAP1
0000524a: SUB
0000524b: ADD
0000524c: DUP2
0000524d: DUP7
0000524e: DUP1
0000524f: EXTCODESIZE
00005250: ISZERO
00005251: DUP1
00005252: ISZERO
00005253: PUSH2 0x525b
00005256: JUMPI
00005257: PUSH1 0x00
00005259: DUP1
0000525a: REVERT
0000525b: JUMPDEST
0000525c: POP
0000525d: GAS
0000525e: STATICCALL
0000525f: ISZERO
00005260: DUP1
00005261: ISZERO
00005262: PUSH2 0x526f
00005265: JUMPI
00005266: RETURNDATASIZE
00005267: PUSH1 0x00
00005269: DUP1
0000526a: RETURNDATACOPY
0000526b: RETURNDATASIZE
0000526c: PUSH1 0x00
0000526e: REVERT
0000526f: JUMPDEST
00005270: POP
00005271: POP
00005272: POP
00005273: POP
00005274: PUSH1 0x40
00005276: MLOAD
00005277: RETURNDATASIZE
00005278: PUSH1 0x20
0000527a: DUP2
0000527b: LT
0000527c: ISZERO
0000527d: PUSH2 0x5285
00005280: JUMPI
00005281: PUSH1 0x00
00005283: DUP1
00005284: REVERT
00005285: JUMPDEST
00005286: POP
00005287: MLOAD
00005288: ISZERO
00005289: JUMPDEST
0000528a: PUSH2 0x52c4
0000528d: JUMPI
0000528e: PUSH1 0x40
00005290: MLOAD
00005291: PUSH3 0x461bcd
00005295: PUSH1 0xe5
00005297: SHL
00005298: DUP2
00005299: MSTORE
0000529a: PUSH1 0x04
0000529c: ADD
0000529d: DUP1
0000529e: DUP1
0000529f: PUSH1 0x20
000052a1: ADD
000052a2: DUP3
000052a3: DUP2
000052a4: SUB
000052a5: DUP3
000052a6: MSTORE
000052a7: PUSH1 0x36
000052a9: DUP2
000052aa: MSTORE
000052ab: PUSH1 0x20
000052ad: ADD
000052ae: DUP1
000052af: PUSH2 0x5bf9
000052b2: PUSH1 0x36
000052b4: SWAP2
000052b5: CODECOPY
000052b6: PUSH1 0x40
000052b8: ADD
000052b9: SWAP2
000052ba: POP
000052bb: POP
000052bc: PUSH1 0x40
000052be: MLOAD
000052bf: DUP1
000052c0: SWAP2
000052c1: SUB
000052c2: SWAP1
000052c3: REVERT
000052c4: JUMPDEST
000052c5: PUSH1 0x40
000052c7: DUP1
000052c8: MLOAD
000052c9: PUSH1 0x01
000052cb: PUSH1 0x01
000052cd: PUSH1 0xa0
000052cf: SHL
000052d0: SUB
000052d1: DUP5
000052d2: AND
000052d3: PUSH1 0x24
000052d5: DUP3
000052d6: ADD
000052d7: MSTORE
000052d8: PUSH1 0x44
000052da: DUP1
000052db: DUP3
000052dc: ADD
000052dd: DUP5
000052de: SWAP1
000052df: MSTORE
000052e0: DUP3
000052e1: MLOAD
000052e2: DUP1
000052e3: DUP4
000052e4: SUB
000052e5: SWAP1
000052e6: SWAP2
000052e7: ADD
000052e8: DUP2
000052e9: MSTORE
000052ea: PUSH1 0x64
000052ec: SWAP1
000052ed: SWAP2
000052ee: ADD
000052ef: SWAP1
000052f0: SWAP2
000052f1: MSTORE
000052f2: PUSH1 0x20
000052f4: DUP2
000052f5: ADD
000052f6: DUP1
000052f7: MLOAD
000052f8: PUSH1 0x01
000052fa: PUSH1 0x01
000052fc: PUSH1 0xe0
000052fe: SHL
000052ff: SUB
00005300: AND
00005301: PUSH32 0x095ea7b300000000000000000000000000000000000000000000000000000000
00005322: OR
00005323: SWAP1
00005324: MSTORE
00005325: PUSH2 0x2007
00005328: SWAP1
00005329: DUP5
0000532a: SWAP1
0000532b: PUSH2 0x5071
0000532e: JUMP
0000532f: JUMPDEST
00005330: PUSH3 0x461bcd
00005334: PUSH1 0xe5
00005336: SHL
00005337: PUSH1 0x00
00005339: SWAP1
0000533a: DUP2
0000533b: MSTORE
0000533c: PUSH1 0x20
0000533e: PUSH1 0x04
00005340: MSTORE
00005341: PUSH1 0x07
00005343: PUSH1 0x24
00005345: MSTORE
00005346: PUSH7 0x42414223000030
0000534e: PUSH1 0x0a
00005350: DUP1
00005351: DUP5
00005352: DIV
00005353: DUP2
00005354: DUP2
00005355: MOD
00005356: PUSH1 0x30
00005358: SWAP1
00005359: DUP2
0000535a: ADD
0000535b: PUSH1 0x08
0000535d: SHL
0000535e: SWAP6
0000535f: DUP4
00005360: SWAP1
00005361: MOD
00005362: SWAP6
00005363: SWAP1
00005364: SWAP6
00005365: ADD
00005366: SWAP1
00005367: DUP3
00005368: SWAP1
00005369: DIV
0000536a: SWAP2
0000536b: DUP3
0000536c: MOD
0000536d: SWAP1
0000536e: SWAP5
0000536f: ADD
00005370: PUSH1 0x10
00005372: SHL
00005373: SWAP4
00005374: SWAP1
00005375: SWAP4
00005376: ADD
00005377: ADD
00005378: PUSH1 0xc8
0000537a: SHL
0000537b: PUSH1 0x44
0000537d: MSTORE
0000537e: PUSH1 0x64
00005380: SWAP1
00005381: REVERT
00005382: JUMPDEST
00005383: PUSH8 0x0de0b6b3a7640000
0000538c: SWAP1
0000538d: JUMP
0000538e: JUMPDEST
0000538f: PUSH1 0x00
00005391: PUSH2 0x149e
00005394: PUSH1 0x66
00005396: PUSH1 0x00
00005398: SWAP1
00005399: SLOAD
0000539a: SWAP1
0000539b: PUSH2 0x0100
0000539e: EXP
0000539f: SWAP1
000053a0: DIV
000053a1: PUSH1 0x01
000053a3: PUSH1 0x01
000053a5: PUSH1 0xa0
000053a7: SHL
000053a8: SUB
000053a9: AND
000053aa: PUSH1 0x01
000053ac: PUSH1 0x01
000053ae: PUSH1 0xa0
000053b0: SHL
000053b1: SUB
000053b2: AND
000053b3: PUSH4 0x313ce567
000053b8: PUSH1 0x40
000053ba: MLOAD
000053bb: DUP2
000053bc: PUSH4 0xffffffff
000053c1: AND
000053c2: PUSH1 0xe0
000053c4: SHL
000053c5: DUP2
000053c6: MSTORE
000053c7: PUSH1 0x04
000053c9: ADD
000053ca: PUSH1 0x20
000053cc: PUSH1 0x40
000053ce: MLOAD
000053cf: DUP1
000053d0: DUP4
000053d1: SUB
000053d2: DUP2
000053d3: DUP7
000053d4: DUP1
000053d5: EXTCODESIZE
000053d6: ISZERO
000053d7: DUP1
000053d8: ISZERO
000053d9: PUSH2 0x53e1
000053dc: JUMPI
000053dd: PUSH1 0x00
000053df: DUP1
000053e0: REVERT
000053e1: JUMPDEST
000053e2: POP
000053e3: GAS
000053e4: STATICCALL
000053e5: ISZERO
000053e6: DUP1
000053e7: ISZERO
000053e8: PUSH2 0x53f5
000053eb: JUMPI
000053ec: RETURNDATASIZE
000053ed: PUSH1 0x00
000053ef: DUP1
000053f0: RETURNDATACOPY
000053f1: RETURNDATASIZE
000053f2: PUSH1 0x00
000053f4: REVERT
000053f5: JUMPDEST
000053f6: POP
000053f7: POP
000053f8: POP
000053f9: POP
000053fa: PUSH1 0x40
000053fc: MLOAD
000053fd: RETURNDATASIZE
000053fe: PUSH1 0x20
00005400: DUP2
00005401: LT
00005402: ISZERO
00005403: PUSH2 0x540b
00005406: JUMPI
00005407: PUSH1 0x00
00005409: DUP1
0000540a: REVERT
0000540b: JUMPDEST
0000540c: POP
0000540d: MLOAD
0000540e: PUSH1 0xff
00005410: AND
00005411: PUSH1 0x0a
00005413: EXP
00005414: PUSH2 0x4dd8
00005417: DUP6
00005418: DUP6
00005419: PUSH2 0x4548
0000541c: JUMP
0000541d: JUMPDEST
0000541e: PUSH1 0x01
00005420: PUSH1 0x01
00005422: PUSH1 0xa0
00005424: SHL
00005425: SUB
00005426: DUP3
00005427: AND
00005428: PUSH2 0x5462
0000542b: JUMPI
0000542c: PUSH1 0x40
0000542e: MLOAD
0000542f: PUSH3 0x461bcd
00005433: PUSH1 0xe5
00005435: SHL
00005436: DUP2
00005437: MSTORE
00005438: PUSH1 0x04
0000543a: ADD
0000543b: DUP1
0000543c: DUP1
0000543d: PUSH1 0x20
0000543f: ADD
00005440: DUP3
00005441: DUP2
00005442: SUB
00005443: DUP3
00005444: MSTORE
00005445: PUSH1 0x21
00005447: DUP2
00005448: MSTORE
00005449: PUSH1 0x20
0000544b: ADD
0000544c: DUP1
0000544d: PUSH2 0x5b3b
00005450: PUSH1 0x21
00005452: SWAP2
00005453: CODECOPY
00005454: PUSH1 0x40
00005456: ADD
00005457: SWAP2
00005458: POP
00005459: POP
0000545a: PUSH1 0x40
0000545c: MLOAD
0000545d: DUP1
0000545e: SWAP2
0000545f: SUB
00005460: SWAP1
00005461: REVERT
00005462: JUMPDEST
00005463: PUSH2 0x546e
00005466: DUP3
00005467: PUSH1 0x00
00005469: DUP4
0000546a: PUSH2 0x493d
0000546d: JUMP
0000546e: JUMPDEST
0000546f: PUSH2 0x54ab
00005472: DUP2
00005473: PUSH1 0x40
00005475: MLOAD
00005476: DUP1
00005477: PUSH1 0x60
00005479: ADD
0000547a: PUSH1 0x40
0000547c: MSTORE
0000547d: DUP1
0000547e: PUSH1 0x22
00005480: DUP2
00005481: MSTORE
00005482: PUSH1 0x20
00005484: ADD
00005485: PUSH2 0x5a05
00005488: PUSH1 0x22
0000548a: SWAP2
0000548b: CODECOPY
0000548c: PUSH1 0x01
0000548e: PUSH1 0x01
00005490: PUSH1 0xa0
00005492: SHL
00005493: SUB
00005494: DUP6
00005495: AND
00005496: PUSH1 0x00
00005498: SWAP1
00005499: DUP2
0000549a: MSTORE
0000549b: PUSH1 0x33
0000549d: PUSH1 0x20
0000549f: MSTORE
000054a0: PUSH1 0x40
000054a2: SWAP1
000054a3: KECCAK256
000054a4: SLOAD
000054a5: SWAP2
000054a6: SWAP1
000054a7: PUSH2 0x3527
000054aa: JUMP
000054ab: JUMPDEST
000054ac: PUSH1 0x01
000054ae: PUSH1 0x01
000054b0: PUSH1 0xa0
000054b2: SHL
000054b3: SUB
000054b4: DUP4
000054b5: AND
000054b6: PUSH1 0x00
000054b8: SWAP1
000054b9: DUP2
000054ba: MSTORE
000054bb: PUSH1 0x33
000054bd: PUSH1 0x20
000054bf: MSTORE
000054c0: PUSH1 0x40
000054c2: SWAP1
000054c3: KECCAK256
000054c4: SSTORE
000054c5: PUSH1 0x35
000054c7: SLOAD
000054c8: PUSH2 0x54d1
000054cb: SWAP1
000054cc: DUP3
000054cd: PUSH2 0x5787
000054d0: JUMP
000054d1: JUMPDEST
000054d2: PUSH1 0x35
000054d4: SSTORE
000054d5: PUSH1 0x40
000054d7: DUP1
000054d8: MLOAD
000054d9: DUP3
000054da: DUP2
000054db: MSTORE
000054dc: SWAP1
000054dd: MLOAD
000054de: PUSH1 0x00
000054e0: SWAP2
000054e1: PUSH1 0x01
000054e3: PUSH1 0x01
000054e5: PUSH1 0xa0
000054e7: SHL
000054e8: SUB
000054e9: DUP6
000054ea: AND
000054eb: SWAP2
000054ec: PUSH32 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
0000550d: SWAP2
0000550e: DUP2
0000550f: SWAP1
00005510: SUB
00005511: PUSH1 0x20
00005513: ADD
00005514: SWAP1
00005515: LOG3
00005516: POP
00005517: POP
00005518: JUMP
00005519: JUMPDEST
0000551a: PUSH1 0x40
0000551c: DUP1
0000551d: MLOAD
0000551e: PUSH1 0x01
00005520: PUSH1 0x01
00005522: PUSH1 0xa0
00005524: SHL
00005525: SUB
00005526: DUP5
00005527: AND
00005528: PUSH1 0x24
0000552a: DUP3
0000552b: ADD
0000552c: MSTORE
0000552d: PUSH1 0x44
0000552f: DUP1
00005530: DUP3
00005531: ADD
00005532: DUP5
00005533: SWAP1
00005534: MSTORE
00005535: DUP3
00005536: MLOAD
00005537: DUP1
00005538: DUP4
00005539: SUB
0000553a: SWAP1
0000553b: SWAP2
0000553c: ADD
0000553d: DUP2
0000553e: MSTORE
0000553f: PUSH1 0x64
00005541: SWAP1
00005542: SWAP2
00005543: ADD
00005544: SWAP1
00005545: SWAP2
00005546: MSTORE
00005547: PUSH1 0x20
00005549: DUP2
0000554a: ADD
0000554b: DUP1
0000554c: MLOAD
0000554d: PUSH1 0x01
0000554f: PUSH1 0x01
00005551: PUSH1 0xe0
00005553: SHL
00005554: SUB
00005555: AND
00005556: PUSH32 0xa9059cbb00000000000000000000000000000000000000000000000000000000
00005577: OR
00005578: SWAP1
00005579: MSTORE
0000557a: PUSH2 0x2007
0000557d: SWAP1
0000557e: DUP5
0000557f: SWAP1
00005580: PUSH2 0x5071
00005583: JUMP
00005584: JUMPDEST
00005585: PUSH1 0x01
00005587: PUSH1 0x01
00005589: PUSH1 0xa0
0000558b: SHL
0000558c: SUB
0000558d: DUP6
0000558e: AND
0000558f: PUSH1 0x00
00005591: SWAP1
00005592: DUP2
00005593: MSTORE
00005594: PUSH1 0x71
00005596: PUSH1 0x20
00005598: MSTORE
00005599: PUSH1 0x40
0000559b: SWAP1
0000559c: KECCAK256
0000559d: DUP3
0000559e: PUSH2 0x55e9
000055a1: JUMPI
000055a2: PUSH1 0x00
000055a4: DUP1
000055a5: DUP3
000055a6: SSTORE
000055a7: PUSH1 0x01
000055a9: DUP1
000055aa: DUP4
000055ab: ADD
000055ac: DUP3
000055ad: SWAP1
000055ae: SSTORE
000055af: PUSH1 0x05
000055b1: DUP4
000055b2: ADD
000055b3: DUP3
000055b4: SWAP1
000055b5: SSTORE
000055b6: PUSH1 0x06
000055b8: DUP4
000055b9: ADD
000055ba: DUP3
000055bb: SWAP1
000055bc: SSTORE
000055bd: PUSH1 0x01
000055bf: PUSH1 0x01
000055c1: PUSH1 0xa0
000055c3: SHL
000055c4: SUB
000055c5: DUP9
000055c6: AND
000055c7: DUP3
000055c8: MSTORE
000055c9: PUSH1 0x93
000055cb: PUSH1 0x20
000055cd: MSTORE
000055ce: PUSH1 0x40
000055d0: DUP3
000055d1: KECCAK256
000055d2: SWAP2
000055d3: SWAP1
000055d4: SWAP2
000055d5: SSTORE
000055d6: PUSH1 0x72
000055d8: SLOAD
000055d9: PUSH2 0x55e1
000055dc: SWAP2
000055dd: PUSH2 0x3796
000055e0: JUMP
000055e1: JUMPDEST
000055e2: PUSH1 0x72
000055e4: SSTORE
000055e5: PUSH2 0x55fe
000055e8: JUMP
000055e9: JUMPDEST
000055ea: PUSH1 0x05
000055ec: DUP2
000055ed: ADD
000055ee: SLOAD
000055ef: PUSH2 0x55f8
000055f2: SWAP1
000055f3: DUP7
000055f4: PUSH2 0x4096
000055f7: JUMP
000055f8: JUMPDEST
000055f9: PUSH1 0x05
000055fb: DUP3
000055fc: ADD
000055fd: SSTORE
000055fe: JUMPDEST
000055ff: PUSH1 0x68
00005601: SLOAD
00005602: PUSH1 0x40
00005604: DUP1
00005605: MLOAD
00005606: PUSH4 0xdf8a4e45
0000560b: PUSH1 0xe0
0000560d: SHL
0000560e: DUP2
0000560f: MSTORE
00005610: ADDRESS
00005611: PUSH1 0x04
00005613: DUP3
00005614: ADD
00005615: MSTORE
00005616: PUSH1 0x01
00005618: PUSH1 0x01
0000561a: PUSH1 0xa0
0000561c: SHL
0000561d: SUB
0000561e: DUP10
0000561f: DUP2
00005620: AND
00005621: PUSH1 0x24
00005623: DUP4
00005624: ADD
00005625: MSTORE
00005626: PUSH1 0x44
00005628: DUP3
00005629: ADD
0000562a: DUP9
0000562b: SWAP1
0000562c: MSTORE
0000562d: PUSH1 0x64
0000562f: DUP3
00005630: ADD
00005631: DUP7
00005632: SWAP1
00005633: MSTORE
00005634: PUSH1 0x00
00005636: PUSH1 0x84
00005638: DUP4
00005639: ADD
0000563a: DUP2
0000563b: SWAP1
0000563c: MSTORE
0000563d: SWAP3
0000563e: MLOAD
0000563f: SWAP4
00005640: AND
00005641: SWAP3
00005642: PUSH4 0xdf8a4e45
00005647: SWAP3
00005648: PUSH1 0xa4
0000564a: DUP1
0000564b: DUP5
0000564c: ADD
0000564d: SWAP4
0000564e: SWAP2
0000564f: SWAP3
00005650: SWAP2
00005651: DUP3
00005652: SWAP1
00005653: SUB
00005654: ADD
00005655: DUP2
00005656: DUP4
00005657: DUP8
00005658: DUP1
00005659: EXTCODESIZE
0000565a: ISZERO
0000565b: DUP1
0000565c: ISZERO
0000565d: PUSH2 0x5665
00005660: JUMPI
00005661: PUSH1 0x00
00005663: DUP1
00005664: REVERT
00005665: JUMPDEST
00005666: POP
00005667: GAS
00005668: CALL
00005669: ISZERO
0000566a: DUP1
0000566b: ISZERO
0000566c: PUSH2 0x5679
0000566f: JUMPI
00005670: RETURNDATASIZE
00005671: PUSH1 0x00
00005673: DUP1
00005674: RETURNDATACOPY
00005675: RETURNDATASIZE
00005676: PUSH1 0x00
00005678: REVERT
00005679: JUMPDEST
0000567a: POP
0000567b: POP
0000567c: POP
0000567d: POP
0000567e: POP
0000567f: POP
00005680: POP
00005681: POP
00005682: POP
00005683: POP
00005684: JUMP
00005685: JUMPDEST
00005686: EXTCODESIZE
00005687: ISZERO
00005688: ISZERO
00005689: SWAP1
0000568a: JUMP
0000568b: JUMPDEST
0000568c: PUSH1 0x60
0000568e: PUSH2 0x569a
00005691: DUP5
00005692: DUP5
00005693: PUSH1 0x00
00005695: DUP6
00005696: PUSH2 0x57e4
00005699: JUMP
0000569a: JUMPDEST
0000569b: SWAP5
0000569c: SWAP4
0000569d: POP
0000569e: POP
0000569f: POP
000056a0: POP
000056a1: JUMP
000056a2: JUMPDEST
000056a3: DUP1
000056a4: SELFBALANCE
000056a5: LT
000056a6: ISZERO
000056a7: PUSH2 0x56f7
000056aa: JUMPI
000056ab: PUSH1 0x40
000056ad: DUP1
000056ae: MLOAD
000056af: PUSH3 0x461bcd
000056b3: PUSH1 0xe5
000056b5: SHL
000056b6: DUP2
000056b7: MSTORE
000056b8: PUSH1 0x20
000056ba: PUSH1 0x04
000056bc: DUP3
000056bd: ADD
000056be: MSTORE
000056bf: PUSH1 0x1d
000056c1: PUSH1 0x24
000056c3: DUP3
000056c4: ADD
000056c5: MSTORE
000056c6: PUSH32 0x416464726573733a20696e73756666696369656e742062616c616e6365000000
000056e7: PUSH1 0x44
000056e9: DUP3
000056ea: ADD
000056eb: MSTORE
000056ec: SWAP1
000056ed: MLOAD
000056ee: SWAP1
000056ef: DUP2
000056f0: SWAP1
000056f1: SUB
000056f2: PUSH1 0x64
000056f4: ADD
000056f5: SWAP1
000056f6: REVERT
000056f7: JUMPDEST
000056f8: PUSH1 0x40
000056fa: MLOAD
000056fb: PUSH1 0x00
000056fd: SWAP1
000056fe: PUSH1 0x01
00005700: PUSH1 0x01
00005702: PUSH1 0xa0
00005704: SHL
00005705: SUB
00005706: DUP5
00005707: AND
00005708: SWAP1
00005709: DUP4
0000570a: SWAP1
0000570b: DUP4
0000570c: DUP2
0000570d: DUP2
0000570e: DUP2
0000570f: DUP6
00005710: DUP8
00005711: GAS
00005712: CALL
00005713: SWAP3
00005714: POP
00005715: POP
00005716: POP
00005717: RETURNDATASIZE
00005718: DUP1
00005719: PUSH1 0x00
0000571b: DUP2
0000571c: EQ
0000571d: PUSH2 0x5742
00005720: JUMPI
00005721: PUSH1 0x40
00005723: MLOAD
00005724: SWAP2
00005725: POP
00005726: PUSH1 0x1f
00005728: NOT
00005729: PUSH1 0x3f
0000572b: RETURNDATASIZE
0000572c: ADD
0000572d: AND
0000572e: DUP3
0000572f: ADD
00005730: PUSH1 0x40
00005732: MSTORE
00005733: RETURNDATASIZE
00005734: DUP3
00005735: MSTORE
00005736: RETURNDATASIZE
00005737: PUSH1 0x00
00005739: PUSH1 0x20
0000573b: DUP5
0000573c: ADD
0000573d: RETURNDATACOPY
0000573e: PUSH2 0x5747
00005741: JUMP
00005742: JUMPDEST
00005743: PUSH1 0x60
00005745: SWAP2
00005746: POP
00005747: JUMPDEST
00005748: POP
00005749: POP
0000574a: SWAP1
0000574b: POP
0000574c: DUP1
0000574d: PUSH2 0x2007
00005750: JUMPI
00005751: PUSH1 0x40
00005753: MLOAD
00005754: PUSH3 0x461bcd
00005758: PUSH1 0xe5
0000575a: SHL
0000575b: DUP2
0000575c: MSTORE
0000575d: PUSH1 0x04
0000575f: ADD
00005760: DUP1
00005761: DUP1
00005762: PUSH1 0x20
00005764: ADD
00005765: DUP3
00005766: DUP2
00005767: SUB
00005768: DUP3
00005769: MSTORE
0000576a: PUSH1 0x3a
0000576c: DUP2
0000576d: MSTORE
0000576e: PUSH1 0x20
00005770: ADD
00005771: DUP1
00005772: PUSH2 0x5a6f
00005775: PUSH1 0x3a
00005777: SWAP2
00005778: CODECOPY
00005779: PUSH1 0x40
0000577b: ADD
0000577c: SWAP2
0000577d: POP
0000577e: POP
0000577f: PUSH1 0x40
00005781: MLOAD
00005782: DUP1
00005783: SWAP2
00005784: SUB
00005785: SWAP1
00005786: REVERT
00005787: JUMPDEST
00005788: PUSH1 0x00
0000578a: DUP3
0000578b: DUP3
0000578c: GT
0000578d: ISZERO
0000578e: PUSH2 0x57de
00005791: JUMPI
00005792: PUSH1 0x40
00005794: DUP1
00005795: MLOAD
00005796: PUSH3 0x461bcd
0000579a: PUSH1 0xe5
0000579c: SHL
0000579d: DUP2
0000579e: MSTORE
0000579f: PUSH1 0x20
000057a1: PUSH1 0x04
000057a3: DUP3
000057a4: ADD
000057a5: MSTORE
000057a6: PUSH1 0x1e
000057a8: PUSH1 0x24
000057aa: DUP3
000057ab: ADD
000057ac: MSTORE
000057ad: PUSH32 0x536166654d6174683a207375627472616374696f6e206f766572666c6f770000
000057ce: PUSH1 0x44
000057d0: DUP3
000057d1: ADD
000057d2: MSTORE
000057d3: SWAP1
000057d4: MLOAD
000057d5: SWAP1
000057d6: DUP2
000057d7: SWAP1
000057d8: SUB
000057d9: PUSH1 0x64
000057db: ADD
000057dc: SWAP1
000057dd: REVERT
000057de: JUMPDEST
000057df: POP
000057e0: SWAP1
000057e1: SUB
000057e2: SWAP1
000057e3: JUMP
000057e4: JUMPDEST
000057e5: PUSH1 0x60
000057e7: DUP3
000057e8: SELFBALANCE
000057e9: LT
000057ea: ISZERO
000057eb: PUSH2 0x5825
000057ee: JUMPI
000057ef: PUSH1 0x40
000057f1: MLOAD
000057f2: PUSH3 0x461bcd
000057f6: PUSH1 0xe5
000057f8: SHL
000057f9: DUP2
000057fa: MSTORE
000057fb: PUSH1 0x04
000057fd: ADD
000057fe: DUP1
000057ff: DUP1
00005800: PUSH1 0x20
00005802: ADD
00005803: DUP3
00005804: DUP2
00005805: SUB
00005806: DUP3
00005807: MSTORE
00005808: PUSH1 0x26
0000580a: DUP2
0000580b: MSTORE
0000580c: PUSH1 0x20
0000580e: ADD
0000580f: DUP1
00005810: PUSH2 0x5acb
00005813: PUSH1 0x26
00005815: SWAP2
00005816: CODECOPY
00005817: PUSH1 0x40
00005819: ADD
0000581a: SWAP2
0000581b: POP
0000581c: POP
0000581d: PUSH1 0x40
0000581f: MLOAD
00005820: DUP1
00005821: SWAP2
00005822: SUB
00005823: SWAP1
00005824: REVERT
00005825: JUMPDEST
00005826: PUSH2 0x582e
00005829: DUP6
0000582a: PUSH2 0x5685
0000582d: JUMP
0000582e: JUMPDEST
0000582f: PUSH2 0x587f
00005832: JUMPI
00005833: PUSH1 0x40
00005835: DUP1
00005836: MLOAD
00005837: PUSH3 0x461bcd
0000583b: PUSH1 0xe5
0000583d: SHL
0000583e: DUP2
0000583f: MSTORE
00005840: PUSH1 0x20
00005842: PUSH1 0x04
00005844: DUP3
00005845: ADD
00005846: MSTORE
00005847: PUSH1 0x1d
00005849: PUSH1 0x24
0000584b: DUP3
0000584c: ADD
0000584d: MSTORE
0000584e: PUSH32 0x416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000
0000586f: PUSH1 0x44
00005871: DUP3
00005872: ADD
00005873: MSTORE
00005874: SWAP1
00005875: MLOAD
00005876: SWAP1
00005877: DUP2
00005878: SWAP1
00005879: SUB
0000587a: PUSH1 0x64
0000587c: ADD
0000587d: SWAP1
0000587e: REVERT
0000587f: JUMPDEST
00005880: PUSH1 0x00
00005882: DUP1
00005883: DUP7
00005884: PUSH1 0x01
00005886: PUSH1 0x01
00005888: PUSH1 0xa0
0000588a: SHL
0000588b: SUB
0000588c: AND
0000588d: DUP6
0000588e: DUP8
0000588f: PUSH1 0x40
00005891: MLOAD
00005892: DUP1
00005893: DUP3
00005894: DUP1
00005895: MLOAD
00005896: SWAP1
00005897: PUSH1 0x20
00005899: ADD
0000589a: SWAP1
0000589b: DUP1
0000589c: DUP4
0000589d: DUP4
0000589e: JUMPDEST
0000589f: PUSH1 0x20
000058a1: DUP4
000058a2: LT
000058a3: PUSH2 0x58bd
000058a6: JUMPI
000058a7: DUP1
000058a8: MLOAD
000058a9: DUP3
000058aa: MSTORE
000058ab: PUSH1 0x1f
000058ad: NOT
000058ae: SWAP1
000058af: SWAP3
000058b0: ADD
000058b1: SWAP2
000058b2: PUSH1 0x20
000058b4: SWAP2
000058b5: DUP3
000058b6: ADD
000058b7: SWAP2
000058b8: ADD
000058b9: PUSH2 0x589e
000058bc: JUMP
000058bd: JUMPDEST
000058be: PUSH1 0x01
000058c0: DUP4
000058c1: PUSH1 0x20
000058c3: SUB
000058c4: PUSH2 0x0100
000058c7: EXP
000058c8: SUB
000058c9: DUP1
000058ca: NOT
000058cb: DUP3
000058cc: MLOAD
000058cd: AND
000058ce: DUP2
000058cf: DUP5
000058d0: MLOAD
000058d1: AND
000058d2: DUP1
000058d3: DUP3
000058d4: OR
000058d5: DUP6
000058d6: MSTORE
000058d7: POP
000058d8: POP
000058d9: POP
000058da: POP
000058db: POP
000058dc: POP
000058dd: SWAP1
000058de: POP
000058df: ADD
000058e0: SWAP2
000058e1: POP
000058e2: POP
000058e3: PUSH1 0x00
000058e5: PUSH1 0x40
000058e7: MLOAD
000058e8: DUP1
000058e9: DUP4
000058ea: SUB
000058eb: DUP2
000058ec: DUP6
000058ed: DUP8
000058ee: GAS
000058ef: CALL
000058f0: SWAP3
000058f1: POP
000058f2: POP
000058f3: POP
000058f4: RETURNDATASIZE
000058f5: DUP1
000058f6: PUSH1 0x00
000058f8: DUP2
000058f9: EQ
000058fa: PUSH2 0x591f
000058fd: JUMPI
000058fe: PUSH1 0x40
00005900: MLOAD
00005901: SWAP2
00005902: POP
00005903: PUSH1 0x1f
00005905: NOT
00005906: PUSH1 0x3f
00005908: RETURNDATASIZE
00005909: ADD
0000590a: AND
0000590b: DUP3
0000590c: ADD
0000590d: PUSH1 0x40
0000590f: MSTORE
00005910: RETURNDATASIZE
00005911: DUP3
00005912: MSTORE
00005913: RETURNDATASIZE
00005914: PUSH1 0x00
00005916: PUSH1 0x20
00005918: DUP5
00005919: ADD
0000591a: RETURNDATACOPY
0000591b: PUSH2 0x5924
0000591e: JUMP
0000591f: JUMPDEST
00005920: PUSH1 0x60
00005922: SWAP2
00005923: POP
00005924: JUMPDEST
00005925: POP
00005926: SWAP2
00005927: POP
00005928: SWAP2
00005929: POP
0000592a: PUSH2 0x5934
0000592d: DUP3
0000592e: DUP3
0000592f: DUP7
00005930: PUSH2 0x593f
00005933: JUMP
00005934: JUMPDEST
00005935: SWAP8
00005936: SWAP7
00005937: POP
00005938: POP
00005939: POP
0000593a: POP
0000593b: POP
0000593c: POP
0000593d: POP
0000593e: JUMP
0000593f: JUMPDEST
00005940: PUSH1 0x60
00005942: DUP4
00005943: ISZERO
00005944: PUSH2 0x594e
00005947: JUMPI
00005948: POP
00005949: DUP2
0000594a: PUSH2 0x149e
0000594d: JUMP
0000594e: JUMPDEST
0000594f: DUP3
00005950: MLOAD
00005951: ISZERO
00005952: PUSH2 0x595e
00005955: JUMPI
00005956: DUP3
00005957: MLOAD
00005958: DUP1
00005959: DUP5
0000595a: PUSH1 0x20
0000595c: ADD
0000595d: REVERT
0000595e: JUMPDEST
0000595f: PUSH1 0x40
00005961: MLOAD
00005962: PUSH3 0x461bcd
00005966: PUSH1 0xe5
00005968: SHL
00005969: DUP2
0000596a: MSTORE
0000596b: PUSH1 0x20
0000596d: PUSH1 0x04
0000596f: DUP3
00005970: ADD
00005971: DUP2
00005972: DUP2
00005973: MSTORE
00005974: DUP5
00005975: MLOAD
00005976: PUSH1 0x24
00005978: DUP5
00005979: ADD
0000597a: MSTORE
0000597b: DUP5
0000597c: MLOAD
0000597d: DUP6
0000597e: SWAP4
0000597f: SWAP2
00005980: SWAP3
00005981: DUP4
00005982: SWAP3
00005983: PUSH1 0x44
00005985: ADD
00005986: SWAP2
00005987: SWAP1
00005988: DUP6
00005989: ADD
0000598a: SWAP1
0000598b: DUP1
0000598c: DUP4
0000598d: DUP4
0000598e: PUSH1 0x00
00005990: DUP4
00005991: ISZERO
00005992: PUSH2 0x357b
00005995: JUMPI
00005996: DUP2
00005997: DUP2
00005998: ADD
00005999: MLOAD
0000599a: DUP4
0000599b: DUP3
0000599c: ADD
0000599d: MSTORE
0000599e: PUSH1 0x20
000059a0: ADD
000059a1: PUSH2 0x3563
000059a4: JUMP
000059a5: JUMPDEST
000059a6: PUSH1 0x00
000059a8: PUSH1 0x20
000059aa: DUP3
000059ab: DUP5
000059ac: SUB
000059ad: SLT
000059ae: ISZERO
000059af: PUSH2 0x59b6
000059b2: JUMPI
000059b3: DUP1
000059b4: DUP2
000059b5: REVERT
000059b6: JUMPDEST
000059b7: DUP2
000059b8: MLOAD
000059b9: PUSH1 0x01
000059bb: PUSH1 0x01
000059bd: PUSH1 0xa0
000059bf: SHL
000059c0: SUB
000059c1: DUP2
000059c2: AND
000059c3: DUP2
000059c4: EQ
000059c5: PUSH2 0x149e
000059c8: JUMPI
000059c9: DUP2
000059ca: DUP3
000059cb: REVERT
000059cc: JUMPDEST
000059cd: PUSH1 0x01
000059cf: PUSH1 0x01
000059d1: PUSH1 0xe0
000059d3: SHL
000059d4: SUB
000059d5: NOT
000059d6: SWAP2
000059d7: SWAP1
000059d8: SWAP2
000059d9: AND
000059da: DUP2
000059db: MSTORE
000059dc: PUSH1 0x20
000059de: ADD
000059df: SWAP1
000059e0: JUMP
000059e1: INVALID
000059e2: GASLIMIT
000059e3: MSTORE
000059e4: NUMBER
000059e5: ORIGIN
000059e6: ADDRESS
000059e7: GASPRICE
000059e8: KECCAK256
000059e9: PUSH21 0x72616e7366657220746f20746865207a65726f2061
000059ff: PUSH5 0x6472657373
00005a05: GASLIMIT
00005a06: MSTORE
00005a07: NUMBER
00005a08: ORIGIN
00005a09: ADDRESS
00005a0a: GASPRICE
00005a0b: KECCAK256
00005a0c: PUSH3 0x75726e
00005a10: KECCAK256
00005a11: PUSH2 0x6d6f
00005a14: PUSH22 0x6e7420657863656564732062616c616e636545524332
00005a2b: ADDRESS
00005a2c: GASPRICE
00005a2d: KECCAK256
00005a2e: PUSH2 0x7070
00005a31: PUSH19 0x6f766520746f20746865207a65726f20616464
00005a45: PUSH19 0x65737345524332303a207472616e7366657220
00005a59: PUSH2 0x6d6f
00005a5c: PUSH22 0x6e7420657863656564732062616c616e636541646472
00005a73: PUSH6 0x73733a20756e
00005a7a: PUSH2 0x626c
00005a7d: PUSH6 0x20746f207365
00005a84: PUSH15 0x642076616c75652c20726563697069
00005a94: PUSH6 0x6e74206d6179
00005a9b: KECCAK256
00005a9c: PUSH9 0x617665207265766572
00005aa6: PUSH21 0x656445434453413a20696e76616c6964207369676e
00005abc: PUSH2 0x7475
00005abf: PUSH19 0x65202773272076616c7565416464726573733a
00005ad3: KECCAK256
00005ad4: PUSH10 0x6e73756666696369656e
00005adf: PUSH21 0x2062616c616e636520666f722063616c6c45434453
00005af5: COINBASE
00005af6: GASPRICE
00005af7: KECCAK256
00005af8: PUSH10 0x6e76616c696420736967
00005b03: PUSH15 0x6174757265202776272076616c7565
00005b13: GASLIMIT
00005b14: MSTORE
00005b15: NUMBER
00005b16: ORIGIN
00005b17: ADDRESS
00005b18: GASPRICE
00005b19: KECCAK256
00005b1a: PUSH21 0x72616e7366657220616d6f756e7420657863656564
00005b30: PUSH20 0x20616c6c6f77616e636545524332303a20627572
00005b45: PUSH15 0x2066726f6d20746865207a65726f20
00005b55: PUSH2 0x6464
00005b58: PUSH19 0x6573734f6e6c7920676f7665726e616e636520
00005b6c: PUSH16 0x7220656d657267656e63792063616e20
00005b7d: PUSH4 0x616c6c20
00005b82: PUSH21 0x68697345524332303a207472616e73666572206672
00005b98: PUSH16 0x6d20746865207a65726f206164647265
00005ba9: PUSH20 0x7345524332303a20617070726f76652066726f6d
00005bbe: KECCAK256
00005bbf: PUSH21 0x6865207a65726f2061646472657373536166654552
00005bd5: NUMBER
00005bd6: ORIGIN
00005bd7: ADDRESS
00005bd8: GASPRICE
00005bd9: KECCAK256
00005bda: GASLIMIT
00005bdb: MSTORE
00005bdc: NUMBER
00005bdd: ORIGIN
00005bde: ADDRESS
00005bdf: KECCAK256
00005be0: PUSH16 0x7065726174696f6e20646964206e6f74
00005bf1: KECCAK256
00005bf2: PUSH20 0x7563636565645361666545524332303a20617070
00005c07: PUSH19 0x6f76652066726f6d206e6f6e2d7a65726f2074
00005c1b: PUSH16 0x206e6f6e2d7a65726f20616c6c6f7761
00005c2c: PUSH15 0x636545524332303a20646563726561
00005c3c: PUSH20 0x656420616c6c6f77616e63652062656c6f77207a
00005c51: PUSH6 0x726fa2646970
00005c58: PUSH7 0x73582212202700
00005c60: UNKNOWN(0xC7)
00005c61: UNKNOWN(0xEB)
00005c62: UNKNOWN(0xAB)
00005c63: DELEGATECALL
00005c64: UNKNOWN(0x22)
00005c65: SWAP6
00005c66: SHR
00005c67: UNKNOWN(0xE4)
00005c68: UNKNOWN(0xE3)
00005c69: SAR
00005c6a: MLOAD
00005c6b: SWAP6
00005c6c: DUP10
00005c6d: UNKNOWN(0xD9)
00005c6e: UNKNOWN(0xB9)
00005c6f: UNKNOWN(0xEA)
00005c70: PUSH24 0x36e4ddefbcb3ac3fcee969aec964736f6c63430007060033

Findings

validated = confirmed for call sinks; sink observed for others
Severity Category Tool Title Confidence Validated Confirmed Details
high auth detector Authorization based on tx.origin 70 no
view
validation_json
{
    "reason": "missing sink mapping",
    "status": "no_sink"
}
witness_json
{
    "notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
    "constraints": [],
    "entrypoints": [
        {
            "calldata": "0xdd62ed3e",
            "selector": "0xdd62ed3e",
            "calldata_variants": [
                "0xdd62ed3e",
                "0xdd62ed3e0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf251fc8c",
            "selector": "0xf251fc8c",
            "calldata_variants": [
                "0xf251fc8c",
                "0xf251fc8c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf77c4791",
            "selector": "0xf77c4791",
            "calldata_variants": [
                "0xf77c4791",
                "0xf77c47910000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf85cb5c8",
            "selector": "0xf85cb5c8",
            "calldata_variants": [
                "0xf85cb5c8",
                "0xf85cb5c80000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xcb12233b",
            "selector": "0xcb12233b",
            "calldata_variants": [
                "0xcb12233b",
                "0xcb12233b0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xd360386c",
            "selector": "0xd360386c",
            "calldata_variants": [
                "0xd360386c",
                "0xd360386c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xd6888eab",
            "selector": "0xd6888eab",
            "calldata_variants": [
                "0xd6888eab",
                "0xd6888eab0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xdaeffcca",
            "selector": "0xdaeffcca",
            "calldata_variants": [
                "0xdaeffcca",
                "0xdaeffcca0000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "guards_detected": [
        {
            "pc": 23013,
            "type": "tx_origin_used"
        },
        {
            "pc": 23048,
            "type": "tx_origin_used"
        },
        {
            "pc": 23318,
            "type": "tx_origin_used"
        },
        {
            "pc": 23510,
            "type": "tx_origin_used"
        },
        {
            "pc": 23517,
            "type": "tx_origin_used"
        }
    ]
}
high auth codex `claimAndStakeRewardsBySig` signatures are replayable across different gardens 85 no
view
evidence_json
{
    "evidence": "The signed type for staking rewards does not include a source garden field, and `claimAndStakeRewardsBySig` hashes `address(heartGarden)` instead of `address(this)`. Verification then checks only the contributor nonce of whichever garden executes the call, so the same signature is valid in any garden where that nonce matches.",
    "locations": [
        "contracts/gardens/Garden.sol:107",
        "contracts/gardens/Garden.sol:576",
        "contracts/gardens/Garden.sol:590",
        "contracts/gardens/Garden.sol:605"
    ],
    "recommendation": "Bind the source garden into the signed payload and verification path. `claimAndStakeRewardsBySig` should hash `address(this)` (and ideally `chainid`) in addition to the Heart-garden context, or use separate signatures for source-garden reward claims and Heart staking.",
    "exploit_scenario": "A contributor who is in multiple gardens signs a stake-and-claim message for Garden A. A malicious keeper instead submits that same signature to Garden B where the contributor's garden nonce matches. Garden B accepts it because the signed hash is bound to `heartGarden` rather than `address(this)`, then `_sendRewardsInternal` pays out Garden B's reserve-asset rewards and BABL allocation. The attacker can choose whichever matching garden has the largest rewards set aside, draining funds from an unintended garden with a signature that was never scoped to it."
}
high oracle codex Keeper-controlled pricePerShare can be stair-stepped away from real NAV and used to overmint/overwithdraw 85 no
view
evidence_json
{
    "evidence": "`depositBySig`, `withdrawBySig`, and `stakeBySig` all accept an external `_pricePerShare`. `_checkLastPricePerShare` only bounds the new price against `lastPricePerShare` plus a decay-based slippage window, then overwrites the stored reference unconditionally; it never compares against the garden's actual current valuation.",
    "locations": [
        "contracts/gardens/Garden.sol:315",
        "contracts/gardens/Garden.sol:427",
        "contracts/gardens/Garden.sol:655",
        "contracts/gardens/Garden.sol:1232"
    ],
    "recommendation": "Do not trust keeper-supplied share prices. Recompute price per share on-chain for by-signature flows, or at minimum validate the supplied value against the current on-chain valuation within a tight per-transaction tolerance. Do not let historical user-supplied prices become the sole anchor for future pricing.",
    "exploit_scenario": "A malicious keeper collaborates with an attacker contributor and submits a series of tiny `depositBySig` calls that each move `_pricePerShare` by the allowed 25% band. Because the contract only compares the new value to the last recorded value, the keeper can walk `lastPricePerShare` far below real NAV. The attacker then makes a large by-signature deposit at the fake low price, receives far too many garden shares, and later exits against the garden's real valuation, diluting and stealing reserve assets from existing contributors. The same weak check also affects by-signature withdrawals and Heart staking."
}
high upgradeability detector Untrusted DELEGATECALL target reachable 55 no no
view
trace_id: 0xa0b1a964dc8797e60ce6bcfb7bf8a8a8b69b1a5506a0d60c6990e9fde83eb866
validation_json
{
    "sink": "DELEGATECALL",
    "errors": 0,
    "status": "unknown",
    "attempts": 192,
    "trace_id": "0xa0b1a964dc8797e60ce6bcfb7bf8a8a8b69b1a5506a0d60c6990e9fde83eb866",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": null,
    "matched_probe": null,
    "target_varies": null,
    "classification": "no_sink"
}
witness_json
{
    "notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
    "constraints": [],
    "entrypoints": [
        {
            "calldata": "0xdd62ed3e",
            "selector": "0xdd62ed3e",
            "calldata_variants": [
                "0xdd62ed3e",
                "0xdd62ed3e0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf251fc8c",
            "selector": "0xf251fc8c",
            "calldata_variants": [
                "0xf251fc8c",
                "0xf251fc8c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf77c4791",
            "selector": "0xf77c4791",
            "calldata_variants": [
                "0xf77c4791",
                "0xf77c47910000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf85cb5c8",
            "selector": "0xf85cb5c8",
            "calldata_variants": [
                "0xf85cb5c8",
                "0xf85cb5c80000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xcb12233b",
            "selector": "0xcb12233b",
            "calldata_variants": [
                "0xcb12233b",
                "0xcb12233b0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xd360386c",
            "selector": "0xd360386c",
            "calldata_variants": [
                "0xd360386c",
                "0xd360386c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xd6888eab",
            "selector": "0xd6888eab",
            "calldata_variants": [
                "0xd6888eab",
                "0xd6888eab0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xdaeffcca",
            "selector": "0xdaeffcca",
            "calldata_variants": [
                "0xdaeffcca",
                "0xdaeffcca0000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 12868,
            "opcode": "DELEGATECALL",
            "returndata_checked": null,
            "value_expression_category": "n/a",
            "target_expression_category": "computed"
        }
    ],
    "guards_detected": [
        {
            "pc": 23013,
            "type": "tx_origin_used"
        },
        {
            "pc": 23048,
            "type": "tx_origin_used"
        },
        {
            "pc": 23318,
            "type": "tx_origin_used"
        },
        {
            "pc": 23510,
            "type": "tx_origin_used"
        },
        {
            "pc": 23517,
            "type": "tx_origin_used"
        }
    ],
    "delegatecall_count": 2,
    "untrusted_delegatecall_count": 1
}
medium access_control codex First `setTimeLockRegistry` call is permissionless, enabling vesting-registry takeover 75 no
view
evidence_json
{
    "evidence": "`onlyTimeLockOwner` performs no authorization when `timeLockRegistry` is still zero. `setTimeLockRegistry` uses that modifier directly, so the initial registry assignment is unrestricted.",
    "locations": [
        "contracts/token/TimeLockedToken.sol:69",
        "contracts/token/TimeLockedToken.sol:155",
        "contracts/token/TimeLockedToken.sol:161"
    ],
    "recommendation": "Make the registry immutable at deployment, or gate the first assignment with `onlyOwner`/a one-time initializer. Do not allow the zero-state registry check to bypass access control.",
    "exploit_scenario": "After deployment, if `timeLockRegistry` has not already been initialized in a constructor/initializer, any external account can call `setTimeLockRegistry` first and point it to an attacker-controlled contract. That attacker then becomes the permanent registry authority because future rotations are gated by `Ownable(timeLockRegistry).owner()`. With control of the registry, the attacker can disrupt claims and claw back still-locked team/advisor balances through the token's `onlyTimeLockRegistry` paths."
}
medium other detector Untrusted CALL target/value reachable 45 no no
view
trace_id: 0x30a94614436ce6b18dbce4ef6ef9fc11ac96ed81390e3eaa29858585073d29d5
call_targets: 0x04393e5c6701237d7ee836d644f8dbdd122afebc
target_varies: no
classification: constant_target
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0x30a94614436ce6b18dbce4ef6ef9fc11ac96ed81390e3eaa29858585073d29d5",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0x04393e5c6701237d7ee836d644f8dbdd122afebc"
    ],
    "matched_probe": null,
    "target_varies": false,
    "classification": "constant_target"
}
witness_json
{
    "notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
    "constraints": [],
    "entrypoints": [
        {
            "calldata": "0xdd62ed3e",
            "selector": "0xdd62ed3e",
            "calldata_variants": [
                "0xdd62ed3e",
                "0xdd62ed3e0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf251fc8c",
            "selector": "0xf251fc8c",
            "calldata_variants": [
                "0xf251fc8c",
                "0xf251fc8c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf77c4791",
            "selector": "0xf77c4791",
            "calldata_variants": [
                "0xf77c4791",
                "0xf77c47910000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf85cb5c8",
            "selector": "0xf85cb5c8",
            "calldata_variants": [
                "0xf85cb5c8",
                "0xf85cb5c80000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xcb12233b",
            "selector": "0xcb12233b",
            "calldata_variants": [
                "0xcb12233b",
                "0xcb12233b0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xd360386c",
            "selector": "0xd360386c",
            "calldata_variants": [
                "0xd360386c",
                "0xd360386c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xd6888eab",
            "selector": "0xd6888eab",
            "calldata_variants": [
                "0xd6888eab",
                "0xd6888eab0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xdaeffcca",
            "selector": "0xdaeffcca",
            "calldata_variants": [
                "0xdaeffcca",
                "0xdaeffcca0000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 7621,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 8160,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 10488,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "call_count": 12,
    "guards_detected": [
        {
            "pc": 23013,
            "type": "tx_origin_used"
        },
        {
            "pc": 23048,
            "type": "tx_origin_used"
        },
        {
            "pc": 23318,
            "type": "tx_origin_used"
        },
        {
            "pc": 23510,
            "type": "tx_origin_used"
        },
        {
            "pc": 23517,
            "type": "tx_origin_used"
        }
    ],
    "untrusted_call_count": 12
}
medium other detector ETH value transfer possible 40 no no
view
trace_id: 0x30a94614436ce6b18dbce4ef6ef9fc11ac96ed81390e3eaa29858585073d29d5
call_targets: 0x04393e5c6701237d7ee836d644f8dbdd122afebc
target_varies: no
classification: constant_target
validation_json
{
    "sink": "CALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0x30a94614436ce6b18dbce4ef6ef9fc11ac96ed81390e3eaa29858585073d29d5",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0x04393e5c6701237d7ee836d644f8dbdd122afebc"
    ],
    "matched_probe": null,
    "target_varies": false,
    "classification": "constant_target"
}
witness_json
{
    "notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
    "constraints": [],
    "entrypoints": [
        {
            "calldata": "0xdd62ed3e",
            "selector": "0xdd62ed3e",
            "calldata_variants": [
                "0xdd62ed3e",
                "0xdd62ed3e0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf251fc8c",
            "selector": "0xf251fc8c",
            "calldata_variants": [
                "0xf251fc8c",
                "0xf251fc8c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf77c4791",
            "selector": "0xf77c4791",
            "calldata_variants": [
                "0xf77c4791",
                "0xf77c47910000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xf85cb5c8",
            "selector": "0xf85cb5c8",
            "calldata_variants": [
                "0xf85cb5c8",
                "0xf85cb5c80000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xcb12233b",
            "selector": "0xcb12233b",
            "calldata_variants": [
                "0xcb12233b",
                "0xcb12233b0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xd360386c",
            "selector": "0xd360386c",
            "calldata_variants": [
                "0xd360386c",
                "0xd360386c0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xd6888eab",
            "selector": "0xd6888eab",
            "calldata_variants": [
                "0xd6888eab",
                "0xd6888eab0000000000000000000000000000000000000000000000000000000000000000"
            ]
        },
        {
            "calldata": "0xdaeffcca",
            "selector": "0xdaeffcca",
            "calldata_variants": [
                "0xdaeffcca",
                "0xdaeffcca0000000000000000000000000000000000000000000000000000000000000000"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 7621,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 8160,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        },
        {
            "pc": 10488,
            "opcode": "CALL",
            "returndata_checked": null,
            "value_expression_category": "computed",
            "target_expression_category": "computed"
        }
    ],
    "eth_value_calls": 12,
    "guards_detected": [
        {
            "pc": 23013,
            "type": "tx_origin_used"
        },
        {
            "pc": 23048,
            "type": "tx_origin_used"
        },
        {
            "pc": 23318,
            "type": "tx_origin_used"
        },
        {
            "pc": 23510,
            "type": "tx_origin_used"
        },
        {
            "pc": 23517,
            "type": "tx_origin_used"
        }
    ]
}
medium upgradeability cast DELEGATECALL present 80 no
view
evidence_json
{
    "notes": "delegatecall enables execution in caller context; common in proxies/upgradeable patterns",
    "delegatecall_count": 2
}
info other cast Heavy EXTCODE*/BALANCE usage 55 no
view
evidence_json
{
    "notes": "frequent external code or balance checks; may indicate introspection or validation logic",
    "ext_balance_count": 46
}
info other cast Heavy CALL-family usage 55 no
view
evidence_json
{
    "notes": "large number of CALL/CALLCODE/STATICCALL opcodes; review external call patterns",
    "call_family_count": 45
}