MON Price: $0.020672 (-2.83%)

Contract

0x97b4a6b501C55cCC7A597E259266E7E28A2d0BE0

Overview

MON Balance

Monad Chain LogoMonad Chain LogoMonad Chain Logo0 MON

MON Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim426989762025-12-17 20:35:2042 days ago1766003720IN
0x97b4a6b5...28A2d0BE0
0 MON0.02570718122.4
Claim426936492025-12-17 19:59:4742 days ago1766001587IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426935292025-12-17 19:58:5942 days ago1766001539IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426899352025-12-17 19:35:0042 days ago1766000100IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426877542025-12-17 19:20:2642 days ago1765999226IN
0x97b4a6b5...28A2d0BE0
0 MON0.02322666110.58
Claim426872372025-12-17 19:16:5842 days ago1765999018IN
0x97b4a6b5...28A2d0BE0
0 MON0.02184457104
Claim426871882025-12-17 19:16:3942 days ago1765998999IN
0x97b4a6b5...28A2d0BE0
0 MON0.02790785199.30053369
Claim426862782025-12-17 19:10:3342 days ago1765998633IN
0x97b4a6b5...28A2d0BE0
0 MON0.0140029100
Claim426861822025-12-17 19:09:5542 days ago1765998595IN
0x97b4a6b5...28A2d0BE0
0 MON0.01785369127.5
Claim426860422025-12-17 19:08:5942 days ago1765998539IN
0x97b4a6b5...28A2d0BE0
0 MON0.02334197148.5
Claim426855322025-12-17 19:05:3542 days ago1765998335IN
0x97b4a6b5...28A2d0BE0
0 MON0.01421294101.5
Claim426850912025-12-17 19:02:3842 days ago1765998158IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426850462025-12-17 19:02:2042 days ago1765998140IN
0x97b4a6b5...28A2d0BE0
0 MON0.0140029100
Claim426850222025-12-17 19:02:1142 days ago1765998131IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426850082025-12-17 19:02:0542 days ago1765998125IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426849792025-12-17 19:01:5342 days ago1765998113IN
0x97b4a6b5...28A2d0BE0
0 MON0.01765483102.10004247
Claim426849672025-12-17 19:01:4942 days ago1765998109IN
0x97b4a6b5...28A2d0BE0
0 MON0.01572667102.10004247
Claim426849662025-12-17 19:01:4842 days ago1765998108IN
0x97b4a6b5...28A2d0BE0
0 MON0.01427591101.9497
Claim426849462025-12-17 19:01:4042 days ago1765998100IN
0x97b4a6b5...28A2d0BE0
0 MON0.6301323,000
Claim426849412025-12-17 19:01:3842 days ago1765998098IN
0x97b4a6b5...28A2d0BE0
0 MON0.02184457104
Resolve426849102025-12-17 19:01:2642 days ago1765998086IN
0x97b4a6b5...28A2d0BE0
0 MON0.02039232104
Sell Yes Via Poo...426846782025-12-17 18:59:5342 days ago1765997993IN
0x97b4a6b5...28A2d0BE0
0 MON0.103103
Sell Yes Via Poo...426846382025-12-17 18:59:3742 days ago1765997977IN
0x97b4a6b5...28A2d0BE0
0 MON0.05565238104.55
Buy Yes Via Pool426845842025-12-17 18:59:1542 days ago1765997955IN
0x97b4a6b5...28A2d0BE0
0 MON0.04070758102
Buy No Via Pool426845582025-12-17 18:59:0542 days ago1765997945IN
0x97b4a6b5...28A2d0BE0
0 MON0.03521027101.94
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
426989762025-12-17 20:35:2042 days ago1766003720
0x97b4a6b5...28A2d0BE0
0 MON
426936492025-12-17 19:59:4742 days ago1766001587
0x97b4a6b5...28A2d0BE0
0 MON
426935292025-12-17 19:58:5942 days ago1766001539
0x97b4a6b5...28A2d0BE0
0 MON
426899352025-12-17 19:35:0042 days ago1766000100
0x97b4a6b5...28A2d0BE0
0 MON
426877542025-12-17 19:20:2642 days ago1765999226
0x97b4a6b5...28A2d0BE0
0 MON
426872372025-12-17 19:16:5842 days ago1765999018
0x97b4a6b5...28A2d0BE0
0 MON
426871882025-12-17 19:16:3942 days ago1765998999
0x97b4a6b5...28A2d0BE0
0 MON
426862782025-12-17 19:10:3342 days ago1765998633
0x97b4a6b5...28A2d0BE0
0 MON
426861822025-12-17 19:09:5542 days ago1765998595
0x97b4a6b5...28A2d0BE0
0 MON
426860422025-12-17 19:08:5942 days ago1765998539
0x97b4a6b5...28A2d0BE0
0 MON
426855322025-12-17 19:05:3542 days ago1765998335
0x97b4a6b5...28A2d0BE0
0 MON
426850912025-12-17 19:02:3842 days ago1765998158
0x97b4a6b5...28A2d0BE0
0 MON
426850462025-12-17 19:02:2042 days ago1765998140
0x97b4a6b5...28A2d0BE0
0 MON
426850222025-12-17 19:02:1142 days ago1765998131
0x97b4a6b5...28A2d0BE0
0 MON
426850082025-12-17 19:02:0542 days ago1765998125
0x97b4a6b5...28A2d0BE0
0 MON
426849792025-12-17 19:01:5342 days ago1765998113
0x97b4a6b5...28A2d0BE0
0 MON
426849672025-12-17 19:01:4942 days ago1765998109
0x97b4a6b5...28A2d0BE0
0 MON
426849662025-12-17 19:01:4842 days ago1765998108
0x97b4a6b5...28A2d0BE0
0 MON
426849462025-12-17 19:01:4042 days ago1765998100
0x97b4a6b5...28A2d0BE0
0 MON
426849412025-12-17 19:01:3842 days ago1765998098
0x97b4a6b5...28A2d0BE0
0 MON
426846782025-12-17 18:59:5342 days ago1765997993
0x97b4a6b5...28A2d0BE0
0 MON
426846382025-12-17 18:59:3742 days ago1765997977
0x97b4a6b5...28A2d0BE0
0 MON
426846382025-12-17 18:59:3742 days ago1765997977
0x97b4a6b5...28A2d0BE0
0 MON
426846382025-12-17 18:59:3742 days ago1765997977
0x97b4a6b5...28A2d0BE0
0 MON
426846382025-12-17 18:59:3742 days ago1765997977
0x97b4a6b5...28A2d0BE0
0 MON
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x02D41ACb...3d9032F4E
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
PAMM

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion, None license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 1 : PAMM.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

abstract contract ERC6909Minimal {
    event OperatorSet(address indexed owner, address indexed operator, bool approved);
    event Approval(
        address indexed owner, address indexed spender, uint256 indexed id, uint256 amount
    );
    event Transfer(
        address caller, address indexed from, address indexed to, uint256 indexed id, uint256 amount
    );

    mapping(address => mapping(address => bool)) public isOperator;
    mapping(address => mapping(uint256 => uint256)) public balanceOf;
    mapping(address => mapping(address => mapping(uint256 => uint256))) public allowance;

    function transfer(address receiver, uint256 id, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender][id] -= amount;
        balanceOf[receiver][id] += amount;
        emit Transfer(msg.sender, msg.sender, receiver, id, amount);
        return true;
    }

    function approve(address spender, uint256 id, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender][id] = amount;
        emit Approval(msg.sender, spender, id, amount);
        return true;
    }

    function setOperator(address operator, bool approved) public virtual returns (bool) {
        isOperator[msg.sender][operator] = approved;
        emit OperatorSet(msg.sender, operator, approved);
        return true;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == 0x01ffc9a7 || interfaceId == 0x0f632fb3;
    }

    function _mint(address receiver, uint256 id, uint256 amount) internal virtual {
        balanceOf[receiver][id] += amount;
        emit Transfer(msg.sender, address(0), receiver, id, amount);
    }

    function _burn(address sender, uint256 id, uint256 amount) internal virtual {
        balanceOf[sender][id] -= amount;
        emit Transfer(msg.sender, sender, address(0), id, amount);
    }
}

interface IZAMM {
    struct PoolKey {
        uint256 id0;
        uint256 id1;
        address token0;
        address token1;
        uint256 feeOrHook;
    }

    function pools(uint256 poolId)
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast,
            uint256 price0CumulativeLast,
            uint256 price1CumulativeLast,
            uint256 kLast,
            uint256 supply
        );

    function addLiquidity(
        PoolKey calldata poolKey,
        uint256 amount0Desired,
        uint256 amount1Desired,
        uint256 amount0Min,
        uint256 amount1Min,
        address to,
        uint256 deadline
    ) external payable returns (uint256 amount0, uint256 amount1, uint256 liquidity);

    function swapExactOut(
        PoolKey calldata poolKey,
        uint256 amountOut,
        uint256 amountInMax,
        bool zeroForOne,
        address to,
        uint256 deadline
    ) external payable returns (uint256 amountIn);

    function deposit(address token, uint256 id, uint256 amount) external payable;
    function recoverTransientBalance(address token, uint256 id, address to)
        external
        returns (uint256 amount);
}

interface IERC20 {
    function transfer(address to, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
}

/*────────────────────────────────────────────────────────
| PredictionAMM (PAMM) — CPMM-backed YES/NO markets
|  • Pool fee = 10 bps (paid to ZAMM with fee switch on)
|  • Pot in HST; PM+ZAMM excluded from payout denominator
|  • Path-fair EV charging via Simpson's rule (fee-aware)
|  • Modified for Monad Testnet with HST collateral
|────────────────────────────────────────────────────────*/
contract PAMM is ERC6909Minimal {
    /*──────── errors ───────*/
    error MarketExists();
    error MarketNotFound();
    error MarketClosed();
    error MarketNotClosed();
    error MarketResolved();
    error MarketNotResolved();
    error OnlyResolver();
    error InvalidResolver();
    error AlreadyResolved();
    error NoWinningShares();
    error AmountZero();
    error InvalidClose();
    error FeeOverflow();
    error PoolNotSeeded();
    error InsufficientLiquidity();
    error SlippageOppIn();
    error InsufficientStt();
    error NoCirculating();
    error NotClosable();
    error SeedBothSides();
    error InvalidReceiver();

    /*──────── storage ──────*/
    struct Market {
        address resolver;
        bool resolved;
        bool outcome; // true=YES wins, false=NO wins
        bool canClose; // resolver can early-close
        uint72 close; // trading close timestamp
        uint256 pot; // HST collateral pool
        uint256 payoutPerShare; // Q-scaled
    }

    uint256 constant Q = 1e18;
    uint256 constant FEE_BPS = 10; // 0.1% pool fee

    // ZAMM singleton - configurable for different networks
    IZAMM public immutable ZAMM;

    // HST collateral token
    IERC20 public immutable HST_TOKEN;

    /*──────── pm-AMM tuning (set once at create) ───────*/
    struct PMTuning {
        uint32 lateRampStart; // seconds before close to start ramp (0 = off)
        uint16 lateRampMaxBps; // +bps at T (applied to EV charge; inverse to refunds)
        uint16 extremeMaxBps; // +bps at extremes p≈0/1 (linear in |p-0.5|)
    }

    mapping(uint256 => PMTuning) public pmTuning;
    mapping(uint256 => bool) public pmTuningFinal;

    error TuningBadCaps();

    event PMTuningSet(uint256 indexed marketId, PMTuning t, bool finalized);

    uint256[] public allMarkets;
    mapping(uint256 id => Market) public markets;
    mapping(uint256 id => uint256) public totalSupply;
    mapping(uint256 id => string) public descriptions;
    mapping(address resolver => uint16) public resolverFeeBps;

    /*──────── events ───────*/
    event Created(
        uint256 indexed marketId, uint256 indexed noId, string description, address resolver
    );
    event Seeded(uint256 indexed marketId, uint256 yesSeed, uint256 noSeed, uint256 liquidity);
    event Bought(address indexed buyer, uint256 indexed id, uint256 sharesOut, uint256 sttIn);
    event Sold(address indexed seller, uint256 indexed id, uint256 sharesIn, uint256 sttOut);

    event Resolved(uint256 indexed marketId, bool outcome);
    event Claimed(address indexed claimer, uint256 indexed id, uint256 shares, uint256 payout);
    event Closed(uint256 indexed marketId, uint256 ts, address indexed by);
    event ResolverFeeSet(address indexed resolver, uint16 bps);

    constructor(address _zamm, address _stt) payable {
        ZAMM = IZAMM(_zamm);
        HST_TOKEN = IERC20(_stt);
    }

    /*──────── id helpers ───*/
    function getMarketId(string calldata description, address resolver)
        public
        pure
        returns (uint256)
    {
        return uint256(keccak256(abi.encodePacked("PMARKET:YES", description, resolver)));
    }

    function getNoId(uint256 marketId) public pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked("PMARKET:NO", marketId)));
    }

    function _poolKey(uint256 yesId, uint256 noId) internal view returns (IZAMM.PoolKey memory k) {
        (uint256 id0, uint256 id1) = (yesId < noId) ? (yesId, noId) : (noId, yesId);
        k = IZAMM.PoolKey({
            id0: id0,
            id1: id1,
            token0: address(this),
            token1: address(this),
            feeOrHook: FEE_BPS
        });
    }

    function _poolId(IZAMM.PoolKey memory k) internal pure returns (uint256 id) {
        id = uint256(keccak256(abi.encode(k.id0, k.id1, k.token0, k.token1, k.feeOrHook)));
    }

    function name(uint256 id) public pure returns (string memory) {
        return string(abi.encodePacked("PAMM-", _toString(id)));
    }

    function symbol(uint256) public pure returns (string memory) {
        return "PAMM";
    }

    /*──────── lifecycle ───*/
    function createMarket(
        string calldata description,
        address resolver,
        uint72 close,
        bool canClose,
        uint256 seedYes,
        uint256 seedNo
    ) public returns (uint256 marketId, uint256 noId) {
        require(close > block.timestamp, InvalidClose());
        require(resolver != address(0), InvalidResolver());

        marketId = getMarketId(description, resolver);
        noId = getNoId(marketId);
        require(markets[marketId].resolver == address(0), MarketExists());

        markets[marketId] = Market({
            resolver: resolver,
            resolved: false,
            outcome: false,
            canClose: canClose,
            close: close,
            pot: 0,
            payoutPerShare: 0
        });

        allMarkets.push(marketId);
        descriptions[marketId] = description;

        emit Created(marketId, noId, description, resolver);

        if (seedYes != 0 || seedNo != 0) {
            require(seedYes != 0 && seedNo != 0, SeedBothSides());
            _seedYesNoPool(marketId, seedYes, seedNo);
        }
    }

    function createMarketWithPMTuning(
        string calldata description,
        address resolver,
        uint72 close,
        bool canClose,
        uint256 seedYes,
        uint256 seedNo,
        PMTuning calldata t
    ) public returns (uint256 marketId, uint256 noId) {
        (marketId, noId) = createMarket(description, resolver, close, canClose, seedYes, seedNo);

        // hard caps to avoid crazy tuning
        if (t.lateRampMaxBps > 2_000 || t.extremeMaxBps > 2_000) revert TuningBadCaps();
        require(t.lateRampStart == 0 || t.lateRampStart <= close, TuningBadCaps());

        pmTuning[marketId] = t;
        pmTuningFinal[marketId] = true; // immutable—no updates allowed / placeholder for future tweaks
        emit PMTuningSet(marketId, t, true);
    }

    function _seedYesNoPool(uint256 marketId, uint256 seedYes, uint256 seedNo) internal {
        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        IZAMM.PoolKey memory key = _poolKey(yesId, noId);

        // Mint seeds to PM (non-circulating; will be held by ZAMM as LP position):
        _mint(address(this), yesId, seedYes);
        totalSupply[yesId] += seedYes;
        _mint(address(this), noId, seedNo);
        totalSupply[noId] += seedNo;

        (uint256 a0, uint256 a1) = (key.id0 == yesId) ? (seedYes, seedNo) : (seedNo, seedYes);
        ZAMM.deposit(address(this), key.id0, a0);
        ZAMM.deposit(address(this), key.id1, a1);

        (uint256 used0, uint256 used1, uint256 liq) =
            ZAMM.addLiquidity(key, a0, a1, 0, 0, address(this), block.timestamp);

        if (used0 < a0) {
            uint256 ret = ZAMM.recoverTransientBalance(address(this), key.id0, address(this));
            _burn(address(this), key.id0, ret);
            totalSupply[key.id0] -= ret;
        }
        if (used1 < a1) {
            uint256 ret = ZAMM.recoverTransientBalance(address(this), key.id1, address(this));
            _burn(address(this), key.id1, ret);
            totalSupply[key.id1] -= ret;
        }

        (uint256 usedYes, uint256 usedNo) = (key.id0 == yesId) ? (used0, used1) : (used1, used0);
        emit Seeded(marketId, usedYes, usedNo, liq);
    }

    function closeMarket(uint256 marketId) public nonReentrant {
        Market storage m = markets[marketId];
        require(m.resolver != address(0), MarketNotFound());
        require(msg.sender == m.resolver, OnlyResolver());
        require(m.canClose, NotClosable());
        require(!m.resolved, MarketResolved());
        require(block.timestamp < m.close, MarketClosed());

        m.close = uint72(block.timestamp);
        emit Closed(marketId, block.timestamp, msg.sender);
    }

    /*──────── path-fair pricing helpers (fee-aware) ─────*/
    function _price1e18(uint256 num, uint256 den) internal pure returns (uint256) {
        return mulDiv(num, Q, den); // floor(num/den * 1e18)
    }

    // YES buy (NO -> YES)
    function _fairChargeYesWithFee(uint256 rYes, uint256 rNo, uint256 yesOut, uint256 feeBps)
        internal
        pure
        returns (uint256 charge)
    {
        uint256 p0 = _price1e18(rNo, rYes + rNo);

        // midpoint (simulate half the output):
        uint256 outHalf = yesOut / 2;
        uint256 inHalf = _getAmountIn(outHalf, rNo, rYes, feeBps);
        uint256 rYesMid = rYes - outHalf;
        uint256 rNoMid = rNo + inHalf;
        uint256 pMid = _price1e18(rNoMid, rYesMid + rNoMid);

        // end (simulate full output):
        uint256 inAll = _getAmountIn(yesOut, rNo, rYes, feeBps);
        uint256 rYesEnd = rYes - yesOut;
        uint256 rNoEnd = rNo + inAll;
        uint256 p1 = _price1e18(rNoEnd, rYesEnd + rNoEnd);

        // Simpson: Δq * (p0 + 4*pMid + p1) / 6:
        uint256 sum = p0 + (pMid << 2) + p1;
        charge = mulDivUp(yesOut, sum, 6 * Q);
    }

    // NO buy (YES -> NO)
    function _fairChargeNoWithFee(uint256 rYes, uint256 rNo, uint256 noOut, uint256 feeBps)
        internal
        pure
        returns (uint256 charge)
    {
        // p0 (EV of NO share = 1 - pYES = rYes/(rYes+rNo))
        uint256 p0 = _price1e18(rYes, rYes + rNo);

        // midpoint:
        uint256 outHalf = noOut / 2;
        uint256 inHalf = _getAmountIn(outHalf, rYes, rNo, feeBps);
        uint256 rNoMid = rNo - outHalf;
        uint256 rYesMid = rYes + inHalf;
        uint256 pMid = _price1e18(rYesMid, rYesMid + rNoMid);

        // end:
        uint256 inAll = _getAmountIn(noOut, rYes, rNo, feeBps);
        uint256 rNoEnd = rNo - noOut;
        uint256 rYesEnd = rYes + inAll;
        uint256 p1 = _price1e18(rYesEnd, rYesEnd + rNoEnd);

        uint256 sum = p0 + (pMid << 2) + p1;
        charge = mulDivUp(noOut, sum, 6 * Q);
    }

    // YES sell (YES -> NO)
    function _fairRefundYesWithFee(uint256 rYes, uint256 rNo, uint256 yesIn, uint256 feeBps)
        internal
        pure
        returns (uint256 refund)
    {
        // p0 = EV of YES share at start = rNo/(rYes+rNo)
        uint256 p0 = mulDiv(rNo, 1e18, rYes + rNo);

        // midpoint (simulate half the input along the SELL path):
        uint256 inHalf = yesIn / 2;
        uint256 outHalf = _getAmountOut(inHalf, rYes, rNo, feeBps);
        uint256 rYesMid = rYes + inHalf;
        uint256 rNoMid = rNo - outHalf;
        uint256 pMid = mulDiv(rNoMid, 1e18, rYesMid + rNoMid);

        // end:
        uint256 outAll = _getAmountOut(yesIn, rYes, rNo, feeBps);
        uint256 rYesEnd = rYes + yesIn;
        uint256 rNoEnd = rNo - outAll;
        uint256 p1 = mulDiv(rNoEnd, 1e18, rYesEnd + rNoEnd);

        // Simpson:
        uint256 sum = p0 + (pMid << 2) + p1;
        refund = mulDiv(yesIn, sum, 6 * 1e18);
    }

    // NO sell (NO -> YES)
    function _fairRefundNoWithFee(uint256 rYes, uint256 rNo, uint256 noIn, uint256 feeBps)
        internal
        pure
        returns (uint256 refund)
    {
        // p0(NO) = 1 - pYES = rYes/(rYes+rNo)
        uint256 p0 = mulDiv(rYes, 1e18, rYes + rNo);

        uint256 inHalf = noIn / 2;
        uint256 outHalf = _getAmountOut(inHalf, rNo, rYes, feeBps);
        uint256 rNoMid = rNo + inHalf;
        uint256 rYesMid = rYes - outHalf;
        uint256 pMid = mulDiv(rYesMid, 1e18, rYesMid + rNoMid);

        uint256 outAll = _getAmountOut(noIn, rNo, rYes, feeBps);
        uint256 rNoEnd = rNo + noIn;
        uint256 rYesEnd = rYes - outAll;
        uint256 p1 = mulDiv(rYesEnd, 1e18, rYesEnd + rNoEnd);

        uint256 sum = p0 + (pMid << 2) + p1;
        refund = mulDiv(noIn, sum, 6 * 1e18);
    }

    function _pmMultBps(uint256 marketId, uint256 rYes, uint256 rNo)
        internal
        view
        returns (uint256 bps)
    {
        PMTuning memory t = pmTuning[marketId];
        if ((t.lateRampStart | t.lateRampMaxBps | t.extremeMaxBps) == 0) return 0;

        // Time ramp (saturating start):
        if (t.lateRampStart != 0) {
            Market storage m = markets[marketId];
            uint256 start = (t.lateRampStart >= m.close) ? 0 : (m.close - t.lateRampStart);
            if (block.timestamp >= m.close) {
                bps += t.lateRampMaxBps;
            } else if (block.timestamp > start) {
                uint256 elapsed = block.timestamp - start;
                bps += (uint256(t.lateRampMaxBps) * elapsed) / t.lateRampStart;
            }
        }

        if (t.extremeMaxBps != 0) {
            uint256 den = rYes + rNo;
            if (den != 0) {
                uint256 p1e18 = mulDiv(rNo, 1e18, den);
                uint256 dist = p1e18 > 5e17 ? (p1e18 - 5e17) : (5e17 - p1e18);
                bps += mulDiv(uint256(t.extremeMaxBps), dist, 5e17);
            }
        }
    }

    /*──────── primary buys (path-fair EV; pot grows) ────*/
    function buyYesViaPool(
        uint256 marketId,
        uint256 yesOut,
        uint256 sttInMax,
        uint256 oppInMax,
        address to
    ) public nonReentrant returns (uint256 sttIn, uint256 oppIn) {
        Market storage m = markets[marketId];
        require(m.resolver != address(0), MarketNotFound());
        require(!m.resolved && block.timestamp < m.close, MarketClosed());
        require(yesOut != 0, AmountZero());

        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        IZAMM.PoolKey memory key = _poolKey(yesId, noId);

        (uint256 rYes, uint256 rNo) = _poolReserves(key, yesId);
        require(rYes > 0 && rNo > 0, PoolNotSeeded());
        require(yesOut < rYes, InsufficientLiquidity());

        bool zeroForOne = (key.id0 == noId); // NO -> YES if id0 is NO

        // ----- Pool quote (fee-aware, order-invariant): pay NO (rNo) to get YES (rYes)
        uint256 quotedIn = _getAmountIn(yesOut, /*reserveIn=*/ rNo, /*reserveOut=*/ rYes, FEE_BPS);

        // Caller's bound applies to the *raw* quote, not our internal padding:
        require(quotedIn <= oppInMax, SlippageOppIn());

        // Compute a safe internal mint (covers rounding), but never exceed caller's cap:
        uint256 paddedNeeded = mulDivUp(quotedIn, 10_000 + (FEE_BPS * 2 + 3), 10_000) + 5;
        if (paddedNeeded < quotedIn + 3) paddedNeeded = quotedIn + 3;
        uint256 mintIn = paddedNeeded > oppInMax ? oppInMax : paddedNeeded;

        // ----- Path-fair EV charge into pot (fee-aware Simpson):
        sttIn = _fairChargeYesWithFee(rYes, rNo, yesOut, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) sttIn = mulDivUp(sttIn, 10_000 + b, 10_000);
        }
        require(sttIn != 0, InsufficientStt());

        // Collect HST:
        require(sttInMax >= sttIn, InsufficientStt());
        HST_TOKEN.transferFrom(msg.sender, address(this), sttIn);
        m.pot += sttIn;

        // Swap via transient balance:
        _mint(address(this), noId, mintIn);
        totalSupply[noId] += mintIn;
        ZAMM.deposit(address(this), noId, mintIn);

        // Let AMM consume up to mintIn; capture the actual input used:
        uint256 actualIn = ZAMM.swapExactOut(key, yesOut, mintIn, zeroForOne, to, block.timestamp);

        // Sweep any unused NO and burn it immediately (keeps supply exact):
        uint256 ret = ZAMM.recoverTransientBalance(address(this), noId, address(this));
        if (ret != 0) {
            _burn(address(this), noId, ret);
            totalSupply[noId] -= ret;
        }

        // Report actual input used (matches quote under identical state):
        oppIn = actualIn;

        emit Bought(to, yesId, yesOut, sttIn);
    }

    function buyNoViaPool(
        uint256 marketId,
        uint256 noOut,
        uint256 sttInMax,
        uint256 oppInMax,
        address to
    ) public nonReentrant returns (uint256 sttIn, uint256 oppIn) {
        Market storage m = markets[marketId];
        require(m.resolver != address(0), MarketNotFound());
        require(!m.resolved && block.timestamp < m.close, MarketClosed());
        require(noOut != 0, AmountZero());

        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        IZAMM.PoolKey memory key = _poolKey(yesId, noId);

        (uint256 rYes, uint256 rNo) = _poolReserves(key, yesId);
        require(rYes > 0 && rNo > 0, PoolNotSeeded());
        require(noOut < rNo, InsufficientLiquidity());

        bool zeroForOne = (key.id0 == yesId); // YES -> NO if id0 is YES

        // ----- Pool quote (fee-aware, order-invariant): pay YES (rYes) to get NO (rNo):
        uint256 quotedIn = _getAmountIn(noOut, /*reserveIn=*/ rYes, /*reserveOut=*/ rNo, FEE_BPS);

        // Caller's bound applies to the *raw* quote, not our internal padding:
        require(quotedIn <= oppInMax, SlippageOppIn());

        // Compute a safe internal mint (covers rounding), but never exceed caller's cap:
        uint256 paddedNeeded = mulDivUp(quotedIn, 10_000 + (FEE_BPS * 2 + 3), 10_000) + 5;
        if (paddedNeeded < quotedIn + 3) paddedNeeded = quotedIn + 3;
        uint256 mintIn = paddedNeeded > oppInMax ? oppInMax : paddedNeeded;

        // ----- Path-fair EV charge into pot (fee-aware Simpson):
        sttIn = _fairChargeNoWithFee(rYes, rNo, noOut, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) sttIn = mulDivUp(sttIn, 10_000 + b, 10_000);
        }
        require(sttIn != 0, InsufficientStt());

        // Collect HST:
        require(sttInMax >= sttIn, InsufficientStt());
        HST_TOKEN.transferFrom(msg.sender, address(this), sttIn);
        m.pot += sttIn;

        _mint(address(this), yesId, mintIn);
        totalSupply[yesId] += mintIn;
        ZAMM.deposit(address(this), yesId, mintIn);

        // Let AMM consume up to mintIn; capture the actual input used:
        uint256 actualIn = ZAMM.swapExactOut(key, noOut, mintIn, zeroForOne, to, block.timestamp);

        // Sweep any unused YES and burn it immediately (keeps supply exact):
        uint256 ret = ZAMM.recoverTransientBalance(address(this), yesId, address(this));
        if (ret != 0) {
            _burn(address(this), yesId, ret);
            totalSupply[yesId] -= ret;
        }

        // Report actual input used (matches quote under identical state):
        oppIn = actualIn;

        emit Bought(to, noId, noOut, sttIn);
    }

    function sellYesViaPool(
        uint256 marketId,
        uint256 yesIn,
        uint256 sttOutMin,
        uint256 oppOutMin,
        address to
    ) public nonReentrant returns (uint256 sttOut, uint256 oppOut) {
        Market storage m = markets[marketId];
        require(m.resolver != address(0), MarketNotFound());
        require(!m.resolved && block.timestamp < m.close, MarketClosed());
        require(yesIn != 0, AmountZero());

        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        IZAMM.PoolKey memory key = _poolKey(yesId, noId);

        (uint256 rYes, uint256 rNo) = _poolReserves(key, yesId);
        require(rYes > 0 && rNo > 0, PoolNotSeeded());

        bool zeroForOne = (key.id0 == yesId); // YES -> NO if id0 is YES

        // 1) Deterministic pool out (exact-in):
        oppOut = _getAmountOut(yesIn, rYes, rNo, FEE_BPS);
        require(oppOut >= oppOutMin, InsufficientLiquidity());

        // 2) Path-fair EV refund, floored to pot:
        uint256 fair = _fairRefundYesWithFee(rYes, rNo, yesIn, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) fair = mulDiv(fair, 10_000, 10_000 + b);
        }

        uint256 potBal = m.pot;
        sttOut = fair > potBal ? potBal : fair;
        require(sttOut >= sttOutMin, InsufficientStt());

        // 3) Pay refund:
        m.pot = potBal - sttOut;
        HST_TOKEN.transfer(to, sttOut);

        // 4) Debit user's YES and fix totalSupply immediately:
        _burn(msg.sender, yesId, yesIn);
        totalSupply[yesId] -= yesIn;

        // 5) Transient-mint YES to PM, swap to NO out for PM, then sweep:
        _mint(address(this), yesId, yesIn);
        totalSupply[yesId] += yesIn;
        ZAMM.deposit(address(this), yesId, yesIn);
        ZAMM.swapExactOut(
            key,
            oppOut, // exact NO to PM
            yesIn, // cap YES spent
            zeroForOne, // YES -> NO
            address(this),
            block.timestamp
        );
        // Sweep any leftover YES (rounding/slack):
        uint256 retYes = ZAMM.recoverTransientBalance(address(this), yesId, address(this));
        if (retYes != 0) {
            _burn(address(this), yesId, retYes);
            totalSupply[yesId] -= retYes;
        }

        // 6) Burn the NO received from pool (reduce NO supply deterministically):
        _burn(address(this), noId, oppOut);
        totalSupply[noId] -= oppOut;

        emit Sold(msg.sender, yesId, yesIn, sttOut);
        return (sttOut, oppOut);
    }

    function sellNoViaPool(
        uint256 marketId,
        uint256 noIn,
        uint256 sttOutMin,
        uint256 oppOutMin,
        address to
    ) public nonReentrant returns (uint256 sttOut, uint256 oppOut) {
        Market storage m = markets[marketId];
        require(m.resolver != address(0), MarketNotFound());
        require(!m.resolved && block.timestamp < m.close, MarketClosed());
        require(noIn != 0, AmountZero());

        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        IZAMM.PoolKey memory key = _poolKey(yesId, noId);

        (uint256 rYes, uint256 rNo) = _poolReserves(key, yesId);
        require(rYes > 0 && rNo > 0, PoolNotSeeded());

        bool zeroForOne = (key.id0 == noId); // NO -> YES if id0 is NO

        // 1) Deterministic pool out (exact-in):
        oppOut = _getAmountOut(noIn, rNo, rYes, FEE_BPS);
        require(oppOut >= oppOutMin, InsufficientLiquidity());

        // 2) Path-fair EV refund, floored to pot:
        uint256 fair = _fairRefundNoWithFee(rYes, rNo, noIn, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) fair = mulDiv(fair, 10_000, 10_000 + b);
        }

        uint256 potBal = m.pot;
        sttOut = fair > potBal ? potBal : fair;
        require(sttOut >= sttOutMin, InsufficientStt());

        // 3) Pay refund:
        m.pot = potBal - sttOut;
        HST_TOKEN.transfer(to, sttOut);

        // 4) Debit user's NO and fix totalSupply immediately:
        _burn(msg.sender, noId, noIn);
        totalSupply[noId] -= noIn;

        // 5) Transient-mint NO to PM, swap to YES out for PM, then sweep:
        _mint(address(this), noId, noIn);
        totalSupply[noId] += noIn;
        ZAMM.deposit(address(this), noId, noIn);
        ZAMM.swapExactOut(
            key,
            oppOut, // exact YES to PM
            noIn, // cap NO spent
            zeroForOne, // NO -> YES
            address(this),
            block.timestamp
        );
        uint256 retNo = ZAMM.recoverTransientBalance(address(this), noId, address(this));
        if (retNo != 0) {
            _burn(address(this), noId, retNo);
            totalSupply[noId] -= retNo;
        }

        // 6) Burn the YES received from pool (reduce YES supply deterministically):
        _burn(address(this), yesId, oppOut);
        totalSupply[yesId] -= oppOut;

        emit Sold(msg.sender, noId, noIn, sttOut);
        return (sttOut, oppOut);
    }

    /*──────── resolution / claims ───────*/
    function setResolverFeeBps(uint16 bps) public {
        require(bps <= 1_000, FeeOverflow());
        resolverFeeBps[msg.sender] = bps;
        emit ResolverFeeSet(msg.sender, bps);
    }

    function resolve(uint256 marketId, bool outcome) public nonReentrant {
        Market storage m = markets[marketId];
        require(m.resolver != address(0), MarketNotFound());
        require(msg.sender == m.resolver, OnlyResolver());
        require(!m.resolved, AlreadyResolved());
        require(block.timestamp >= m.close, MarketNotClosed());

        // optional resolver fee:
        uint16 feeBps = resolverFeeBps[m.resolver];
        if (feeBps != 0) {
            uint256 fee = (m.pot * feeBps) / 10_000;
            if (fee != 0) {
                m.pot -= fee;
                HST_TOKEN.transfer(m.resolver, fee);
            }
        }

        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        uint256 yesCirc = _circulating(yesId);
        uint256 noCirc = _circulating(noId);

        // ── auto-flip semantics ──
        if (outcome) {
            // resolver chose YES
            if (yesCirc == 0 && noCirc > 0) outcome = false; // flip to NO
        } else {
            // resolver chose NO
            if (noCirc == 0 && yesCirc > 0) outcome = true; // flip to YES
        }

        // If both are zero, we still can't resolve (no winners exist):
        uint256 winningCirc = outcome ? yesCirc : noCirc;
        require(winningCirc != 0, NoCirculating());

        m.payoutPerShare = mulDiv(m.pot, Q, winningCirc);
        m.resolved = true;
        m.outcome = outcome;

        emit Resolved(marketId, outcome);
    }

    function claim(uint256 marketId, address to) public nonReentrant {
        Market storage m = markets[marketId];
        require(m.resolved, MarketNotResolved());

        uint256 winId = m.outcome ? marketId : getNoId(marketId);
        uint256 userShares = balanceOf[msg.sender][winId];
        require(userShares != 0, NoWinningShares());

        uint256 payout = mulDiv(userShares, m.payoutPerShare, Q);

        _burn(msg.sender, winId, userShares);
        totalSupply[winId] -= userShares;

        m.pot -= payout;
        HST_TOKEN.transfer(to, payout);

        emit Claimed(to, winId, userShares, payout);
    }

    /*──────── transfer / transferFrom ───────*/
    function transfer(address receiver, uint256 id, uint256 amount)
        public
        override(ERC6909Minimal)
        returns (bool)
    {
        // Disallow arbitrary parking at PM or ZAMM:
        if (receiver == address(this)) {
            // Only ZAMM may send back residuals to PM, or PM may move internally:
            if (msg.sender != address(this) && msg.sender != address(ZAMM)) {
                revert InvalidReceiver();
            }
        } else if (receiver == address(ZAMM)) {
            // Never allow users to push their own tokens into ZAMM.
            // PM itself also shouldn't "transfer" into ZAMM via this path (it uses deposit + transient mints).
            revert InvalidReceiver();
        }

        return ERC6909Minimal.transfer(receiver, id, amount);
    }

    function transferFrom(address sender, address receiver, uint256 id, uint256 amount)
        public
        returns (bool)
    {
        // Block arbitrary parking at PM or ZAMM, even when ZAMM is the caller:
        if (receiver == address(this)) {
            // Allow only ZAMM to sweep residuals back to PM or PM-internal ops:
            if (msg.sender != address(this) && msg.sender != address(ZAMM)) {
                revert InvalidReceiver();
            }
        } else if (receiver == address(ZAMM)) {
            // Only allow PM-owned tokens to go into ZAMM (transient LP/swaps):
            if (sender != address(this)) {
                revert InvalidReceiver();
            }
        }

        if (msg.sender != sender) {
            // Fast path: allow ZAMM to pull PM-owned balances without SLOADs:
            if (!(sender == address(this) && msg.sender == address(ZAMM))) {
                if (!isOperator[sender][msg.sender]) {
                    uint256 allowed = allowance[sender][msg.sender][id];
                    if (allowed != type(uint256).max) {
                        allowance[sender][msg.sender][id] = allowed - amount;
                    }
                }
            }
        }

        balanceOf[sender][id] -= amount;
        balanceOf[receiver][id] += amount;
        emit Transfer(msg.sender, sender, receiver, id, amount);
        return true;
    }

    /*──────── views & quotes (UX) ───────*/
    function marketCount() public view returns (uint256) {
        return allMarkets.length;
    }

    function tradingOpen(uint256 marketId) public view returns (bool) {
        Market storage m = markets[marketId];
        return m.resolver != address(0) && !m.resolved && block.timestamp < m.close;
    }

    /// Implied YES probability p ≈ rNO / (rYES + rNO)
    function impliedYesProb(uint256 marketId) public view returns (uint256 num, uint256 den) {
        IZAMM.PoolKey memory key = _poolKey(marketId, getNoId(marketId));
        (uint256 rYes, uint256 rNo) = _poolReserves(key, marketId);
        return (rNo, rYes + rNo);
    }

    /// Quote helpers for frontends (fee-aware, path-fair)
    // ---------- BUY QUOTES ----------
    function quoteBuyYes(uint256 marketId, uint256 yesOut)
        public
        view
        returns (
            uint256 oppIn,
            uint256 sttInFair,
            uint256 p0_num,
            uint256 p0_den,
            uint256 p1_num,
            uint256 p1_den
        )
    {
        IZAMM.PoolKey memory key = _poolKey(marketId, getNoId(marketId));
        (uint256 rYes, uint256 rNo) = _poolReserves(key, marketId);
        require(yesOut < rYes && rYes > 0 && rNo > 0, InsufficientLiquidity());

        // Order-invariant: pay NO (rNo) to get YES (rYes):
        oppIn = _getAmountIn(yesOut, /*reserveIn=*/ rNo, /*reserveOut=*/ rYes, FEE_BPS);

        // p0 and p1 for display:
        p0_num = rNo;
        p0_den = rYes + rNo;
        uint256 rYesEnd = rYes - yesOut;
        uint256 rNoEnd = rNo + oppIn;
        p1_num = rNoEnd;
        p1_den = rYesEnd + rNoEnd;

        sttInFair = _fairChargeYesWithFee(rYes, rNo, yesOut, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) sttInFair = mulDivUp(sttInFair, 10_000 + b, 10_000);
        }
    }

    function quoteBuyNo(uint256 marketId, uint256 noOut)
        public
        view
        returns (
            uint256 oppIn,
            uint256 sttInFair,
            uint256 p0_num,
            uint256 p0_den,
            uint256 p1_num,
            uint256 p1_den
        )
    {
        IZAMM.PoolKey memory key = _poolKey(marketId, getNoId(marketId));
        (uint256 rYes, uint256 rNo) = _poolReserves(key, marketId);
        require(noOut < rNo && rYes > 0 && rNo > 0, InsufficientLiquidity());

        oppIn = _getAmountIn(noOut, rYes, rNo, FEE_BPS);

        p0_num = rYes;
        p0_den = rYes + rNo;
        uint256 rNoEnd = rNo - noOut;
        uint256 rYesEnd = rYes + oppIn;
        p1_num = rYesEnd;
        p1_den = rYesEnd + rNoEnd;

        sttInFair = _fairChargeNoWithFee(rYes, rNo, noOut, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) sttInFair = mulDivUp(sttInFair, 10_000 + b, 10_000);
        }
    }

    // ---------- SELL QUOTES ----------
    function quoteSellYes(uint256 marketId, uint256 yesIn)
        public
        view
        returns (
            uint256 oppOut,
            uint256 sttOutFair,
            uint256 p0_num,
            uint256 p0_den,
            uint256 p1_num,
            uint256 p1_den
        )
    {
        IZAMM.PoolKey memory key = _poolKey(marketId, getNoId(marketId));
        (uint256 rYes, uint256 rNo) = _poolReserves(key, marketId);
        require(yesIn != 0 && rYes > 0 && rNo > 0, InsufficientLiquidity());

        oppOut = _getAmountOut(yesIn, rYes, rNo, FEE_BPS);

        p0_num = rNo; // pYES = rNo / (rYes + rNo)
        p0_den = rYes + rNo;
        uint256 rYesEnd = rYes + yesIn;
        uint256 rNoEnd = rNo - oppOut;
        p1_num = rNoEnd;
        p1_den = rYesEnd + rNoEnd;

        uint256 fair = _fairRefundYesWithFee(rYes, rNo, yesIn, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) fair = mulDiv(fair, 10_000, 10_000 + b);
        }
        uint256 potBal = markets[marketId].pot;
        sttOutFair = fair > potBal ? potBal : fair;
    }

    function quoteSellNo(uint256 marketId, uint256 noIn)
        public
        view
        returns (
            uint256 oppOut,
            uint256 sttOutFair,
            uint256 p0_num,
            uint256 p0_den,
            uint256 p1_num,
            uint256 p1_den
        )
    {
        uint256 yesId = marketId;
        uint256 noId = getNoId(marketId);
        IZAMM.PoolKey memory key = _poolKey(yesId, noId);
        (uint256 rYes, uint256 rNo) = _poolReserves(key, yesId);
        require(noIn != 0 && rYes > 0 && rNo > 0, InsufficientLiquidity());

        oppOut = _getAmountOut(noIn, rNo, rYes, FEE_BPS);

        p0_num = rYes; // pNO = rYes / (rYes + rNo)
        p0_den = rYes + rNo;
        uint256 rNoEnd = rNo + noIn;
        uint256 rYesEnd = rYes - oppOut;
        p1_num = rYesEnd;
        p1_den = rYesEnd + rNoEnd;

        uint256 fair = _fairRefundNoWithFee(rYes, rNo, noIn, FEE_BPS);
        {
            uint256 b = _pmMultBps(marketId, rYes, rNo);
            if (b != 0) fair = mulDiv(fair, 10_000, 10_000 + b);
        }
        uint256 potBal = markets[marketId].pot;
        sttOutFair = fair > potBal ? potBal : fair;
    }

    /*──────── view getters (UI & indexing) ───*/
    function getMarket(uint256 marketId)
        public
        view
        returns (
            uint256 yesSupply,
            uint256 noSupply,
            address resolver,
            bool resolved,
            bool outcome,
            uint256 pot,
            uint256 payoutPerShare,
            string memory desc,
            uint72 closeTs,
            bool canClose,
            // AMM extras:
            uint256 rYes,
            uint256 rNo,
            uint256 pYes_num,
            uint256 pYes_den
        )
    {
        Market storage m = markets[marketId];
        resolver = m.resolver;
        resolved = m.resolved;
        outcome = m.outcome;
        pot = m.pot;
        payoutPerShare = m.payoutPerShare;
        desc = descriptions[marketId];
        closeTs = m.close;
        canClose = m.canClose;

        yesSupply = totalSupply[marketId];
        noSupply = totalSupply[getNoId(marketId)];

        if (resolver != address(0)) {
            IZAMM.PoolKey memory key = _poolKey(marketId, getNoId(marketId));
            (rYes, rNo) = _poolReserves(key, marketId);
            pYes_num = rNo;
            pYes_den = rYes + rNo;
        }
    }

    function getMarkets(uint256 start, uint256 count)
        public
        view
        returns (
            uint256[] memory marketIds,
            uint256[] memory yesSupplies,
            uint256[] memory noSupplies,
            address[] memory resolvers,
            bool[] memory resolved,
            bool[] memory outcome,
            uint256[] memory pot,
            uint256[] memory payoutPerShare,
            string[] memory descs,
            uint72[] memory closes,
            bool[] memory canCloses,
            // AMM extras:
            uint256[] memory rYesArr,
            uint256[] memory rNoArr,
            uint256[] memory pYesNumArr,
            uint256[] memory pYesDenArr,
            uint256 next
        )
    {
        uint256 len = allMarkets.length;
        if (start >= len) {
            return (
                new uint256[](0),
                new uint256[](0),
                new uint256[](0),
                new address[](0),
                new bool[](0),
                new bool[](0),
                new uint256[](0),
                new uint256[](0),
                new string[](0),
                new uint72[](0),
                new bool[](0),
                new uint256[](0),
                new uint256[](0),
                new uint256[](0),
                new uint256[](0),
                0
            );
        }

        uint256 end = start + count;
        if (end > len) end = len;
        uint256 n = end - start;

        marketIds = new uint256[](n);
        yesSupplies = new uint256[](n);
        noSupplies = new uint256[](n);
        resolvers = new address[](n);
        resolved = new bool[](n);
        outcome = new bool[](n);
        pot = new uint256[](n);
        payoutPerShare = new uint256[](n);
        descs = new string[](n);
        closes = new uint72[](n);
        canCloses = new bool[](n);
        rYesArr = new uint256[](n);
        rNoArr = new uint256[](n);
        pYesNumArr = new uint256[](n);
        pYesDenArr = new uint256[](n);

        uint256 id;
        uint256 noId;

        for (uint256 j; j != n; ++j) {
            id = allMarkets[start + j];
            Market storage m = markets[id];
            marketIds[j] = id;
            yesSupplies[j] = totalSupply[id];
            noId = getNoId(id);
            noSupplies[j] = totalSupply[noId];
            resolvers[j] = m.resolver;
            resolved[j] = m.resolved;
            outcome[j] = m.outcome;
            pot[j] = m.pot;
            payoutPerShare[j] = m.payoutPerShare;
            descs[j] = descriptions[id];
            closes[j] = m.close;
            canCloses[j] = m.canClose;

            if (m.resolver != address(0)) {
                IZAMM.PoolKey memory key = _poolKey(id, noId);
                (rYesArr[j], rNoArr[j]) = _poolReserves(key, id);
                pYesNumArr[j] = rNoArr[j];
                pYesDenArr[j] = rYesArr[j] + rNoArr[j];
            }
        }

        next = (end < len) ? end : 0;
    }

    function getUserMarkets(address user, uint256 start, uint256 count)
        public
        view
        returns (
            uint256[] memory yesIds,
            uint256[] memory noIds,
            uint256[] memory yesBalances,
            uint256[] memory noBalances,
            uint256[] memory claimables,
            bool[] memory isResolved,
            bool[] memory tradingOpen_,
            uint256 next
        )
    {
        uint256 len = allMarkets.length;
        if (start >= len) {
            return (
                new uint256[](0),
                new uint256[](0),
                new uint256[](0),
                new uint256[](0),
                new uint256[](0),
                new bool[](0),
                new bool[](0),
                0
            );
        }

        uint256 end = start + count;
        if (end > len) end = len;
        uint256 n = end - start;

        yesIds = new uint256[](n);
        noIds = new uint256[](n);
        yesBalances = new uint256[](n);
        noBalances = new uint256[](n);
        claimables = new uint256[](n);
        isResolved = new bool[](n);
        tradingOpen_ = new bool[](n);

        uint256 yId;
        uint256 nId;
        uint256 yBal;
        uint256 nBal;
        bool res;

        for (uint256 j; j != n; ++j) {
            yId = allMarkets[start + j];
            nId = getNoId(yId);
            Market storage m = markets[yId];

            yesIds[j] = yId;
            noIds[j] = nId;

            yBal = balanceOf[user][yId];
            nBal = balanceOf[user][nId];
            yesBalances[j] = yBal;
            noBalances[j] = nBal;

            res = m.resolved;
            isResolved[j] = res;
            tradingOpen_[j] = (m.resolver != address(0) && !res && block.timestamp < m.close);

            if (res) {
                uint256 pps = m.payoutPerShare; // Q-scaled
                uint256 winBal = m.outcome ? yBal : nBal;
                claimables[j] = (pps == 0) ? 0 : mulDiv(winBal, pps, Q);
            }
        }

        next = (end < len) ? end : 0;
    }

    function winningId(uint256 marketId) public view returns (uint256 id) {
        Market storage m = markets[marketId];
        if (m.resolver == address(0)) return 0;
        if (!m.resolved) return 0;
        if (m.payoutPerShare == 0) return 0;
        return m.outcome ? marketId : getNoId(marketId);
    }

    function getPool(uint256 marketId)
        public
        view
        returns (
            uint256 poolId,
            uint256 rYes,
            uint256 rNo,
            uint32 tsLast,
            uint256 kLast,
            uint256 lpSupply
        )
    {
        IZAMM.PoolKey memory key = _poolKey(marketId, getNoId(marketId));
        poolId = _poolId(key);
        (uint112 r0, uint112 r1, uint32 t,,, uint256 k, uint256 s) = ZAMM.pools(poolId);
        if (key.id0 == marketId) {
            rYes = r0;
            rNo = r1;
        } else {
            rYes = r1;
            rNo = r0;
        }
        tsLast = t;
        kLast = k;
        lpSupply = s;
    }

    /*──────── internals ───*/
    function _circulating(uint256 id) internal view returns (uint256 c) {
        c = totalSupply[id];
        unchecked {
            c -= balanceOf[address(this)][id]; // exclude PM
            c -= balanceOf[address(ZAMM)][id]; // exclude ZAMM
        }
    }

    function _poolReserves(IZAMM.PoolKey memory key, uint256 yesId)
        internal
        view
        returns (uint256 rYes, uint256 rNo)
    {
        (uint112 r0, uint112 r1,,,,,) = ZAMM.pools(_poolId(key));
        if (key.id0 == yesId) {
            rYes = uint256(r0);
            rNo = uint256(r1);
        } else {
            rYes = uint256(r1);
            rNo = uint256(r0);
        }
    }

    function _getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut, uint256 feeBps)
        internal
        pure
        returns (uint256 amountIn)
    {
        if (amountOut == 0) return 0;
        uint256 numerator = reserveIn * amountOut * 10000;
        uint256 denominator = (reserveOut - amountOut) * (10000 - feeBps);
        amountIn = (numerator / denominator) + 1;
    }

    function _getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut, uint256 feeBps)
        internal
        pure
        returns (uint256 amountOut)
    {
        uint256 amountInWithFee = amountIn * (10000 - feeBps);
        uint256 numerator = amountInWithFee * reserveOut;
        uint256 denominator = reserveIn * 10000 + amountInWithFee;
        amountOut = numerator / denominator;
    }

    /*──────── utils ───────*/
    function _toString(uint256 value) internal pure returns (string memory result) {
        assembly ("memory-safe") {
            result := add(mload(0x40), 0x80)
            mstore(0x40, add(result, 0x20))
            mstore(result, 0)
            let end := result
            let w := not(0)
            for { let temp := value } 1 {} {
                result := add(result, w)
                mstore8(result, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) { break }
            }
            let n := sub(end, result)
            result := sub(result, 0x20)
            mstore(result, n)
        }
    }

    /*──────── reentrancy ─*/
    error Reentrancy();

    uint256 constant REENTRANCY_GUARD_SLOT = 0x929eee149b4bd21268;

    modifier nonReentrant() {
        assembly ("memory-safe") {
            if tload(REENTRANCY_GUARD_SLOT) {
                mstore(0x00, 0xab143c06)
                revert(0x1c, 0x04)
            }
            tstore(REENTRANCY_GUARD_SLOT, address())
        }
        _;
        assembly ("memory-safe") {
            tstore(REENTRANCY_GUARD_SLOT, 0)
        }
    }
}

/*────────────────────────────────────────────────────────
| mulDiv helper (Solady)
|────────────────────────────────────────────────────────*/
error MulDivFailed();

function mulDiv(uint256 x, uint256 y, uint256 d) pure returns (uint256 z) {
    assembly ("memory-safe") {
        z := mul(x, y)
        if iszero(mul(or(iszero(x), eq(div(z, x), y)), d)) {
            mstore(0x00, 0xad251c27)
            revert(0x1c, 0x04)
        }
        z := div(z, d)
    }
}

function mulDivUp(uint256 x, uint256 y, uint256 d) pure returns (uint256 z) {
    assembly ("memory-safe") {
        z := mul(x, y)
        if iszero(mul(or(iszero(x), eq(div(z, x), y)), d)) {
            mstore(0x00, 0xad251c27)
            revert(0x1c, 0x04)
        }
        z := add(iszero(iszero(mod(z, d))), div(z, d))
    }
}

Settings
{
  "remappings": [
    "forge-std/=lib/forge-std/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": false
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": true
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_zamm","type":"address"},{"internalType":"address","name":"_stt","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"AlreadyResolved","type":"error"},{"inputs":[],"name":"AmountZero","type":"error"},{"inputs":[],"name":"FeeOverflow","type":"error"},{"inputs":[],"name":"InsufficientLiquidity","type":"error"},{"inputs":[],"name":"InsufficientStt","type":"error"},{"inputs":[],"name":"InvalidClose","type":"error"},{"inputs":[],"name":"InvalidReceiver","type":"error"},{"inputs":[],"name":"InvalidResolver","type":"error"},{"inputs":[],"name":"MarketClosed","type":"error"},{"inputs":[],"name":"MarketExists","type":"error"},{"inputs":[],"name":"MarketNotClosed","type":"error"},{"inputs":[],"name":"MarketNotFound","type":"error"},{"inputs":[],"name":"MarketNotResolved","type":"error"},{"inputs":[],"name":"MarketResolved","type":"error"},{"inputs":[],"name":"NoCirculating","type":"error"},{"inputs":[],"name":"NoWinningShares","type":"error"},{"inputs":[],"name":"NotClosable","type":"error"},{"inputs":[],"name":"OnlyResolver","type":"error"},{"inputs":[],"name":"PoolNotSeeded","type":"error"},{"inputs":[],"name":"Reentrancy","type":"error"},{"inputs":[],"name":"SeedBothSides","type":"error"},{"inputs":[],"name":"SlippageOppIn","type":"error"},{"inputs":[],"name":"TuningBadCaps","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sharesOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sttIn","type":"uint256"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"},{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"Closed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"noId","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"address","name":"resolver","type":"address"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"OperatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"components":[{"internalType":"uint32","name":"lateRampStart","type":"uint32"},{"internalType":"uint16","name":"lateRampMaxBps","type":"uint16"},{"internalType":"uint16","name":"extremeMaxBps","type":"uint16"}],"indexed":false,"internalType":"struct PAMM.PMTuning","name":"t","type":"tuple"},{"indexed":false,"internalType":"bool","name":"finalized","type":"bool"}],"name":"PMTuningSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"outcome","type":"bool"}],"name":"Resolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"resolver","type":"address"},{"indexed":false,"internalType":"uint16","name":"bps","type":"uint16"}],"name":"ResolverFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"yesSeed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"noSeed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"Seeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sharesIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sttOut","type":"uint256"}],"name":"Sold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"HST_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZAMM","outputs":[{"internalType":"contract IZAMM","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allMarkets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"noOut","type":"uint256"},{"internalType":"uint256","name":"sttInMax","type":"uint256"},{"internalType":"uint256","name":"oppInMax","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"buyNoViaPool","outputs":[{"internalType":"uint256","name":"sttIn","type":"uint256"},{"internalType":"uint256","name":"oppIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"yesOut","type":"uint256"},{"internalType":"uint256","name":"sttInMax","type":"uint256"},{"internalType":"uint256","name":"oppInMax","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"buyYesViaPool","outputs":[{"internalType":"uint256","name":"sttIn","type":"uint256"},{"internalType":"uint256","name":"oppIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"closeMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint72","name":"close","type":"uint72"},{"internalType":"bool","name":"canClose","type":"bool"},{"internalType":"uint256","name":"seedYes","type":"uint256"},{"internalType":"uint256","name":"seedNo","type":"uint256"}],"name":"createMarket","outputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"noId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint72","name":"close","type":"uint72"},{"internalType":"bool","name":"canClose","type":"bool"},{"internalType":"uint256","name":"seedYes","type":"uint256"},{"internalType":"uint256","name":"seedNo","type":"uint256"},{"components":[{"internalType":"uint32","name":"lateRampStart","type":"uint32"},{"internalType":"uint16","name":"lateRampMaxBps","type":"uint16"},{"internalType":"uint16","name":"extremeMaxBps","type":"uint16"}],"internalType":"struct PAMM.PMTuning","name":"t","type":"tuple"}],"name":"createMarketWithPMTuning","outputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"noId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"descriptions","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"getMarket","outputs":[{"internalType":"uint256","name":"yesSupply","type":"uint256"},{"internalType":"uint256","name":"noSupply","type":"uint256"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"bool","name":"outcome","type":"bool"},{"internalType":"uint256","name":"pot","type":"uint256"},{"internalType":"uint256","name":"payoutPerShare","type":"uint256"},{"internalType":"string","name":"desc","type":"string"},{"internalType":"uint72","name":"closeTs","type":"uint72"},{"internalType":"bool","name":"canClose","type":"bool"},{"internalType":"uint256","name":"rYes","type":"uint256"},{"internalType":"uint256","name":"rNo","type":"uint256"},{"internalType":"uint256","name":"pYes_num","type":"uint256"},{"internalType":"uint256","name":"pYes_den","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"resolver","type":"address"}],"name":"getMarketId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getMarkets","outputs":[{"internalType":"uint256[]","name":"marketIds","type":"uint256[]"},{"internalType":"uint256[]","name":"yesSupplies","type":"uint256[]"},{"internalType":"uint256[]","name":"noSupplies","type":"uint256[]"},{"internalType":"address[]","name":"resolvers","type":"address[]"},{"internalType":"bool[]","name":"resolved","type":"bool[]"},{"internalType":"bool[]","name":"outcome","type":"bool[]"},{"internalType":"uint256[]","name":"pot","type":"uint256[]"},{"internalType":"uint256[]","name":"payoutPerShare","type":"uint256[]"},{"internalType":"string[]","name":"descs","type":"string[]"},{"internalType":"uint72[]","name":"closes","type":"uint72[]"},{"internalType":"bool[]","name":"canCloses","type":"bool[]"},{"internalType":"uint256[]","name":"rYesArr","type":"uint256[]"},{"internalType":"uint256[]","name":"rNoArr","type":"uint256[]"},{"internalType":"uint256[]","name":"pYesNumArr","type":"uint256[]"},{"internalType":"uint256[]","name":"pYesDenArr","type":"uint256[]"},{"internalType":"uint256","name":"next","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"getNoId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"getPool","outputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"rYes","type":"uint256"},{"internalType":"uint256","name":"rNo","type":"uint256"},{"internalType":"uint32","name":"tsLast","type":"uint32"},{"internalType":"uint256","name":"kLast","type":"uint256"},{"internalType":"uint256","name":"lpSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getUserMarkets","outputs":[{"internalType":"uint256[]","name":"yesIds","type":"uint256[]"},{"internalType":"uint256[]","name":"noIds","type":"uint256[]"},{"internalType":"uint256[]","name":"yesBalances","type":"uint256[]"},{"internalType":"uint256[]","name":"noBalances","type":"uint256[]"},{"internalType":"uint256[]","name":"claimables","type":"uint256[]"},{"internalType":"bool[]","name":"isResolved","type":"bool[]"},{"internalType":"bool[]","name":"tradingOpen_","type":"bool[]"},{"internalType":"uint256","name":"next","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"impliedYesProb","outputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint256","name":"den","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"markets","outputs":[{"internalType":"address","name":"resolver","type":"address"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"bool","name":"outcome","type":"bool"},{"internalType":"bool","name":"canClose","type":"bool"},{"internalType":"uint72","name":"close","type":"uint72"},{"internalType":"uint256","name":"pot","type":"uint256"},{"internalType":"uint256","name":"payoutPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pmTuning","outputs":[{"internalType":"uint32","name":"lateRampStart","type":"uint32"},{"internalType":"uint16","name":"lateRampMaxBps","type":"uint16"},{"internalType":"uint16","name":"extremeMaxBps","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pmTuningFinal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"noOut","type":"uint256"}],"name":"quoteBuyNo","outputs":[{"internalType":"uint256","name":"oppIn","type":"uint256"},{"internalType":"uint256","name":"sttInFair","type":"uint256"},{"internalType":"uint256","name":"p0_num","type":"uint256"},{"internalType":"uint256","name":"p0_den","type":"uint256"},{"internalType":"uint256","name":"p1_num","type":"uint256"},{"internalType":"uint256","name":"p1_den","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"yesOut","type":"uint256"}],"name":"quoteBuyYes","outputs":[{"internalType":"uint256","name":"oppIn","type":"uint256"},{"internalType":"uint256","name":"sttInFair","type":"uint256"},{"internalType":"uint256","name":"p0_num","type":"uint256"},{"internalType":"uint256","name":"p0_den","type":"uint256"},{"internalType":"uint256","name":"p1_num","type":"uint256"},{"internalType":"uint256","name":"p1_den","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"noIn","type":"uint256"}],"name":"quoteSellNo","outputs":[{"internalType":"uint256","name":"oppOut","type":"uint256"},{"internalType":"uint256","name":"sttOutFair","type":"uint256"},{"internalType":"uint256","name":"p0_num","type":"uint256"},{"internalType":"uint256","name":"p0_den","type":"uint256"},{"internalType":"uint256","name":"p1_num","type":"uint256"},{"internalType":"uint256","name":"p1_den","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"yesIn","type":"uint256"}],"name":"quoteSellYes","outputs":[{"internalType":"uint256","name":"oppOut","type":"uint256"},{"internalType":"uint256","name":"sttOutFair","type":"uint256"},{"internalType":"uint256","name":"p0_num","type":"uint256"},{"internalType":"uint256","name":"p0_den","type":"uint256"},{"internalType":"uint256","name":"p1_num","type":"uint256"},{"internalType":"uint256","name":"p1_den","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"bool","name":"outcome","type":"bool"}],"name":"resolve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"resolver","type":"address"}],"name":"resolverFeeBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"noIn","type":"uint256"},{"internalType":"uint256","name":"sttOutMin","type":"uint256"},{"internalType":"uint256","name":"oppOutMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"sellNoViaPool","outputs":[{"internalType":"uint256","name":"sttOut","type":"uint256"},{"internalType":"uint256","name":"oppOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"yesIn","type":"uint256"},{"internalType":"uint256","name":"sttOutMin","type":"uint256"},{"internalType":"uint256","name":"oppOutMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"sellYesViaPool","outputs":[{"internalType":"uint256","name":"sttOut","type":"uint256"},{"internalType":"uint256","name":"oppOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"bps","type":"uint16"}],"name":"setResolverFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"winningId","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"view","type":"function"}]

0x60c0601f614bb138819003918201601f19168301916001600160401b038311848410176100fb5780849260409485528339810103126100f75761004d60206100468361010f565b920161010f565b6001600160a01b039182166080521660a052604051614a8d90816101248239608051818181610365015281816103a6015281816103d7015281816107d8015281816114fd015281816117bb015281816120670152818161290701528181612938015281816129bd015281816135bf015281816142a50152614977015260a05181818161075801528181610e780152818161149601528181611aae01528181611e1e01526120010152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036100f75756fe610360806040526004361015610013575f80fd5b5f905f3560e01c908162ad800c14612b3057508062fdd58e14612aec57806301ffc9a714612a97578063068bcd8d14612975578063095bcdb6146128565780630f4016b01461276c57806316ac2b901461264a578063181c7f661461262c5780631e937fc214612458578063399f1a12146123aa5780634076ac511461238c578063426a8493146123125780634d5e9db0146122d65780634e41a1fb1461226a5780634e441bda1461220d5780634efef1d014611eb657806352a34b0514611c4c57806352d84d1e14611c12578063558a729714611b8257806359152b8214611b35578063598af9e714611add5780636ddb76f114611a985780637f8b182114611a4f57806380968d48146117ea5780638743a669146117a55780639595636914611350578063ae4180951461123b578063b0953d671461120c578063b1283e771461118f578063b33aad2d1461112a578063b6363cf2146110d3578063bd85b039146110a9578063bdd305a614610f8c578063c90bd92114610f4f578063ddd5e1b214610d6c578063e6f859e714610d2d578063eb44fdd314610bef578063ec97908214610bd1578063f0cca67b14610af5578063f4d197ac14610629578063fb105091146105a6578063fc78909f146104425763fe99049a146101f6575f80fd5b3461043f57608036600319011261043f5761020f612bde565b610217612bf4565b604435926001600160a01b0390911691606435903084036103d55730331415806103a2575b610393575f516020614a6d5f395f51905f529160406102c1925b6001600160a01b031694338690036102cf575b8581526001602052818120888252602052818120610288848254612ef7565b90558681526001602052818120888252602052206102a7828254612eea565b905560408051338152602081019290925290918291820190565b0390a4602060405160018152f35b30861480610361575b610269578581526020818152828220335f90815291528290205460ff166102695785815260026020908152828220335f908152908252839020898352905281812054836001820161032b575b5050610269565b61033491612ef7565b868252600260205282822060018060a01b0333165f52602052825f20898352602052828220555f83610324565b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146102d8565b631e4ec46b60e01b8352600483fd5b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141561023c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168414610420575b5f516020614a6d5f395f51905f529160406102c192610256565b6001600160a01b038116301461040657631e4ec46b60e01b8352600483fd5b80fd5b503461043f5761045136612c34565b9161046d82610468610462826132af565b826141c4565b61427c565b9390928115158061059d575b80610594575b156105855761048f848684614704565b9261049a8686612eea565b906104a58488612eea565b926104d06104c86104c06104b9898b612ef7565b9687612eea565b968a8a6149b2565b98888361447d565b80610534575b5081526006602052604090206001015494959394610528948181111561052c5750955b604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b0390f35b9050956104f9565b61271001806127101161057157806127108a0299612710818c0414901517021561056457909704966105286104d6565b63ad251c2783526004601cfd5b634e487b7160e01b83526011600452602483fd5b63bb55fd2760e01b8352600483fd5b5084151561047f565b50831515610479565b503461043f57602036600319011261043f5760043561ffff8116809103610625576103e88111610616573382526009602052604082208161ffff198254161790556040519081527ffc0ef2a6f22017eb94ef2ccd5c1e26a73755192f425c5dc589c62105cccaf24c60203392a280f35b6340c0d6e560e11b8252600482fd5b5080fd5b503461043f5761063836612d14565b949193909268929eee149b4bd212685c610ae8573068929eee149b4bd212685d81835260066020526040832080546001600160a01b03811615610ad95760ff8160a01c16159081610acc575b5015610abe578115610aaf57610699836132af565b906106a482856141c4565b976106af858a61427c565b929080151580610aa6575b15610a9757868b5114936106cf818389614704565b998a10610a8857806106e5886106ec938561476b565b928961447d565b80610a3a575b5090600101908154908181115f14610a34575080995b8a10610a2557610753926020926107208c8094612ef7565b905560405163a9059cbb60e01b81526001600160a01b039091166004820152602481019190915291829081906044820190565b0381897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610a1a576109ed575b50610799838533614908565b8385526007602052604085206107b0848254612ef7565b90556107bd8385306148c3565b8385526007602052604085206107d4848254612eea565b90557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031697883b156109de57604051630efe6a8b60e01b815230600482015260248101869052604481018590528681606481838e5af180156109e2579087916109c9575b505061086a9160209160405193849283926338c3f8db60e01b84524291898d309360048801613b0f565b0381888c5af180156109be5761098f575b5060206040518098635323fe1560e11b825281878161089f308a3060048501613b84565b03925af1801561098457849061094d575b6040975080610924575b506108c6858230614908565b835260076020528583206108db858254612ef7565b905585519081528460208201527fe029f26dbcf8c42dd2f352c10214a7fc26773dc62482c6241334a0402ac09a80863392a368929eee149b4bd212685d82519182526020820152f35b61092f818530614908565b8385526007602052610945888620918254612ef7565b90555f6108ba565b506020873d60201161097c575b8161096760209383612dc6565b8101031261097857604096516108b0565b5f80fd5b3d915061095a565b6040513d86823e3d90fd5b6020813d6020116109b6575b816109a860209383612dc6565b81010312610978575161087b565b3d915061099b565b6040513d87823e3d90fd5b816109d391612dc6565b6109de57855f610840565b8580fd5b6040513d89823e3d90fd5b610a0e9060203d602011610a13575b610a068183612dc6565b810190613af7565b61078d565b503d6109fc565b6040513d88823e3d90fd5b63396038e360e21b8852600488fd5b99610708565b61271001908161271011610a745781612710820291612710818404149015170215610a67570460016106f2565b63ad251c2789526004601cfd5b634e487b7160e01b89526011600452602489fd5b63bb55fd2760e01b8952600489fd5b6313b0827d60e31b8852600488fd5b508315156106ba565b6365e52d5160e11b8452600484fd5b62b5f6bf60e41b8452600484fd5b905060b81c42105f610684565b6307db1be560e41b8552600485fd5b63ab143c0683526004601cfd5b503461043f57610b0436612d14565b949193909268929eee149b4bd212685c610ae8573068929eee149b4bd212685d81835260066020526040832080549092906001600160a01b03811615610ad95760ff8160a01c16159081610bc4575b5015610abe578115610aaf57610b68816132af565b92610b7384836141c4565b97610b7e838a61427c565b929080151580610bbb575b15610a9757868b511493610b9e828289614704565b998a10610a885780610bb4886106ec93856149b2565b928761447d565b50831515610b89565b905060b81c42105f610b53565b503461043f578060031936011261043f576020600554604051908152f35b503461043f57602036600319011261043f576004359080818283918585526006602052604085209384549460018060a01b0386169060026001820154910154908989526008602052610c4360408a20612de8565b928a8a5260076020526040808b20549a610c5c8d6132af565b8152600760205220549a81610cf2575b509160ff9391610cbf936040519c8d9c8d5260208d015260408c0152848a60a01c16151560608c0152848a60a81c16151560808c015260a08b015260c08a01526101c060e08a01526101c0890190612bba565b958060b81c61010089015260b01c1615156101208701526101408601526101608501526101808401526101a08301520390f35b909750610cbf929650610d1291955060ff939450610468610462826132af565b958695919491610d228787612eea565b989193509193610c6c565b503461043f57602036600319011261043f57610d586040610528926004358152600860205220612de8565b604051918291602083526020830190612bba565b503461043f57604036600319011261043f57600435610d89612bf4565b9068929eee149b4bd212685c610ae8573068929eee149b4bd212685d80835260066020526040832090815460ff8160a01c1615610f405760a81c60ff1615610f3157915b3384526001602052604084208385526020526040842054918215610f22576002810154670de0b6b3a764000081850291858304140215610f1557670de0b6b3a76400006001910491610e20858733614908565b858752600760205260408720610e37868254612ef7565b905501610e45828254612ef7565b905560405163a9059cbb60e01b81526001600160a01b0383166004820152602481018290529160208380604481010381897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610a1a577f9cdcf2f7714cca3508c7f0110b04a90a80a3a8dd0e35de99689db74d28c5383e93604093610ef8575b50825194855260208501526001600160a01b031692a38068929eee149b4bd212685d80f35b610f109060203d602011610a1357610a068183612dc6565b610ed3565b63ad251c2786526004601cfd5b63843f941b60e01b8552600485fd5b610f3a906132af565b91610dcd565b63174b639360e11b8552600485fd5b503461043f57602036600319011261043f576040610f80610f78600435610468610462826132af565b809291612eea565b82519182526020820152f35b503461043f57610f9b36612c34565b610fab82610468610462826132af565b8083929310806110a0575b80611097575b1561108857610fcc818484614332565b92610fd78282612eea565b9061100c610fe58585612ef7565b9382611006610ffe610ff78a84612eea565b9788612eea565b97838361487c565b9861447d565b80611049575b5061052894959650604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b61271096919601968761271011611074575061052894959661106a9161468d565b949350855f611012565b634e487b7160e01b81526011600452602490fd5b63bb55fd2760e01b8552600485fd5b50801515610fbc565b50821515610fb6565b503461043f57602036600319011261043f5760406020916004358152600783522054604051908152f35b503461043f57604036600319011261043f5760406110ef612bde565b916110f8612bf4565b9260018060a01b0316815280602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b503461043f57602036600319011261043f576004358152600660209081526040909120546001600160a01b0381161515908161117f575b81611172575b506040519015158152f35b905060b81c42105f611167565b905060ff8160a01c161590611161565b503461043f57602036600319011261043f57604060e091600435815260066020522080549060026001820154910154906040519260018060a01b038116845260ff8160a01c161515602085015260ff8160a81c161515604085015260ff8160b01c161515606085015260b81c608084015260a083015260c0820152f35b503461043f57602036600319011261043f5760ff60406020926004358152600484522054166040519015158152f35b503461043f57602036600319011261043f5760043568929eee149b4bd212685c611343573068929eee149b4bd212685d80825260066020526040822080546001600160a01b0381168015610ad95733036113345760ff8160b01c16156113255760ff8160a01c166113165760b81c4210156113085780546001600160b81b03164260b81b6001600160b81b031916179055604051904282527f785f63ccac8ab83aff1730b2462e4c5437bf3b1dbc6f8c243a20e3efb9af9d5260203393a38068929eee149b4bd212685d80f35b62b5f6bf60e41b8352600483fd5b6355e8cb5f60e01b8452600484fd5b6374c77f3b60e01b8452600484fd5b632b910d6d60e11b8452600484fd5b63ab143c0682526004601cfd5b503461043f5761135f36612d14565b939094919268929eee149b4bd212685c610ae8573068929eee149b4bd212685d81835260066020526040832080546001600160a01b03811615610ad95760ff8160a01c16159081611798575b5015610abe578115610aaf576113c0836132af565b6113ca81856141c4565b916113d5858461427c565b9190978815158061178f575b15610a97578886101561178057838551149a6113fe8a8589614332565b8181116117715761140e816146af565b906005820180921161175d57816003820180921161174957908061145294939210611741575b50818111156117395750935b61144b88828d6143e9565b9a8961447d565b80611717575b508815610a25578811611708576040516323b872dd60e01b8152336004820152306024820152604481018990526020816064818b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af180156116e05790600192916116eb575b50016114d5888254612eea565b90556114e28183306148c3565b8186526007602052604086206114f9828254612eea565b90557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b156116dc57604051630efe6a8b60e01b81523060048201526024810184905260448101839052878160648183895af180156116e0576116c7575b509860209161158d8a9b60409b9a9b519a8b9485946338c3f8db60e01b86528a429460048801613b0f565b038188865af19586156109be578596611693575b5060206040518093635323fe1560e11b82528188816115c530883060048501613b84565b03925af19182156109be57859261165e575b506040978289927fedba86fd2b22962d534e70ad9b0ff8730de46f636146f2bab6a72cbb1ebbcc5394611635575b50508151938452602084018890526001600160a01b031692a368929eee149b4bd212685d82519182526020820152f35b611640828230614908565b87526007602052611655838820918254612ef7565b90555f80611605565b9091506020813d60201161168b575b8161167a60209383612dc6565b8101031261097857519060406115d7565b3d915061166d565b9095506020813d6020116116bf575b816116af60209383612dc6565b810103126109785751945f6115a1565b3d91506116a2565b6116d2888092612dc6565b6116dc575f611562565b8680fd5b6040513d8a823e3d90fd5b6117039060203d602011610a1357610a068183612dc6565b6114c8565b63396038e360e21b8752600487fd5b61271099919901908161271011610a7457906117329161468d565b975f611458565b905093611440565b90505f611434565b634e487b7160e01b8c52601160045260248cfd5b634e487b7160e01b8b52601160045260248bfd5b638e6e832560e01b8a5260048afd5b63bb55fd2760e01b8852600488fd5b508215156113e1565b905060b81c42105f6113ab565b503461043f578060031936011261043f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461043f576118026117fc36612c34565b90613c1a565b6101405161016051610180516101a0516101c0516101e05196610300516102005161022051610240516102605161028051906118876102a0516118756102c0516118636102e051604051608052610200608051526102006080510190612cac565b90608051820360206080510152612cac565b90608051820360406080510152612cac565b60805181036060608051015260208084519283815201930190885b818110611a30575050506118f1926118cd6119039695936118df936080518203608080510152612cdf565b90608051820360a06080510152612cdf565b90608051820360c06080510152612cac565b90608051820360e06080510152612cac565b60805181036101006080510152815180825260208201916020808360051b83010194019285915b838310611a00575050505050608051810361012060805101526020808a5192838152019901915b8181106119e157505050916119956119a8926119826119ce98996119bb979660805182036101406080510152612cdf565b9060805182036101606080510152612cac565b9060805182036101806080510152612cac565b9060805182036101a06080510152612cac565b9060805182036101c06080510152612cac565b906101e060805101526080519003608051f35b82516001600160481b03168a526020998a019990920191600101611951565b909192939594602080611a1f600193601f198682030187528a51612bba565b97980195949190910192019061192a565b82516001600160a01b03168552602094850194909201916001016118a2565b503461043f57602036600319011261043f57604060609160043581526003602052205461ffff6040519163ffffffff81168352818160201c16602084015260301c166040820152f35b503461043f578060031936011261043f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461043f57606036600319011261043f576040602091611afc612bde565b611b04612bf4565b6001600160a01b0391821683526002855283832091165f908152908452829020604435825283522054604051908152f35b503461043f57604036600319011261043f576004359067ffffffffffffffff821161043f576020611b7a611b6c3660048601612c4a565b611b74612bf4565b91613bc5565b604051908152f35b503461043f57604036600319011261043f57611b9c612bde565b6040611ba6612c9d565b92338152806020522060018060a01b0382165f5260205260405f209115159160ff1981541660ff841617905560405191825260018060a01b0316907fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa26760203392a3602060405160018152f35b503461043f57602036600319011261043f576004359060055482101561043f576020611c3d83612d46565b90549060031b1c604051908152f35b503461043f57604036600319011261043f57600435611c69612c9d565b68929eee149b4bd212685c610ae8573068929eee149b4bd212685d818352600660205260408320805482906001600160a01b038116908115611ea757813303611e985760ff8160a01c16611e895760b81c4210611e7a57808652600960205261ffff60408720541680611de6575b5050611ce2846132af565b90611cf5611cef86614947565b92614947565b9015611dc757811580611dbe575b611db6575b8315611daf57505b8015611da057600182015481670de0b6b3a7640000820291670de0b6b3a7640000818404149015170215610f1557046002820155805461ffff60a01b191682151560a81b60ff60a81b1617600160a01b1790557fe940c2f4a2e1dda6ea582b576e35520a2ec6b80e436c26962c1150ddd7d07993906020906040519015158152a28068929eee149b4bd212685d80f35b63338aa79560e21b8552600485fd5b9050611d10565b859350611d08565b50801515611d03565b801580611ddd575b15611d085760019350611d08565b50811515611dcf565b6001840191612710611dfa84549384613ae4565b049081611e09575b5050611cd7565b611e199361072083602095612ef7565b0381897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610a1a57611e5b575b808080611e02565b611e739060203d602011610a1357610a068183612dc6565b505f611e53565b63a8a9eb6960e01b8652600486fd5b6336ab81e160e11b8752600487fd5b632b910d6d60e11b8752600487fd5b6307db1be560e41b8752600487fd5b503461097857611ec536612d14565b949193909268929eee149b4bd212685c612200573068929eee149b4bd212685d5f82815260066020526040902080546001600160a01b038116156121f15760ff8160a01c161590816121e4575b50156121d65781156121c757611f27836132af565b92611f3284826141c4565b95611f3d828861427c565b939098891515806121be575b156121af57848610156121a0578389511492611f66868c89614332565b9581871161219157611f77876146af565b966005880180981161216d5787906003810180911161216d5782611fbc948f9a93838d94611fb59610612189575b508181111561218157509961487c565b9b8661447d565b8061214d575b50891561213e57891161213e576040516323b872dd60e01b8152336004820152306024820152604481018a9052906020826064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af191821561211657600192612121575b500161203f898254612eea565b905561204c8383306148c3565b815f52600760205260405f20612063848254612eea565b90557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561097857604051630efe6a8b60e01b81523060048201526024810184905260448101829052975f8960648183895af1988915612116578b996120f7575b509061158d602093926040519a8b9485946338c3f8db60e01b86528a429460048801613b0f565b602093929198505f61210891612dc6565b61158d5f98919293506120d0565b6040513d5f823e3d90fd5b6121399060203d602011610a1357610a068183612dc6565b612032565b63396038e360e21b5f5260045ffd5b6127109a919a01806127101161216d576121669161468d565b985f611fc2565b634e487b7160e01b5f52601160045260245ffd5b90509961487c565b90505f611fa5565b638e6e832560e01b5f5260045ffd5b63bb55fd2760e01b5f5260045ffd5b6313b0827d60e31b5f5260045ffd5b50841515611f49565b6365e52d5160e11b5f5260045ffd5b62b5f6bf60e41b5f5260045ffd5b905060b81c42105f611f12565b6307db1be560e41b5f5260045ffd5b63ab143c065f526004601cfd5b346109785760c03660031901126109785760043567ffffffffffffffff811161097857610f806122436040923690600401612c4a565b9061224c612bf4565b612254612c78565b61225c612c8e565b9160a43594608435946132e1565b3461097857602036600319011261097857604051604081019080821067ffffffffffffffff8311176122c25761052891604052600481526350414d4d60e01b6020820152604051918291602083526020830190612bba565b634e487b7160e01b5f52604160045260245ffd5b34610978576020366003190112610978576001600160a01b036122f7612bde565b165f526009602052602061ffff60405f205416604051908152f35b346109785761232036612c0a565b9091335f52600260205260405f2060018060a01b0382165f5260205260405f20835f526020528160405f205560405191825260018060a01b0316907fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a760203392a4602060405160018152f35b34610978576020366003190112610978576020611b7a6004356132af565b34610978576124246123fa61243261244e6124086124406124166123d66123d036612c0a565b91613001565b9b9660409e95929893969e9a919a519e8f9e8f926101008452610100840190612cac565b916020818403910152612cac565b8c810360408e015290612cac565b908a820360608c0152612cac565b9088820360808a0152612cac565b9086820360a0880152612cdf565b9084820360c0860152612cdf565b9060e08301520390f35b34610978576101203660031901126109785760043567ffffffffffffffff81116109785761248a903690600401612c4a565b612492612bf4565b9061249b612c78565b926124a4612c8e565b60603660c319011261097857846124c29460a43594608435946132e1565b916107d061ffff6124d1612f5f565b16118015612616575b6125e45763ffffffff6124eb612f82565b16159081156125f3575b50156125e457805f52600360205260405f2063ffffffff612514612f82565b1681549065ffff00000000612527612f5f565b60201b169067ffff00000000000061253d612f70565b60301b169267ffffffffffffffff19161717179055805f52600460205260405f20600160ff198254161790556040519160c43563ffffffff811680910361097857835260e43561ffff81168091036109785760208401526101043561ffff8116809103610978577f03cac222e77965d762368408cf9b2c5bd188fa9d139ee2b0a48dad1fcba6491e608085859360408098015260016060820152a282519182526020820152f35b634f8664a960e01b5f5260045ffd5b905063ffffffff6001600160481b0361260a612f82565b921691161115836124f5565b506107d061ffff612625612f70565b16116124da565b34610978576020366003190112610978576020611b7a600435612f04565b346109785761265836612c34565b9061266981610468610462826132af565b9280151580612763575b8061275a575b156121a057612689848383614704565b926126948584612eea565b61269e8385612eea565b916126c9876126c26126ba6126b38a84612ef7565b8097612eea565b96828961476b565b968361447d565b8061271e575b505f90815260066020526040902060010154610528948181111561052c575095604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b61271001806127101161216d578061271087029661271081890414901517021561274d576105289504946126cf565b63ad251c275f526004601cfd5b50831515612679565b50811515612673565b346109785761277a36612c34565b9061278b81610468610462826132af565b928181108061284d575b80612844575b156121a0576127ab828583614332565b916127b68582612eea565b6127e3866127c48585612ef7565b936127dd6127d56126b38985612eea565b9683836143e9565b9761447d565b8061281f575b50610528939495604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b6127109594950193846127101161216d576105289461283d9161468d565b94936127e9565b5083151561279b565b50811515612795565b346109785761286436612c0a565b90916001600160a01b031690308203612936573033141580612903575b6128f4575b335f52600160205260405f20835f5260205260405f206128a7828254612ef7565b9055815f52600160205260405f20835f5260205260405f206128ca828254612eea565b9055604080513380825260208201939093525f516020614a6d5f395f51905f5291819081016102c1565b631e4ec46b60e01b5f5260045ffd5b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415612881565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316820361288657631e4ec46b60e01b5f5260045ffd5b3461097857602036600319011261097857600435612995610462826132af565b61299e81614224565b6040516315895f4760e31b81526004810182905290919060e0816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156121165760c0945f5f905f925f945f96612a52575b5063ffffffff94959651145f14612a40576001600160701b0391821691165b60405196875260208701526040860152166060840152608083015260a0820152f35b6001600160701b039081169116612a1e565b925094505063ffffffff9250612a80915060e03d60e011612a90575b612a788183612dc6565b810190612e9c565b97909693959390925090506129ff565b503d612a6e565b346109785760203660031901126109785760043563ffffffff60e01b8116809103610978576020906301ffc9a760e01b8114908115612adb57506040519015158152f35b630f632fb360e01b14905082611167565b34610978576040366003190112610978576001600160a01b03612b0d612bde565b165f52600160205260405f206024355f52602052602060405f2054604051908152f35b34610978576020366003190112610978576080810160a082016040525f8152600a600435915b5f190191603082820601835304908115612b7257600a90612b56565b61052890610d58602585608084601f19810192030181526040519384916450414d4d2d60d81b60208401525180918484015e81015f838201520301601f198101835282612dc6565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361097857565b602435906001600160a01b038216820361097857565b6060906003190112610978576004356001600160a01b038116810361097857906024359060443590565b6040906003190112610978576004359060243590565b9181601f840112156109785782359167ffffffffffffffff8311610978576020838186019501011161097857565b604435906001600160481b038216820361097857565b60643590811515820361097857565b60243590811515820361097857565b90602080835192838152019201905f5b818110612cc95750505090565b8251845260209384019390920191600101612cbc565b90602080835192838152019201905f5b818110612cfc5750505090565b82511515845260209384019390920191600101612cef565b60a090600319011261097857600435906024359060443590606435906084356001600160a01b03811681036109785790565b600554811015612d5e5760055f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b90600182811c92168015612da0575b6020831014612d8c57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691612d81565b60a0810190811067ffffffffffffffff8211176122c257604052565b90601f8019910116810190811067ffffffffffffffff8211176122c257604052565b9060405191825f825492612dfb84612d72565b8084529360018116908115612e665750600114612e22575b50612e2092500383612dc6565b565b90505f9291925260205f20905f915b818310612e4a575050906020612e20928201015f612e13565b6020919350806001915483858901015201910190918492612e31565b905060209250612e2094915060ff191682840152151560051b8201015f612e13565b51906001600160701b038216820361097857565b908160e091031261097857612eb081612e88565b91612ebd60208301612e88565b91604081015163ffffffff81168103610978579160608201519160808101519160c060a083015192015190565b9190820180921161216d57565b9190820391821161216d57565b5f8181526006602052604090208054906001600160a01b03821615612f585760ff8260a01c1615612f58576002015415612f525760a81c60ff1615612f465790565b612f4f906132af565b90565b50505f90565b5050505f90565b60e43561ffff811681036109785790565b6101043561ffff811681036109785790565b60c43563ffffffff811681036109785790565b67ffffffffffffffff81116122c25760051b60200190565b90612fb782612f95565b612fc46040519182612dc6565b8281528092612fd5601f1991612f95565b0190602036910137565b5f19811461216d5760010190565b8051821015612d5e5760209160051b010190565b90929160055490818510156132095761301a9085612eea565b91818311613200575b61302d8584612ef7565b9061303782612fad565b9561304183612fad565b9561304b84612fad565b9561305585612fad565b9561305f86612fad565b9561306981612fad565b9561307382612fad565b958c5f8d8c8e5b87840361309957505050505050505081105f146130945790565b505f90565b613121848093816130b26130ad828c612eea565b612d46565b90549060031b1c966130e66130c6896132af565b9283928a5f5260066020528a6130e08360405f209f612fed565b52612fed565b526001600160a01b038b165f90815260016020908152604080832099835298905287812054918152969096205494859487916130e091612fed565b528354938c6131378560ff8860a01c1692612fed565b811580159091526001600160a01b038716151590816131f8575b508d86826131ea575b61316391612fed565b9015159052613184575b50505061317a9150612fdf565b8d908d8c8e61307a565b600201549360a81c60ff16156131e357505b826131b6575061317a91505f5b6131ad828d612fed565b525f808061316d565b8281029281159184041417670de0b6b3a7640000021561274d57670de0b6b3a764000061317a92046131a3565b9050613196565b60b889901c4210925061315a565b90505f613151565b91508091613023565b505050905060206040519061321e8183612dc6565b5f82525f368137604051926132338285612dc6565b5f84525f368137604051926132488385612dc6565b5f84525f3681376040519261325d8185612dc6565b5f84525f368137604051926132728285612dc6565b5f84525f368137604051926132878385612dc6565b5f84525f3681376040519261329c8185612dc6565b5f8452505f368137969594939291905f90565b604051602081019169504d41524b45543a4e4f60b01b8352602a820152602a81526132db604a82612dc6565b51902090565b949693959190926001600160481b03169442861115613ad5575f936001600160a01b038316928315613ac657613318908284613bc5565b97613322896132af565b5f8a8152600660205260409020549098906001600160a01b0316613ab7576040519160e083019083821067ffffffffffffffff8311176122c25761343d6001600160481b036002948e9460405289875260208701935f855261340c604089015f815260608a01921515835260808a0193845260a08a01965f885260c08b01985f8a525f52600660205260405f209a60018060a01b039051166bffffffffffffffffffffffff60a01b8c5416178b555115158a549060ff60a01b9060a01b169060ff60a01b1916178a55511515899081549060ff60a81b90151560a81b169060ff60a81b1916179055565b51875491516001600160b01b0390921690151560b01b60ff60b01b1617911660b81b6001600160b81b031916178555565b51600184015551910155600554680100000000000000008110156122c25780600161346b9201600555612d46565b81549060031b908a821b915f19901b1916179055875f52600860205260405f209167ffffffffffffffff82116122c2578793836134a98b9554612d72565b601f8111613a5c575b505f601f85116001146139c65793606092819492827f17b8c412a1cea43243c38f500086d0f3592bdcab32ceb23615f752c9c4f63921975f916139bb575b508360011b905f198560031b1c19161790555b60405194859360408552816040860152858501375f8383018501526020830152601f01601f19168101030190a38515801580916139b2575b613549575b50505090919250565b806139a9575b1561399a5761355d856132af565b9061356882876141c4565b916135748888306148c3565b865f52600760205260405f2061358b898254612eea565b90556135988282306148c3565b5f52600760205260405f206135ae828254612eea565b90558151968688036139945790915b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031697883b1561097857604051630efe6a8b60e01b81523060048201526024810191909152604481018390525f81606481838d5af180156121165761397f575b50602081018051893b156109de57604051630efe6a8b60e01b81523060048201526024810191909152604481018590528581606481838e5af18015610a1a579086939291613960575b50604080516318852af560e31b81528351600482015260208401516024820152908301516001600160a01b039081166044830152606084810151909116606483015260808401516084830152909687906101649082908e8960a48401528a60c48401528160e48401528161010484015230610124840152426101448401525af194851561387357839484978597613916575b50851061387e575b861061376d575b508798509160609391887fe035d6ea43f6dbfe78c29cb35c46d37ba9c6676eac93cee0a46f72ad50f66214969499979899511490505f1461376857915b60405192835260208301526040820152a29082915f8080613540565b61374c565b6020613795849b83516040519d8e80948193635323fe1560e11b835230903060048501613b84565b03925af190811561387357899a849a98999a9261380e575b507fe035d6ea43f6dbfe78c29cb35c46d37ba9c6676eac93cee0a46f72ad50f6621496949282826137e560609997958c955130614908565b51845260076020526137fc60408520918254612ef7565b9055929496505091939796959761370f565b975094929050602095939195873d60201161386b575b8161383160209383612dc6565b81010312610978579551899693959294919392917fe035d6ea43f6dbfe78c29cb35c46d37ba9c6676eac93cee0a46f72ad50f662146137ad565b3d9150613824565b6040513d85823e3d90fd5b8360206138a68d8651604051948580948193635323fe1560e11b835230903060048501613b84565b03925af19081156109be5785916138e4575b506138c581855130614908565b8351855260076020526138dd60408620918254612ef7565b9055613708565b90506020813d60201161390e575b816138ff60209383612dc6565b8101031261097857515f6138b8565b3d91506138f2565b9550955095506060843d606011613958575b8161393560609383612dc6565b810103126139545783519560406020860151950151969496955f613700565b8280fd5b3d9150613928565b8361396e9194929394612dc6565b61397b579084915f61366e565b8480fd5b61398c9194505f90612dc6565b5f925f613625565b916135bd565b6302f33c2b60e31b5f5260045ffd5b5080151561354f565b5081151561353b565b90508401355f6134f0565b959493929190601f198416815f5260205f20905f5b818110613a3e57509160609493917f17b8c412a1cea43243c38f500086d0f3592bdcab32ceb23615f752c9c4f6392197989987809510613a25575b5050600183811b019055613503565b8501355f19600386901b60f8161c191690555f80613a16565b8986013583556020998a01998e99508f9850600190930192016139db565b91939550809294505f5260205f20601f860160051c81019160208710613aad575b918b959391601f8c9896940160051c01905b818110613a9c57506134b2565b5f81558b97508c9650600101613a8f565b9091508190613a7d565b638fc6f59b60e01b5f5260045ffd5b631b68fd9560e21b5f5260045ffd5b63ffe25d7160e01b5f5260045ffd5b8181029291811591840414171561216d57565b90816020910312610978575180151581036109785790565b92610120949197969592613b608561014081019a60808091805184526020810151602085015260018060a01b03604082015116604085015260018060a01b0360608201511660608501520151910152565b60a085015260c0840152151560e08301526001600160a01b03166101008201520152565b6001600160a01b0391821681526020810192909252909116604082015260600190565b8115613bb1570490565b634e487b7160e01b5f52601260045260245ffd5b91906014602b6132db926040519481869260208401986a504d41524b45543a59455360a81b8a52858501378201906bffffffffffffffffffffffff199060601b16838201520301600b19810184520182612dc6565b61034052610320525f6102e0525f6102c0525f6102a0525f610280525f610260525f610240525f610220525f610200525f610300525f6101e0525f6101c0525f6101a0525f610180525f610160525f61014052600554610100526101005161034051101561401c57613c926103205161034051612eea565b6101205261010051610120511161400f575b613cb46103405161012051612ef7565b60e052613cc260e051612fad565b6102e052613cd160e051612fad565b6102c052613ce060e051612fad565b6102a052613cef60e051612fad565b61028052613cfe60e051612fad565b61026052613d0d60e051612fad565b61024052613d1c60e051612fad565b61022052613d2b60e051612fad565b61020052613d3a60e051612f95565b613d476040519182612dc6565b60e0518152601f19613d5a60e051612f95565b015f5b818110613ffe5750508061030052613d7660e051612fad565b6101e052613d8560e051612fad565b6101c052613d9460e051612fad565b6101a052613da360e051612fad565b61018052613db260e051612fad565b61016052613dc160e051612fad565b610140525f60c0525b60e05160c05103613def575061010051610120511015613deb576101205190565b5f90565b613e016130ad60c05161034051612eea565b90549060031b1c60a05260a0515f52600660205260405f2060a051613e2b60c0516102e051612fed565b5260a0515f52600760205260405f2054613e4a60c0516102c051612fed565b52613e5660a0516132af565b90815f52600760205260405f2054613e7360c0516102a051612fed565b52600281549160018060a01b038316613e9160c05161028051612fed565b52613ea160c05161026051612fed565b60ff8460a01c1615159052613ebb60c05161024051612fed565b60ff8460a81c16151590526001810154613eda60c05161022051612fed565b520154613eec60c05161020051612fed565b5260a0515f526008602052613f0360405f20612de8565b613f0f60c05185612fed565b52613f1c60c05184612fed565b508060b81c613f3060c0516101e051612fed565b52613f4060c0516101c051612fed565b60b082901c60ff16151590526001600160a01b0316613f6e575b50613f6660c051612fdf565b60c052613dca565b60a051613f7f9161046890826141c4565b613f8e60c05161018051612fed565b52613f9e60c0516101a051612fed565b52613fae60c05161018051612fed565b51613fbe60c05161016051612fed565b52613fe8613fd160c0516101a051612fed565b51613fe160c05161018051612fed565b5190612eea565b613ff760c05161014051612fed565b525f613f5a565b806060602080938601015201613d5d565b6101005161012052613ca4565b60405190602061402c8184612dc6565b5f83525f368137604051926140418285612dc6565b5f84525f368137604051936140568386612dc6565b5f85525f3681376040519461406b8487612dc6565b5f86525f36813760405161407f8582612dc6565b5f81525f3681376040516140938682612dc6565b5f81525f368137604051906140a88783612dc6565b5f82525f368137604051926140bd8885612dc6565b5f84525f368137604051996140d2898c612dc6565b5f8b52601f1989015f5b8181106141b55750509188999a9391899897969593604051966140ff8b89612dc6565b5f808952368137604051986141148c8b612dc6565b5f808b523681376040519a6141298d8d612dc6565b5f808d523681376040519c61413e908e612dc6565b5f808e523681376040519d8e6141548282612dc6565b5f9052365f908137506040519e8f61416c8282612dc6565b5f905250365f9081376102e0526102c0526102a0526102805261026052610240526102205261020052610300526101e0526101c0526101a0526101805261016052610140525f90565b60608d82018c01528a016140dc565b5f60806040516141d381612daa565b82815282602082015282604082015282606082015201528181105f1461421f57905b6040519161420283612daa565b82526020820152306040820152306060820152600a608082015290565b6141f5565b80519060208101519060018060a01b0360408201511690608060018060a01b0360608301511691015191604051936020850195865260408501526060840152608083015260a082015260a081526132db60c082612dc6565b919061428783614224565b6040516315895f4760e31b815260048101919091529060e0826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa938415612116575f925f95614306575b5051036142f6576001600160701b03809116921690565b6001600160701b03928316921690565b90945061432391925060e03d60e011612a9057612a788183612dc6565b5050505050919091935f6142df565b91908215612f58578261434491613ae4565b91612710830292808404612710149015171561216d5761436391612ef7565b6127069081810291818304149015171561216d5761438091613ba7565b6001810180911161216d5790565b919082156143e157826143a091613ae4565b91612710830292808404612710149015171561216d576143bf91612ef7565b916127100391612710831161216d57614380926143db91613ae4565b90613ba7565b505050505f90565b61447790614472612f4f949361446861440b6144058386612eea565b83614a45565b9161444461443d61444a8960011c61444461443d61443661442f600a8d8a8761438e565b938c612ef7565b9287612eea565b8092612eea565b90614a45565b966144628a61445c600a84888461438e565b92612ef7565b93612eea565b9260021b90612eea565b612eea565b906146d6565b9092915f93825f52600360205260405f20604051906060820182811067ffffffffffffffff8211176122c257604052549063ffffffff82169485825261ffff8360201c169561ffff602084019488865260301c16604084019781895282171715614681576145ba575b50505061ffff8351166144f857505050565b8161450291612eea565b908161450d57505050565b81670de0b6b3a764000082969495960291670de0b6b3a764000081840414901517021561274d57046706f05b59d3b2000081111561458e576706f05b59d3b1ffff19810190811161216d5761ffff6706f05b59d3b2000091935b51168381029381850414901517021561274d576706f05b59d3b20000612f4f920490612eea565b6706f05b59d3b20000036706f05b59d3b20000811161216d5761ffff6706f05b59d3b200009193614567565b5f9081526006602052604090208151905493979360b81c9063ffffffff1681811061466357506001600160481b035f5b1690421061460e5750509061ffff61460492511690612eea565b935b5f80806144e6565b809793979291924211614624575b505050614606565b9163ffffffff61464b6146549361ffff61464361465a989c9742612ef7565b915116613ae4565b91511690613ba7565b90612eea565b935f808061461c565b81036001600160481b03811161216d576001600160481b03906145ea565b505f9750505050505050565b8181029181159183041417612710021561274d57612710808204910615150190565b61271061272782029161272781840414901517021561274d57612710808204910615150190565b81810291811591830414176753444835ec580000021561274d576753444835ec580000808204910615150190565b916127069283810293818504149015171561216d576147239083613ae4565b90612710810290808204612710149015171561216d57612f4f926143db91612eea565b9091926127100390612710821161216d576147239161476491613ae4565b9283613ae4565b906147768183612eea565b90670de0b6b3a764000081029082670de0b6b3a764000082840414821517021561274d578460011c916147ca6147c36147bc6147b5600a868a89614746565b9588612eea565b9484612ef7565b8094612eea565b9485670de0b6b3a7640000850294670de0b6b3a764000081870414901517021561274d576148128161480c89614806600a886148199784614746565b92612eea565b94612ef7565b8093612eea565b9384670de0b6b3a7640000840293670de0b6b3a764000081860414901517021561274d576753444835ec5800009561485c956144729404940460021b9104612eea565b918281029281840414901517021561274d576753444835ec580000900490565b612f4f9291614472614477926144686148986144058584612eea565b916144446148bc61444a8960011c6144446148bc61443661442f600a8d8a8761438e565b9182612eea565b5f516020614a6d5f395f51905f526149035f9294939460018060a01b031693848452600160205260408420868552602052604084206102a7828254612eea565b0390a4565b915f516020614a6d5f395f51905f526149035f939460018060a01b031692838552600160205260408520868652602052604085206102a7828254612ef7565b805f52600760205260405f2054305f52600160205260405f20825f5260205260405f205490039060018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165f52600160205260405f20905f5260205260405f2054900390565b6149bc8282612eea565b90670de0b6b3a764000081029082670de0b6b3a764000082840414821517021561274d578460011c91614a026149fb6147bc6147b5600a868a89614746565b9384612eea565b9485670de0b6b3a7640000850294670de0b6b3a764000081870414901517021561274d57614a3e8161480c89614806600a886148199784614746565b9283612eea565b81670de0b6b3a7640000820291670de0b6b3a764000081840414901517021561274d57049056fe1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c42200000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce37

Deployed Bytecode

0x610360806040526004361015610013575f80fd5b5f905f3560e01c908162ad800c14612b3057508062fdd58e14612aec57806301ffc9a714612a97578063068bcd8d14612975578063095bcdb6146128565780630f4016b01461276c57806316ac2b901461264a578063181c7f661461262c5780631e937fc214612458578063399f1a12146123aa5780634076ac511461238c578063426a8493146123125780634d5e9db0146122d65780634e41a1fb1461226a5780634e441bda1461220d5780634efef1d014611eb657806352a34b0514611c4c57806352d84d1e14611c12578063558a729714611b8257806359152b8214611b35578063598af9e714611add5780636ddb76f114611a985780637f8b182114611a4f57806380968d48146117ea5780638743a669146117a55780639595636914611350578063ae4180951461123b578063b0953d671461120c578063b1283e771461118f578063b33aad2d1461112a578063b6363cf2146110d3578063bd85b039146110a9578063bdd305a614610f8c578063c90bd92114610f4f578063ddd5e1b214610d6c578063e6f859e714610d2d578063eb44fdd314610bef578063ec97908214610bd1578063f0cca67b14610af5578063f4d197ac14610629578063fb105091146105a6578063fc78909f146104425763fe99049a146101f6575f80fd5b3461043f57608036600319011261043f5761020f612bde565b610217612bf4565b604435926001600160a01b0390911691606435903084036103d55730331415806103a2575b610393575f516020614a6d5f395f51905f529160406102c1925b6001600160a01b031694338690036102cf575b8581526001602052818120888252602052818120610288848254612ef7565b90558681526001602052818120888252602052206102a7828254612eea565b905560408051338152602081019290925290918291820190565b0390a4602060405160018152f35b30861480610361575b610269578581526020818152828220335f90815291528290205460ff166102695785815260026020908152828220335f908152908252839020898352905281812054836001820161032b575b5050610269565b61033491612ef7565b868252600260205282822060018060a01b0333165f52602052825f20898352602052828220555f83610324565b50337f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b0316146102d8565b631e4ec46b60e01b8352600483fd5b50337f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b0316141561023c565b7f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b03168414610420575b5f516020614a6d5f395f51905f529160406102c192610256565b6001600160a01b038116301461040657631e4ec46b60e01b8352600483fd5b80fd5b503461043f5761045136612c34565b9161046d82610468610462826132af565b826141c4565b61427c565b9390928115158061059d575b80610594575b156105855761048f848684614704565b9261049a8686612eea565b906104a58488612eea565b926104d06104c86104c06104b9898b612ef7565b9687612eea565b968a8a6149b2565b98888361447d565b80610534575b5081526006602052604090206001015494959394610528948181111561052c5750955b604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b0390f35b9050956104f9565b61271001806127101161057157806127108a0299612710818c0414901517021561056457909704966105286104d6565b63ad251c2783526004601cfd5b634e487b7160e01b83526011600452602483fd5b63bb55fd2760e01b8352600483fd5b5084151561047f565b50831515610479565b503461043f57602036600319011261043f5760043561ffff8116809103610625576103e88111610616573382526009602052604082208161ffff198254161790556040519081527ffc0ef2a6f22017eb94ef2ccd5c1e26a73755192f425c5dc589c62105cccaf24c60203392a280f35b6340c0d6e560e11b8252600482fd5b5080fd5b503461043f5761063836612d14565b949193909268929eee149b4bd212685c610ae8573068929eee149b4bd212685d81835260066020526040832080546001600160a01b03811615610ad95760ff8160a01c16159081610acc575b5015610abe578115610aaf57610699836132af565b906106a482856141c4565b976106af858a61427c565b929080151580610aa6575b15610a9757868b5114936106cf818389614704565b998a10610a8857806106e5886106ec938561476b565b928961447d565b80610a3a575b5090600101908154908181115f14610a34575080995b8a10610a2557610753926020926107208c8094612ef7565b905560405163a9059cbb60e01b81526001600160a01b039091166004820152602481019190915291829081906044820190565b0381897f00000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce376001600160a01b03165af18015610a1a576109ed575b50610799838533614908565b8385526007602052604085206107b0848254612ef7565b90556107bd8385306148c3565b8385526007602052604085206107d4848254612eea565b90557f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b031697883b156109de57604051630efe6a8b60e01b815230600482015260248101869052604481018590528681606481838e5af180156109e2579087916109c9575b505061086a9160209160405193849283926338c3f8db60e01b84524291898d309360048801613b0f565b0381888c5af180156109be5761098f575b5060206040518098635323fe1560e11b825281878161089f308a3060048501613b84565b03925af1801561098457849061094d575b6040975080610924575b506108c6858230614908565b835260076020528583206108db858254612ef7565b905585519081528460208201527fe029f26dbcf8c42dd2f352c10214a7fc26773dc62482c6241334a0402ac09a80863392a368929eee149b4bd212685d82519182526020820152f35b61092f818530614908565b8385526007602052610945888620918254612ef7565b90555f6108ba565b506020873d60201161097c575b8161096760209383612dc6565b8101031261097857604096516108b0565b5f80fd5b3d915061095a565b6040513d86823e3d90fd5b6020813d6020116109b6575b816109a860209383612dc6565b81010312610978575161087b565b3d915061099b565b6040513d87823e3d90fd5b816109d391612dc6565b6109de57855f610840565b8580fd5b6040513d89823e3d90fd5b610a0e9060203d602011610a13575b610a068183612dc6565b810190613af7565b61078d565b503d6109fc565b6040513d88823e3d90fd5b63396038e360e21b8852600488fd5b99610708565b61271001908161271011610a745781612710820291612710818404149015170215610a67570460016106f2565b63ad251c2789526004601cfd5b634e487b7160e01b89526011600452602489fd5b63bb55fd2760e01b8952600489fd5b6313b0827d60e31b8852600488fd5b508315156106ba565b6365e52d5160e11b8452600484fd5b62b5f6bf60e41b8452600484fd5b905060b81c42105f610684565b6307db1be560e41b8552600485fd5b63ab143c0683526004601cfd5b503461043f57610b0436612d14565b949193909268929eee149b4bd212685c610ae8573068929eee149b4bd212685d81835260066020526040832080549092906001600160a01b03811615610ad95760ff8160a01c16159081610bc4575b5015610abe578115610aaf57610b68816132af565b92610b7384836141c4565b97610b7e838a61427c565b929080151580610bbb575b15610a9757868b511493610b9e828289614704565b998a10610a885780610bb4886106ec93856149b2565b928761447d565b50831515610b89565b905060b81c42105f610b53565b503461043f578060031936011261043f576020600554604051908152f35b503461043f57602036600319011261043f576004359080818283918585526006602052604085209384549460018060a01b0386169060026001820154910154908989526008602052610c4360408a20612de8565b928a8a5260076020526040808b20549a610c5c8d6132af565b8152600760205220549a81610cf2575b509160ff9391610cbf936040519c8d9c8d5260208d015260408c0152848a60a01c16151560608c0152848a60a81c16151560808c015260a08b015260c08a01526101c060e08a01526101c0890190612bba565b958060b81c61010089015260b01c1615156101208701526101408601526101608501526101808401526101a08301520390f35b909750610cbf929650610d1291955060ff939450610468610462826132af565b958695919491610d228787612eea565b989193509193610c6c565b503461043f57602036600319011261043f57610d586040610528926004358152600860205220612de8565b604051918291602083526020830190612bba565b503461043f57604036600319011261043f57600435610d89612bf4565b9068929eee149b4bd212685c610ae8573068929eee149b4bd212685d80835260066020526040832090815460ff8160a01c1615610f405760a81c60ff1615610f3157915b3384526001602052604084208385526020526040842054918215610f22576002810154670de0b6b3a764000081850291858304140215610f1557670de0b6b3a76400006001910491610e20858733614908565b858752600760205260408720610e37868254612ef7565b905501610e45828254612ef7565b905560405163a9059cbb60e01b81526001600160a01b0383166004820152602481018290529160208380604481010381897f00000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce376001600160a01b03165af1918215610a1a577f9cdcf2f7714cca3508c7f0110b04a90a80a3a8dd0e35de99689db74d28c5383e93604093610ef8575b50825194855260208501526001600160a01b031692a38068929eee149b4bd212685d80f35b610f109060203d602011610a1357610a068183612dc6565b610ed3565b63ad251c2786526004601cfd5b63843f941b60e01b8552600485fd5b610f3a906132af565b91610dcd565b63174b639360e11b8552600485fd5b503461043f57602036600319011261043f576040610f80610f78600435610468610462826132af565b809291612eea565b82519182526020820152f35b503461043f57610f9b36612c34565b610fab82610468610462826132af565b8083929310806110a0575b80611097575b1561108857610fcc818484614332565b92610fd78282612eea565b9061100c610fe58585612ef7565b9382611006610ffe610ff78a84612eea565b9788612eea565b97838361487c565b9861447d565b80611049575b5061052894959650604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b61271096919601968761271011611074575061052894959661106a9161468d565b949350855f611012565b634e487b7160e01b81526011600452602490fd5b63bb55fd2760e01b8552600485fd5b50801515610fbc565b50821515610fb6565b503461043f57602036600319011261043f5760406020916004358152600783522054604051908152f35b503461043f57604036600319011261043f5760406110ef612bde565b916110f8612bf4565b9260018060a01b0316815280602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b503461043f57602036600319011261043f576004358152600660209081526040909120546001600160a01b0381161515908161117f575b81611172575b506040519015158152f35b905060b81c42105f611167565b905060ff8160a01c161590611161565b503461043f57602036600319011261043f57604060e091600435815260066020522080549060026001820154910154906040519260018060a01b038116845260ff8160a01c161515602085015260ff8160a81c161515604085015260ff8160b01c161515606085015260b81c608084015260a083015260c0820152f35b503461043f57602036600319011261043f5760ff60406020926004358152600484522054166040519015158152f35b503461043f57602036600319011261043f5760043568929eee149b4bd212685c611343573068929eee149b4bd212685d80825260066020526040822080546001600160a01b0381168015610ad95733036113345760ff8160b01c16156113255760ff8160a01c166113165760b81c4210156113085780546001600160b81b03164260b81b6001600160b81b031916179055604051904282527f785f63ccac8ab83aff1730b2462e4c5437bf3b1dbc6f8c243a20e3efb9af9d5260203393a38068929eee149b4bd212685d80f35b62b5f6bf60e41b8352600483fd5b6355e8cb5f60e01b8452600484fd5b6374c77f3b60e01b8452600484fd5b632b910d6d60e11b8452600484fd5b63ab143c0682526004601cfd5b503461043f5761135f36612d14565b939094919268929eee149b4bd212685c610ae8573068929eee149b4bd212685d81835260066020526040832080546001600160a01b03811615610ad95760ff8160a01c16159081611798575b5015610abe578115610aaf576113c0836132af565b6113ca81856141c4565b916113d5858461427c565b9190978815158061178f575b15610a97578886101561178057838551149a6113fe8a8589614332565b8181116117715761140e816146af565b906005820180921161175d57816003820180921161174957908061145294939210611741575b50818111156117395750935b61144b88828d6143e9565b9a8961447d565b80611717575b508815610a25578811611708576040516323b872dd60e01b8152336004820152306024820152604481018990526020816064818b6001600160a01b037f00000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce37165af180156116e05790600192916116eb575b50016114d5888254612eea565b90556114e28183306148c3565b8186526007602052604086206114f9828254612eea565b90557f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b031692833b156116dc57604051630efe6a8b60e01b81523060048201526024810184905260448101839052878160648183895af180156116e0576116c7575b509860209161158d8a9b60409b9a9b519a8b9485946338c3f8db60e01b86528a429460048801613b0f565b038188865af19586156109be578596611693575b5060206040518093635323fe1560e11b82528188816115c530883060048501613b84565b03925af19182156109be57859261165e575b506040978289927fedba86fd2b22962d534e70ad9b0ff8730de46f636146f2bab6a72cbb1ebbcc5394611635575b50508151938452602084018890526001600160a01b031692a368929eee149b4bd212685d82519182526020820152f35b611640828230614908565b87526007602052611655838820918254612ef7565b90555f80611605565b9091506020813d60201161168b575b8161167a60209383612dc6565b8101031261097857519060406115d7565b3d915061166d565b9095506020813d6020116116bf575b816116af60209383612dc6565b810103126109785751945f6115a1565b3d91506116a2565b6116d2888092612dc6565b6116dc575f611562565b8680fd5b6040513d8a823e3d90fd5b6117039060203d602011610a1357610a068183612dc6565b6114c8565b63396038e360e21b8752600487fd5b61271099919901908161271011610a7457906117329161468d565b975f611458565b905093611440565b90505f611434565b634e487b7160e01b8c52601160045260248cfd5b634e487b7160e01b8b52601160045260248bfd5b638e6e832560e01b8a5260048afd5b63bb55fd2760e01b8852600488fd5b508215156113e1565b905060b81c42105f6113ab565b503461043f578060031936011261043f576040517f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b03168152602090f35b503461043f576118026117fc36612c34565b90613c1a565b6101405161016051610180516101a0516101c0516101e05196610300516102005161022051610240516102605161028051906118876102a0516118756102c0516118636102e051604051608052610200608051526102006080510190612cac565b90608051820360206080510152612cac565b90608051820360406080510152612cac565b60805181036060608051015260208084519283815201930190885b818110611a30575050506118f1926118cd6119039695936118df936080518203608080510152612cdf565b90608051820360a06080510152612cdf565b90608051820360c06080510152612cac565b90608051820360e06080510152612cac565b60805181036101006080510152815180825260208201916020808360051b83010194019285915b838310611a00575050505050608051810361012060805101526020808a5192838152019901915b8181106119e157505050916119956119a8926119826119ce98996119bb979660805182036101406080510152612cdf565b9060805182036101606080510152612cac565b9060805182036101806080510152612cac565b9060805182036101a06080510152612cac565b9060805182036101c06080510152612cac565b906101e060805101526080519003608051f35b82516001600160481b03168a526020998a019990920191600101611951565b909192939594602080611a1f600193601f198682030187528a51612bba565b97980195949190910192019061192a565b82516001600160a01b03168552602094850194909201916001016118a2565b503461043f57602036600319011261043f57604060609160043581526003602052205461ffff6040519163ffffffff81168352818160201c16602084015260301c166040820152f35b503461043f578060031936011261043f576040517f00000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce376001600160a01b03168152602090f35b503461043f57606036600319011261043f576040602091611afc612bde565b611b04612bf4565b6001600160a01b0391821683526002855283832091165f908152908452829020604435825283522054604051908152f35b503461043f57604036600319011261043f576004359067ffffffffffffffff821161043f576020611b7a611b6c3660048601612c4a565b611b74612bf4565b91613bc5565b604051908152f35b503461043f57604036600319011261043f57611b9c612bde565b6040611ba6612c9d565b92338152806020522060018060a01b0382165f5260205260405f209115159160ff1981541660ff841617905560405191825260018060a01b0316907fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa26760203392a3602060405160018152f35b503461043f57602036600319011261043f576004359060055482101561043f576020611c3d83612d46565b90549060031b1c604051908152f35b503461043f57604036600319011261043f57600435611c69612c9d565b68929eee149b4bd212685c610ae8573068929eee149b4bd212685d818352600660205260408320805482906001600160a01b038116908115611ea757813303611e985760ff8160a01c16611e895760b81c4210611e7a57808652600960205261ffff60408720541680611de6575b5050611ce2846132af565b90611cf5611cef86614947565b92614947565b9015611dc757811580611dbe575b611db6575b8315611daf57505b8015611da057600182015481670de0b6b3a7640000820291670de0b6b3a7640000818404149015170215610f1557046002820155805461ffff60a01b191682151560a81b60ff60a81b1617600160a01b1790557fe940c2f4a2e1dda6ea582b576e35520a2ec6b80e436c26962c1150ddd7d07993906020906040519015158152a28068929eee149b4bd212685d80f35b63338aa79560e21b8552600485fd5b9050611d10565b859350611d08565b50801515611d03565b801580611ddd575b15611d085760019350611d08565b50811515611dcf565b6001840191612710611dfa84549384613ae4565b049081611e09575b5050611cd7565b611e199361072083602095612ef7565b0381897f00000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce376001600160a01b03165af18015610a1a57611e5b575b808080611e02565b611e739060203d602011610a1357610a068183612dc6565b505f611e53565b63a8a9eb6960e01b8652600486fd5b6336ab81e160e11b8752600487fd5b632b910d6d60e11b8752600487fd5b6307db1be560e41b8752600487fd5b503461097857611ec536612d14565b949193909268929eee149b4bd212685c612200573068929eee149b4bd212685d5f82815260066020526040902080546001600160a01b038116156121f15760ff8160a01c161590816121e4575b50156121d65781156121c757611f27836132af565b92611f3284826141c4565b95611f3d828861427c565b939098891515806121be575b156121af57848610156121a0578389511492611f66868c89614332565b9581871161219157611f77876146af565b966005880180981161216d5787906003810180911161216d5782611fbc948f9a93838d94611fb59610612189575b508181111561218157509961487c565b9b8661447d565b8061214d575b50891561213e57891161213e576040516323b872dd60e01b8152336004820152306024820152604481018a9052906020826064815f6001600160a01b037f00000000000000000000000097401d48a80b15bc7291599e24b590eedcd7ce37165af191821561211657600192612121575b500161203f898254612eea565b905561204c8383306148c3565b815f52600760205260405f20612063848254612eea565b90557f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b031692833b1561097857604051630efe6a8b60e01b81523060048201526024810184905260448101829052975f8960648183895af1988915612116578b996120f7575b509061158d602093926040519a8b9485946338c3f8db60e01b86528a429460048801613b0f565b602093929198505f61210891612dc6565b61158d5f98919293506120d0565b6040513d5f823e3d90fd5b6121399060203d602011610a1357610a068183612dc6565b612032565b63396038e360e21b5f5260045ffd5b6127109a919a01806127101161216d576121669161468d565b985f611fc2565b634e487b7160e01b5f52601160045260245ffd5b90509961487c565b90505f611fa5565b638e6e832560e01b5f5260045ffd5b63bb55fd2760e01b5f5260045ffd5b6313b0827d60e31b5f5260045ffd5b50841515611f49565b6365e52d5160e11b5f5260045ffd5b62b5f6bf60e41b5f5260045ffd5b905060b81c42105f611f12565b6307db1be560e41b5f5260045ffd5b63ab143c065f526004601cfd5b346109785760c03660031901126109785760043567ffffffffffffffff811161097857610f806122436040923690600401612c4a565b9061224c612bf4565b612254612c78565b61225c612c8e565b9160a43594608435946132e1565b3461097857602036600319011261097857604051604081019080821067ffffffffffffffff8311176122c25761052891604052600481526350414d4d60e01b6020820152604051918291602083526020830190612bba565b634e487b7160e01b5f52604160045260245ffd5b34610978576020366003190112610978576001600160a01b036122f7612bde565b165f526009602052602061ffff60405f205416604051908152f35b346109785761232036612c0a565b9091335f52600260205260405f2060018060a01b0382165f5260205260405f20835f526020528160405f205560405191825260018060a01b0316907fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a760203392a4602060405160018152f35b34610978576020366003190112610978576020611b7a6004356132af565b34610978576124246123fa61243261244e6124086124406124166123d66123d036612c0a565b91613001565b9b9660409e95929893969e9a919a519e8f9e8f926101008452610100840190612cac565b916020818403910152612cac565b8c810360408e015290612cac565b908a820360608c0152612cac565b9088820360808a0152612cac565b9086820360a0880152612cdf565b9084820360c0860152612cdf565b9060e08301520390f35b34610978576101203660031901126109785760043567ffffffffffffffff81116109785761248a903690600401612c4a565b612492612bf4565b9061249b612c78565b926124a4612c8e565b60603660c319011261097857846124c29460a43594608435946132e1565b916107d061ffff6124d1612f5f565b16118015612616575b6125e45763ffffffff6124eb612f82565b16159081156125f3575b50156125e457805f52600360205260405f2063ffffffff612514612f82565b1681549065ffff00000000612527612f5f565b60201b169067ffff00000000000061253d612f70565b60301b169267ffffffffffffffff19161717179055805f52600460205260405f20600160ff198254161790556040519160c43563ffffffff811680910361097857835260e43561ffff81168091036109785760208401526101043561ffff8116809103610978577f03cac222e77965d762368408cf9b2c5bd188fa9d139ee2b0a48dad1fcba6491e608085859360408098015260016060820152a282519182526020820152f35b634f8664a960e01b5f5260045ffd5b905063ffffffff6001600160481b0361260a612f82565b921691161115836124f5565b506107d061ffff612625612f70565b16116124da565b34610978576020366003190112610978576020611b7a600435612f04565b346109785761265836612c34565b9061266981610468610462826132af565b9280151580612763575b8061275a575b156121a057612689848383614704565b926126948584612eea565b61269e8385612eea565b916126c9876126c26126ba6126b38a84612ef7565b8097612eea565b96828961476b565b968361447d565b8061271e575b505f90815260066020526040902060010154610528948181111561052c575095604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b61271001806127101161216d578061271087029661271081890414901517021561274d576105289504946126cf565b63ad251c275f526004601cfd5b50831515612679565b50811515612673565b346109785761277a36612c34565b9061278b81610468610462826132af565b928181108061284d575b80612844575b156121a0576127ab828583614332565b916127b68582612eea565b6127e3866127c48585612ef7565b936127dd6127d56126b38985612eea565b9683836143e9565b9761447d565b8061281f575b50610528939495604051968796879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b6127109594950193846127101161216d576105289461283d9161468d565b94936127e9565b5083151561279b565b50811515612795565b346109785761286436612c0a565b90916001600160a01b031690308203612936573033141580612903575b6128f4575b335f52600160205260405f20835f5260205260405f206128a7828254612ef7565b9055815f52600160205260405f20835f5260205260405f206128ca828254612eea565b9055604080513380825260208201939093525f516020614a6d5f395f51905f5291819081016102c1565b631e4ec46b60e01b5f5260045ffd5b50337f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b03161415612881565b7f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b0316820361288657631e4ec46b60e01b5f5260045ffd5b3461097857602036600319011261097857600435612995610462826132af565b61299e81614224565b6040516315895f4760e31b81526004810182905290919060e0816024817f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b03165afa9081156121165760c0945f5f905f925f945f96612a52575b5063ffffffff94959651145f14612a40576001600160701b0391821691165b60405196875260208701526040860152166060840152608083015260a0820152f35b6001600160701b039081169116612a1e565b925094505063ffffffff9250612a80915060e03d60e011612a90575b612a788183612dc6565b810190612e9c565b97909693959390925090506129ff565b503d612a6e565b346109785760203660031901126109785760043563ffffffff60e01b8116809103610978576020906301ffc9a760e01b8114908115612adb57506040519015158152f35b630f632fb360e01b14905082611167565b34610978576040366003190112610978576001600160a01b03612b0d612bde565b165f52600160205260405f206024355f52602052602060405f2054604051908152f35b34610978576020366003190112610978576080810160a082016040525f8152600a600435915b5f190191603082820601835304908115612b7257600a90612b56565b61052890610d58602585608084601f19810192030181526040519384916450414d4d2d60d81b60208401525180918484015e81015f838201520301601f198101835282612dc6565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361097857565b602435906001600160a01b038216820361097857565b6060906003190112610978576004356001600160a01b038116810361097857906024359060443590565b6040906003190112610978576004359060243590565b9181601f840112156109785782359167ffffffffffffffff8311610978576020838186019501011161097857565b604435906001600160481b038216820361097857565b60643590811515820361097857565b60243590811515820361097857565b90602080835192838152019201905f5b818110612cc95750505090565b8251845260209384019390920191600101612cbc565b90602080835192838152019201905f5b818110612cfc5750505090565b82511515845260209384019390920191600101612cef565b60a090600319011261097857600435906024359060443590606435906084356001600160a01b03811681036109785790565b600554811015612d5e5760055f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b90600182811c92168015612da0575b6020831014612d8c57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691612d81565b60a0810190811067ffffffffffffffff8211176122c257604052565b90601f8019910116810190811067ffffffffffffffff8211176122c257604052565b9060405191825f825492612dfb84612d72565b8084529360018116908115612e665750600114612e22575b50612e2092500383612dc6565b565b90505f9291925260205f20905f915b818310612e4a575050906020612e20928201015f612e13565b6020919350806001915483858901015201910190918492612e31565b905060209250612e2094915060ff191682840152151560051b8201015f612e13565b51906001600160701b038216820361097857565b908160e091031261097857612eb081612e88565b91612ebd60208301612e88565b91604081015163ffffffff81168103610978579160608201519160808101519160c060a083015192015190565b9190820180921161216d57565b9190820391821161216d57565b5f8181526006602052604090208054906001600160a01b03821615612f585760ff8260a01c1615612f58576002015415612f525760a81c60ff1615612f465790565b612f4f906132af565b90565b50505f90565b5050505f90565b60e43561ffff811681036109785790565b6101043561ffff811681036109785790565b60c43563ffffffff811681036109785790565b67ffffffffffffffff81116122c25760051b60200190565b90612fb782612f95565b612fc46040519182612dc6565b8281528092612fd5601f1991612f95565b0190602036910137565b5f19811461216d5760010190565b8051821015612d5e5760209160051b010190565b90929160055490818510156132095761301a9085612eea565b91818311613200575b61302d8584612ef7565b9061303782612fad565b9561304183612fad565b9561304b84612fad565b9561305585612fad565b9561305f86612fad565b9561306981612fad565b9561307382612fad565b958c5f8d8c8e5b87840361309957505050505050505081105f146130945790565b505f90565b613121848093816130b26130ad828c612eea565b612d46565b90549060031b1c966130e66130c6896132af565b9283928a5f5260066020528a6130e08360405f209f612fed565b52612fed565b526001600160a01b038b165f90815260016020908152604080832099835298905287812054918152969096205494859487916130e091612fed565b528354938c6131378560ff8860a01c1692612fed565b811580159091526001600160a01b038716151590816131f8575b508d86826131ea575b61316391612fed565b9015159052613184575b50505061317a9150612fdf565b8d908d8c8e61307a565b600201549360a81c60ff16156131e357505b826131b6575061317a91505f5b6131ad828d612fed565b525f808061316d565b8281029281159184041417670de0b6b3a7640000021561274d57670de0b6b3a764000061317a92046131a3565b9050613196565b60b889901c4210925061315a565b90505f613151565b91508091613023565b505050905060206040519061321e8183612dc6565b5f82525f368137604051926132338285612dc6565b5f84525f368137604051926132488385612dc6565b5f84525f3681376040519261325d8185612dc6565b5f84525f368137604051926132728285612dc6565b5f84525f368137604051926132878385612dc6565b5f84525f3681376040519261329c8185612dc6565b5f8452505f368137969594939291905f90565b604051602081019169504d41524b45543a4e4f60b01b8352602a820152602a81526132db604a82612dc6565b51902090565b949693959190926001600160481b03169442861115613ad5575f936001600160a01b038316928315613ac657613318908284613bc5565b97613322896132af565b5f8a8152600660205260409020549098906001600160a01b0316613ab7576040519160e083019083821067ffffffffffffffff8311176122c25761343d6001600160481b036002948e9460405289875260208701935f855261340c604089015f815260608a01921515835260808a0193845260a08a01965f885260c08b01985f8a525f52600660205260405f209a60018060a01b039051166bffffffffffffffffffffffff60a01b8c5416178b555115158a549060ff60a01b9060a01b169060ff60a01b1916178a55511515899081549060ff60a81b90151560a81b169060ff60a81b1916179055565b51875491516001600160b01b0390921690151560b01b60ff60b01b1617911660b81b6001600160b81b031916178555565b51600184015551910155600554680100000000000000008110156122c25780600161346b9201600555612d46565b81549060031b908a821b915f19901b1916179055875f52600860205260405f209167ffffffffffffffff82116122c2578793836134a98b9554612d72565b601f8111613a5c575b505f601f85116001146139c65793606092819492827f17b8c412a1cea43243c38f500086d0f3592bdcab32ceb23615f752c9c4f63921975f916139bb575b508360011b905f198560031b1c19161790555b60405194859360408552816040860152858501375f8383018501526020830152601f01601f19168101030190a38515801580916139b2575b613549575b50505090919250565b806139a9575b1561399a5761355d856132af565b9061356882876141c4565b916135748888306148c3565b865f52600760205260405f2061358b898254612eea565b90556135988282306148c3565b5f52600760205260405f206135ae828254612eea565b90558151968688036139945790915b7f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b031697883b1561097857604051630efe6a8b60e01b81523060048201526024810191909152604481018390525f81606481838d5af180156121165761397f575b50602081018051893b156109de57604051630efe6a8b60e01b81523060048201526024810191909152604481018590528581606481838e5af18015610a1a579086939291613960575b50604080516318852af560e31b81528351600482015260208401516024820152908301516001600160a01b039081166044830152606084810151909116606483015260808401516084830152909687906101649082908e8960a48401528a60c48401528160e48401528161010484015230610124840152426101448401525af194851561387357839484978597613916575b50851061387e575b861061376d575b508798509160609391887fe035d6ea43f6dbfe78c29cb35c46d37ba9c6676eac93cee0a46f72ad50f66214969499979899511490505f1461376857915b60405192835260208301526040820152a29082915f8080613540565b61374c565b6020613795849b83516040519d8e80948193635323fe1560e11b835230903060048501613b84565b03925af190811561387357899a849a98999a9261380e575b507fe035d6ea43f6dbfe78c29cb35c46d37ba9c6676eac93cee0a46f72ad50f6621496949282826137e560609997958c955130614908565b51845260076020526137fc60408520918254612ef7565b9055929496505091939796959761370f565b975094929050602095939195873d60201161386b575b8161383160209383612dc6565b81010312610978579551899693959294919392917fe035d6ea43f6dbfe78c29cb35c46d37ba9c6676eac93cee0a46f72ad50f662146137ad565b3d9150613824565b6040513d85823e3d90fd5b8360206138a68d8651604051948580948193635323fe1560e11b835230903060048501613b84565b03925af19081156109be5785916138e4575b506138c581855130614908565b8351855260076020526138dd60408620918254612ef7565b9055613708565b90506020813d60201161390e575b816138ff60209383612dc6565b8101031261097857515f6138b8565b3d91506138f2565b9550955095506060843d606011613958575b8161393560609383612dc6565b810103126139545783519560406020860151950151969496955f613700565b8280fd5b3d9150613928565b8361396e9194929394612dc6565b61397b579084915f61366e565b8480fd5b61398c9194505f90612dc6565b5f925f613625565b916135bd565b6302f33c2b60e31b5f5260045ffd5b5080151561354f565b5081151561353b565b90508401355f6134f0565b959493929190601f198416815f5260205f20905f5b818110613a3e57509160609493917f17b8c412a1cea43243c38f500086d0f3592bdcab32ceb23615f752c9c4f6392197989987809510613a25575b5050600183811b019055613503565b8501355f19600386901b60f8161c191690555f80613a16565b8986013583556020998a01998e99508f9850600190930192016139db565b91939550809294505f5260205f20601f860160051c81019160208710613aad575b918b959391601f8c9896940160051c01905b818110613a9c57506134b2565b5f81558b97508c9650600101613a8f565b9091508190613a7d565b638fc6f59b60e01b5f5260045ffd5b631b68fd9560e21b5f5260045ffd5b63ffe25d7160e01b5f5260045ffd5b8181029291811591840414171561216d57565b90816020910312610978575180151581036109785790565b92610120949197969592613b608561014081019a60808091805184526020810151602085015260018060a01b03604082015116604085015260018060a01b0360608201511660608501520151910152565b60a085015260c0840152151560e08301526001600160a01b03166101008201520152565b6001600160a01b0391821681526020810192909252909116604082015260600190565b8115613bb1570490565b634e487b7160e01b5f52601260045260245ffd5b91906014602b6132db926040519481869260208401986a504d41524b45543a59455360a81b8a52858501378201906bffffffffffffffffffffffff199060601b16838201520301600b19810184520182612dc6565b61034052610320525f6102e0525f6102c0525f6102a0525f610280525f610260525f610240525f610220525f610200525f610300525f6101e0525f6101c0525f6101a0525f610180525f610160525f61014052600554610100526101005161034051101561401c57613c926103205161034051612eea565b6101205261010051610120511161400f575b613cb46103405161012051612ef7565b60e052613cc260e051612fad565b6102e052613cd160e051612fad565b6102c052613ce060e051612fad565b6102a052613cef60e051612fad565b61028052613cfe60e051612fad565b61026052613d0d60e051612fad565b61024052613d1c60e051612fad565b61022052613d2b60e051612fad565b61020052613d3a60e051612f95565b613d476040519182612dc6565b60e0518152601f19613d5a60e051612f95565b015f5b818110613ffe5750508061030052613d7660e051612fad565b6101e052613d8560e051612fad565b6101c052613d9460e051612fad565b6101a052613da360e051612fad565b61018052613db260e051612fad565b61016052613dc160e051612fad565b610140525f60c0525b60e05160c05103613def575061010051610120511015613deb576101205190565b5f90565b613e016130ad60c05161034051612eea565b90549060031b1c60a05260a0515f52600660205260405f2060a051613e2b60c0516102e051612fed565b5260a0515f52600760205260405f2054613e4a60c0516102c051612fed565b52613e5660a0516132af565b90815f52600760205260405f2054613e7360c0516102a051612fed565b52600281549160018060a01b038316613e9160c05161028051612fed565b52613ea160c05161026051612fed565b60ff8460a01c1615159052613ebb60c05161024051612fed565b60ff8460a81c16151590526001810154613eda60c05161022051612fed565b520154613eec60c05161020051612fed565b5260a0515f526008602052613f0360405f20612de8565b613f0f60c05185612fed565b52613f1c60c05184612fed565b508060b81c613f3060c0516101e051612fed565b52613f4060c0516101c051612fed565b60b082901c60ff16151590526001600160a01b0316613f6e575b50613f6660c051612fdf565b60c052613dca565b60a051613f7f9161046890826141c4565b613f8e60c05161018051612fed565b52613f9e60c0516101a051612fed565b52613fae60c05161018051612fed565b51613fbe60c05161016051612fed565b52613fe8613fd160c0516101a051612fed565b51613fe160c05161018051612fed565b5190612eea565b613ff760c05161014051612fed565b525f613f5a565b806060602080938601015201613d5d565b6101005161012052613ca4565b60405190602061402c8184612dc6565b5f83525f368137604051926140418285612dc6565b5f84525f368137604051936140568386612dc6565b5f85525f3681376040519461406b8487612dc6565b5f86525f36813760405161407f8582612dc6565b5f81525f3681376040516140938682612dc6565b5f81525f368137604051906140a88783612dc6565b5f82525f368137604051926140bd8885612dc6565b5f84525f368137604051996140d2898c612dc6565b5f8b52601f1989015f5b8181106141b55750509188999a9391899897969593604051966140ff8b89612dc6565b5f808952368137604051986141148c8b612dc6565b5f808b523681376040519a6141298d8d612dc6565b5f808d523681376040519c61413e908e612dc6565b5f808e523681376040519d8e6141548282612dc6565b5f9052365f908137506040519e8f61416c8282612dc6565b5f905250365f9081376102e0526102c0526102a0526102805261026052610240526102205261020052610300526101e0526101c0526101a0526101805261016052610140525f90565b60608d82018c01528a016140dc565b5f60806040516141d381612daa565b82815282602082015282604082015282606082015201528181105f1461421f57905b6040519161420283612daa565b82526020820152306040820152306060820152600a608082015290565b6141f5565b80519060208101519060018060a01b0360408201511690608060018060a01b0360608301511691015191604051936020850195865260408501526060840152608083015260a082015260a081526132db60c082612dc6565b919061428783614224565b6040516315895f4760e31b815260048101919091529060e0826024817f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c4226001600160a01b03165afa938415612116575f925f95614306575b5051036142f6576001600160701b03809116921690565b6001600160701b03928316921690565b90945061432391925060e03d60e011612a9057612a788183612dc6565b5050505050919091935f6142df565b91908215612f58578261434491613ae4565b91612710830292808404612710149015171561216d5761436391612ef7565b6127069081810291818304149015171561216d5761438091613ba7565b6001810180911161216d5790565b919082156143e157826143a091613ae4565b91612710830292808404612710149015171561216d576143bf91612ef7565b916127100391612710831161216d57614380926143db91613ae4565b90613ba7565b505050505f90565b61447790614472612f4f949361446861440b6144058386612eea565b83614a45565b9161444461443d61444a8960011c61444461443d61443661442f600a8d8a8761438e565b938c612ef7565b9287612eea565b8092612eea565b90614a45565b966144628a61445c600a84888461438e565b92612ef7565b93612eea565b9260021b90612eea565b612eea565b906146d6565b9092915f93825f52600360205260405f20604051906060820182811067ffffffffffffffff8211176122c257604052549063ffffffff82169485825261ffff8360201c169561ffff602084019488865260301c16604084019781895282171715614681576145ba575b50505061ffff8351166144f857505050565b8161450291612eea565b908161450d57505050565b81670de0b6b3a764000082969495960291670de0b6b3a764000081840414901517021561274d57046706f05b59d3b2000081111561458e576706f05b59d3b1ffff19810190811161216d5761ffff6706f05b59d3b2000091935b51168381029381850414901517021561274d576706f05b59d3b20000612f4f920490612eea565b6706f05b59d3b20000036706f05b59d3b20000811161216d5761ffff6706f05b59d3b200009193614567565b5f9081526006602052604090208151905493979360b81c9063ffffffff1681811061466357506001600160481b035f5b1690421061460e5750509061ffff61460492511690612eea565b935b5f80806144e6565b809793979291924211614624575b505050614606565b9163ffffffff61464b6146549361ffff61464361465a989c9742612ef7565b915116613ae4565b91511690613ba7565b90612eea565b935f808061461c565b81036001600160481b03811161216d576001600160481b03906145ea565b505f9750505050505050565b8181029181159183041417612710021561274d57612710808204910615150190565b61271061272782029161272781840414901517021561274d57612710808204910615150190565b81810291811591830414176753444835ec580000021561274d576753444835ec580000808204910615150190565b916127069283810293818504149015171561216d576147239083613ae4565b90612710810290808204612710149015171561216d57612f4f926143db91612eea565b9091926127100390612710821161216d576147239161476491613ae4565b9283613ae4565b906147768183612eea565b90670de0b6b3a764000081029082670de0b6b3a764000082840414821517021561274d578460011c916147ca6147c36147bc6147b5600a868a89614746565b9588612eea565b9484612ef7565b8094612eea565b9485670de0b6b3a7640000850294670de0b6b3a764000081870414901517021561274d576148128161480c89614806600a886148199784614746565b92612eea565b94612ef7565b8093612eea565b9384670de0b6b3a7640000840293670de0b6b3a764000081860414901517021561274d576753444835ec5800009561485c956144729404940460021b9104612eea565b918281029281840414901517021561274d576753444835ec580000900490565b612f4f9291614472614477926144686148986144058584612eea565b916144446148bc61444a8960011c6144446148bc61443661442f600a8d8a8761438e565b9182612eea565b5f516020614a6d5f395f51905f526149035f9294939460018060a01b031693848452600160205260408420868552602052604084206102a7828254612eea565b0390a4565b915f516020614a6d5f395f51905f526149035f939460018060a01b031692838552600160205260408520868652602052604085206102a7828254612ef7565b805f52600760205260405f2054305f52600160205260405f20825f5260205260405f205490039060018060a01b037f000000000000000000000000e5e5be029793a4481287be2bfc37e2d38316c422165f52600160205260405f20905f5260205260405f2054900390565b6149bc8282612eea565b90670de0b6b3a764000081029082670de0b6b3a764000082840414821517021561274d578460011c91614a026149fb6147bc6147b5600a868a89614746565b9384612eea565b9485670de0b6b3a7640000850294670de0b6b3a764000081870414901517021561274d57614a3e8161480c89614806600a886148199784614746565b9283612eea565b81670de0b6b3a7640000820291670de0b6b3a764000081840414901517021561274d57049056fe1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859

Deployed Bytecode Sourcemap

4125:43686:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;31311:4;31291:25;;31311:4;;;31417:10;:27;;:58;;;31287:484;31413:121;;-1:-1:-1;;;;;;;;;;;31287:484:0;4125:43686;32389:50;31287:484;;-1:-1:-1;;;;;4125:43686:0;;31785:10;:20;;;31781:509;;31287:484;4125:43686;;;;;;;;;;;;;;;;;32300:31;4125:43686;;;32300:31;:::i;:::-;4125:43686;;;;;;;;;;;;;;;;;32341:33;4125:43686;;;32341:33;:::i;:::-;4125:43686;;;;;31785:10;4125:43686;;;;;;;;;;;;;;;;;32389:50;;;;4125:43686;;;;;;;31781:509;31311:4;31906:23;;:54;;;31781:509;;31900:380;4125:43686;;;;;;;;;;31785:10;-1:-1:-1;4125:43686:0;;;;;;;;;;;31781:509;31981:285;4125:43686;;;32058:9;4125:43686;;;;;;;31785:10;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;;46733:557;4125:43686;32117:28;;32113:135;;31981:285;;;31781:509;;32113:135;32209:16;;;:::i;:::-;4125:43686;;;32058:9;4125:43686;;;;;;;;;;31785:10;4125:43686;-1:-1:-1;4125:43686:0;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;32113:135;;;;31906:54;-1:-1:-1;31785:10:0;31955:4;-1:-1:-1;;;;;4125:43686:0;31933:27;31906:54;;31413:121;-1:-1:-1;;;31502:17:0;;4125:43686;30968:17;31502;31417:58;-1:-1:-1;31417:10:0;31470:4;-1:-1:-1;;;;;4125:43686:0;31448:27;;31417:58;;31287:484;31574:4;-1:-1:-1;;;;;4125:43686:0;31554:25;;31550:221;;31287:484;-1:-1:-1;;;;;;;;;;;31287:484:0;4125:43686;32389:50;31287:484;;;31550:221;-1:-1:-1;;;;;4125:43686:0;;31311:4;31675:86;31550:221;31675:86;-1:-1:-1;;;31729:17:0;;4125:43686;30968:17;31729;4125:43686;;;;;;;;;;;:::i;:::-;36899:17;37014:25;36899:17;36953:21;36899:17;;;:::i;:::-;36953:21;;:::i;:::-;37014:25;:::i;:::-;37057:9;;;;;;:21;;;4125:43686;37057:32;;;4125:43686;;;;37135:39;;;;;:::i;:::-;37246:10;;;;;:::i;:::-;37283;;;;;:::i;:::-;37321:13;37503:31;37421:46;37379:16;37321:13;;;;:::i;:::-;37379:16;;;:::i;:::-;37421:46;;;;:::i;:::-;37503:31;;;;:::i;:::-;37552:6;37548:51;;4125:43686;-1:-1:-1;4125:43686:0;;37636:7;4125:43686;;;;;37636:21;;4125:43686;;;;;;;37680:13;;;;;;:29;;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37680:29;;;;;;37548:51;37580:6;5244:2;;37580:6;5244:2;;;48284:217;37580:6;48284:217;;;37580:6;48284:217;;;;;;;;;;;;;;;4125:43686;37548:51;;48284:217;;;;4125:43686;48284:217;;5244:2;-1:-1:-1;;;5244:2:0;;;4125:43686;5244:2;;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;37057:32;37082:7;;;;37057:32;;:21;37070:8;;;;37057:21;;4125:43686;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;27952:5;27945:12;;4125:43686;;27998:10;4125:43686;;27983:14;4125:43686;;;;;;;;;;;;;;;;;;;28030:31;4125:43686;27998:10;28030:31;;4125:43686;;;-1:-1:-1;;;4125:43686:0;;;;;;;;;;;;;;;;;:::i;:::-;47477:225;;;;;;;;;;;;4125:43686;;;23016:7;4125:43686;;;;;;;-1:-1:-1;;;;;4125:43686:0;;23051:24;4125:43686;;;;;;;23112:11;:40;;;;4125:43686;;;;;23187:10;;4125:43686;;23272:17;;;:::i;:::-;23326:21;;;;;:::i;:::-;23388:25;;;;;:::i;:::-;23431:8;;;;;:19;;;4125:43686;;;;;;;23498:16;23611:40;;;;;;:::i;:::-;23669:19;;;4125:43686;;23791:48;;;23875:31;23791:48;;;:::i;:::-;23875:31;;;:::i;:::-;23924:6;23920:51;;4125:43686;24009:5;;;;4125:43686;;;24033:29;:13;;;:29;:13;;;:29;;;;24080:19;;4125:43686;;24189:30;24164:15;4125:43686;24164:15;;;;;;:::i;:::-;4125:43686;;;;-1:-1:-1;;;24189:30:0;;-1:-1:-1;;;;;4125:43686:0;;;;24189:30;;4125:43686;;;;;;;;;;;;;;;;;;24189:30;;4125:43686;;24189:9;-1:-1:-1;;;;;4125:43686:0;24189:30;;;;;;;;24033:29;24300:10;24319:5;24300:10;;;24319:5;:::i;:::-;4125:43686;;;24335:11;4125:43686;;;;;24335:27;4125:43686;;;24335:27;:::i;:::-;4125:43686;;24476:5;47477:225;;;24476:5;:::i;:::-;4125:43686;;;24335:11;4125:43686;;;;;24492:27;4125:43686;;;24492:27;:::i;:::-;4125:43686;;24529:4;-1:-1:-1;;;;;4125:43686:0;;24529:41;;;;;4125:43686;;-1:-1:-1;;;24529:41:0;;47477:225;4125:43686;24529:41;;4125:43686;;;;;;;;;;;;;47477:225;4125:43686;;;47477:225;;24529:41;;;;;;;;;;;24033:29;4125:43686;;24580:211;4125:43686;;;;;;;;;;;;;24580:211;;24766:15;47477:225;;;;24580:211;4125:43686;24580:211;;;:::i;:::-;;;;;;;;;;;;;24033:29;4125:43686;;;;;;;;;24870:65;;47477:225;;;24870:65;47477:225;;;4125:43686;24870:65;;;:::i;:::-;;;;;;;;;;;;;24033:29;4125:43686;24949:11;;;24945:119;;24033:29;47477:225;25184:6;47477:225;;;25184:6;:::i;:::-;4125:43686;;24335:11;4125:43686;;;;;25201:27;4125:43686;;;25201:27;:::i;:::-;4125:43686;;;;;;;;;;;;25244:38;24300:10;;25244:38;;47477:225;47722:81;4125:43686;;;;;;;;;;24945:119;25004:6;47477:225;;;25004:6;:::i;:::-;4125:43686;;;24335:11;4125:43686;;25025:28;4125:43686;;;;;;25025:28;:::i;:::-;4125:43686;;24945:119;;;24870:65;;4125:43686;24870:65;;4125:43686;24870:65;;;;;;4125:43686;24870:65;;;:::i;:::-;;;4125:43686;;;;;;;24870:65;;4125:43686;-1:-1:-1;4125:43686:0;;24870:65;;;-1:-1:-1;24870:65:0;;;4125:43686;;;;;;;;;24580:211;4125:43686;24580:211;;4125:43686;24580:211;;;;;;4125:43686;24580:211;;;:::i;:::-;;;4125:43686;;;;;24580:211;;;;;-1:-1:-1;24580:211:0;;;4125:43686;;;;;;;;;24529:41;;;;;:::i;:::-;4125:43686;;24529:41;;;;4125:43686;;;;24529:41;4125:43686;;;;;;;;;24189:30;;;4125:43686;24189:30;4125:43686;24189:30;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;4125:43686;;;;;;;;;;-1:-1:-1;;;4125:43686:0;;;;;24033:29;;;;23920:51;23952:6;5244:2;;;23952:6;5244:2;;;48284:217;23952:6;48284:217;;;23952:6;48284:217;;;;;;;;;;;;24009:5;23920:51;;48284:217;;;;4125:43686;48284:217;;5244:2;-1:-1:-1;;;5244:2:0;;;4125:43686;5244:2;;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;23431:19;23443:7;;;;23431:19;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;23112:40;4125:43686;;;;23127:15;:25;23112:40;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;47477:225;;;;4125:43686;47477:225;;4125:43686;;;;;;;;:::i;:::-;47477:225;;;;;;;;;;;;4125:43686;;;25569:7;4125:43686;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;25604:24;4125:43686;;;;;;;25665:11;:40;;;;4125:43686;;;;;25740:9;;4125:43686;;25824:17;;;:::i;:::-;25878:21;;;;;:::i;:::-;25940:25;;;;;:::i;:::-;25983:8;;;;;:19;;;4125:43686;;;;;;;26050:15;26161:39;;;;;;:::i;:::-;26218:19;;;4125:43686;;26340:46;;;26422:31;26340:46;;;:::i;:::-;26422:31;;;:::i;25983:19::-;25995:7;;;;25983:19;;25665:40;4125:43686;;;;25680:15;:25;25665:40;;;4125:43686;;;;;;;;;;;;;;32618:10;4125:43686;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;38208:12;38234:11;38259:16;38289;4125:43686;;;;38349:7;4125:43686;;;;;;;;;;;;;;;;38473:5;38505:16;4125:43686;38473:5;;4125:43686;38505:16;;4125:43686;;;;;38538:12;4125:43686;;;;;;;:::i;:::-;;;;;38641:11;4125:43686;;;;;;;38695:17;;;;:::i;:::-;4125:43686;;38641:11;4125:43686;;;;38728:22;;38724:236;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38724:236;38812:17;;;4125:43686;38812:17;;;38858:28;38812:17;;;4125:43686;38812:17;;;38793:37;38812:17;;;:::i;38858:28::-;38844:42;;;;;;38939:10;38844:42;;38939:10;:::i;:::-;38724:236;;;;;;;;4125:43686;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;6140:49;4125:43686;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;:::i;:::-;47477:225;;;;;;;;4125:43686;;;29654:7;4125:43686;;;;;;;;;;;;;;;;;;;;;;;29748:40;;29829:10;4125:43686;;;;;;;;;;;;;;;;;29865:15;;;4125:43686;;29947:16;;;4125:43686;5207:4;48284:217;;;;;;;;;;;;5207:4;4125:43686;48284:217;;29829:10;30003;29829;;;30003;:::i;:::-;4125:43686;;;30024:11;4125:43686;;;;;30024:32;4125:43686;;;30024:32;:::i;:::-;4125:43686;;30067:5;:15;4125:43686;;;30067:15;:::i;:::-;4125:43686;;;;-1:-1:-1;;;30092:30:0;;-1:-1:-1;;;;;4125:43686:0;;;30092:30;;4125:43686;;;;;;;;;;;;;;30092:30;4125:43686;;30092:9;-1:-1:-1;;;;;4125:43686:0;30092:30;;;;;;;30138:38;30092:30;4125:43686;30092:30;;;29748:40;-1:-1:-1;4125:43686:0;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;30138:38;47722:81;47477:225;47722:81;4125:43686;;30092:30;;;4125:43686;30092:30;4125:43686;30092:30;;;;;;;:::i;:::-;;;48284:217;;;;4125:43686;48284:217;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;29748:40;29771:17;;;:::i;:::-;29748:40;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;33169:10;33118:28;4125:43686;;33041:37;33060:17;;;:::i;33118:28::-;33169:10;;;;:::i;:::-;4125:43686;;;;;;;;;;;;;;;;;;:::i;:::-;34808:28;34750:17;34731:37;34750:17;;;:::i;34808:28::-;34854:11;;;;;:23;;;4125:43686;34854:34;;;4125:43686;;;;34933:39;;;;;:::i;:::-;35015:10;;;;;:::i;:::-;35052:11;35270:31;35052:11;;;;:::i;:::-;35091:12;;35187:47;35148:16;35091:12;;;;:::i;:::-;35148:16;;;:::i;:::-;35187:47;;;;:::i;:::-;35270:31;;:::i;:::-;35319:6;35315:63;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35315:63;35359:6;5244:2;;;;;;35359:6;5244:2;;;35339:39;4125:43686;35339:39;;;;;;:::i;:::-;35315:63;;;;;;;5244:2;-1:-1:-1;;;5244:2:0;;;4125:43686;5244:2;;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;34854:34;34881:7;;;;34854:34;;:23;34869:8;;;;34854:23;;4125:43686;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;6085:49;4125:43686;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;431:62;4125:43686;;;;;;-1:-1:-1;4125:43686:0;;;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;32743:7;4125:43686;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;32777:24;;;;:39;;4125:43686;32777:68;;;4125:43686;;;;;;;;;;32777:68;4125:43686;;;;32820:15;:25;32777:68;;;:39;4125:43686;;;;;;;32805:11;32777:39;;;4125:43686;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;6035:44;4125:43686;;;;;6035:44;;4125:43686;6035:44;;4125:43686;6035:44;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;47477:225;;;;;;;4125:43686;;;11813:7;4125:43686;;;;;;;-1:-1:-1;;;;;4125:43686:0;;11848:24;;4125:43686;;11909:10;:24;4125:43686;;;;;;;;;;;;;;;;;;;12060:15;:25;4125:43686;;;;;-1:-1:-1;;;;;4125:43686:0;12060:15;4125:43686;;-1:-1:-1;;;;;;4125:43686:0;;;;;;12060:15;;4125:43686;;12161:45;4125:43686;11909:10;12161:45;;47722:81;47477:225;47722:81;4125:43686;;;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;47477:225;;;;4125:43686;47477:225;;4125:43686;;;;;;;;:::i;:::-;47477:225;;;;;;;;;;;;4125:43686;;;17520:7;4125:43686;;;;;;;-1:-1:-1;;;;;4125:43686:0;;17555:24;4125:43686;;;;;;;17616:11;:40;;;;4125:43686;;;;;17691:11;;4125:43686;;17777:17;;;:::i;:::-;17831:21;;;;:::i;:::-;17893:25;;;;;:::i;:::-;17936:8;;;;;;:19;;;4125:43686;;;;17991:13;;;4125:43686;;;;;;18060:15;18221:71;;;;;;:::i;:::-;18391:20;;;4125:43686;;18553:54;;;:::i;:::-;5244:2;18610:1;5244:2;;;;;;;18530:81;18596:1;5244:2;;;;;;;18625:27;;18928:31;18625:27;;;;18621:60;;4125:43686;-1:-1:-1;18708:23:0;;;;;;:49;;;18843;;;;;:::i;:::-;18928:31;;;:::i;:::-;18977:6;18973:55;;18708:49;19056:10;;;4125:43686;;19129:17;-1:-1:-1;4125:43686:0;;;;-1:-1:-1;;;19176:56:0;;19199:10;4125:43686;19176:56;;4125:43686;47477:225;4125:43686;;;;;;;;;;;;;;;-1:-1:-1;;;;;19176:9:0;4125:43686;19176:56;;;;;;;4125:43686;19176:56;;;;18708:49;19242:5;;:14;4125:43686;;;19242:14;:::i;:::-;4125:43686;;19333:6;47477:225;;;19333:6;:::i;:::-;4125:43686;;;19350:11;4125:43686;;;;;19350:27;4125:43686;;;19350:27;:::i;:::-;4125:43686;;19387:4;-1:-1:-1;;;;;4125:43686:0;;19387:41;;;;;4125:43686;;-1:-1:-1;;;19387:41:0;;47477:225;4125:43686;19387:41;;4125:43686;;;;;;;;;;;;;47477:225;4125:43686;;;47477:225;19387:41;;;;;;;;;18708:49;4125:43686;;;;19530:71;4125:43686;;;;;;;;;;;;;;;19530:71;;19585:15;;19530:71;4125:43686;19530:71;;;:::i;:::-;;;;;;;;;;;;;;;;18708:49;4125:43686;;;;;;;;;19703:64;;47477:225;;;19703:64;47477:225;;;4125:43686;19703:64;;;:::i;:::-;;;;;;;;;;;;;;18708:49;19781:8;4125:43686;19781:8;;;;20002:32;19781:8;19777:108;;18708:49;-1:-1:-1;;4125:43686:0;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;20002:32;47477:225;47722:81;4125:43686;;;;;;;;;;19777:108;19832:3;47477:225;;;19832:3;:::i;:::-;4125:43686;;19350:11;4125:43686;;19850:24;4125:43686;;;;;;19850:24;:::i;:::-;4125:43686;;19777:108;;;;19703:64;;;;4125:43686;19703:64;;4125:43686;19703:64;;;;;;4125:43686;19703:64;;;:::i;:::-;;;4125:43686;;;;;;;19703:64;;;;;-1:-1:-1;19703:64:0;;19530:71;;;;4125:43686;19530:71;;4125:43686;19530:71;;;;;;4125:43686;19530:71;;;:::i;:::-;;;4125:43686;;;;;19530:71;;;;;;;-1:-1:-1;19530:71:0;;19387:41;;;;;;:::i;:::-;4125:43686;;19387:41;;;4125:43686;;;;19387:41;4125:43686;;;;;;;;;19176:56;;;4125:43686;19176:56;4125:43686;19176:56;;;;;;;:::i;:::-;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;18973:55;18572:6;5244:2;;;;;;18572:6;5244:2;;;18993:35;;;;:::i;:::-;18973:55;;;;18708:49;;;;;;18621:60;5244:2;;18621:60;;;5244:2;-1:-1:-1;;;5244:2:0;;;4125:43686;5244:2;;;;;-1:-1:-1;;;5244:2:0;;;4125:43686;5244:2;;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;17936:19;17948:7;;;;17936:19;;17616:40;4125:43686;;;;17631:15;:25;17616:40;;;4125:43686;;;;;;;;;;;;;;;5330:27;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;;;;;46733:557;;;;;;4125:43686;46733:557;4125:43686;;46733:557;;;4125:43686;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;5794:44;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5392:33;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;:::i;:::-;;;:::i;:::-;-1:-1:-1;;;;;4125:43686:0;;;;;569:84;4125:43686;;;;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;:::i;:::-;;;;:::i;:::-;1285:10;;4125:43686;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1285:10;1332:43;4125:43686;1285:10;1332:43;;4125:43686;;;1392:4;4125:43686;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;6002:27;4125:43686;6002:27;;;;;4125:43686;6002:27;;;:::i;:::-;4125:43686;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;:::i;:::-;47477:225;;;;;;;4125:43686;;;28172:7;4125:43686;;;;;;;47711:1;;-1:-1:-1;;;;;4125:43686:0;;;28207:24;;4125:43686;;28268:10;;:24;4125:43686;;;;;;;;;;;28376:15;:26;4125:43686;;;;;28483:14;4125:43686;;;;;;;;28523:11;28519:206;;4125:43686;28784:17;;;;;:::i;:::-;28829:19;28875:18;28829:19;;;:::i;:::-;28875:18;;:::i;:::-;28949:258;;;;29014:12;;:26;;;28949:258;29010:47;;28949:258;29311:26;;;;;;29355:16;;4125:43686;;;29426:5;;4125:43686;48284:217;5207:4;48284:217;;;5207:4;48284:217;;;;;;;;;;;;29400:16;;;4125:43686;;;-1:-1:-1;;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;-1:-1:-1;;;4125:43686:0;;;29520:27;;4125:43686;;;;;;;;;29520:27;47722:81;47477:225;47722:81;4125:43686;;;-1:-1:-1;;;4125:43686:0;;;;;29311:26;;;;;29010:47;29042:15;;-1:-1:-1;29010:47:0;;29014:26;29030:10;;;;29014:26;;28949:258;29139:11;;:26;;;28949:258;29135:46;28949:258;29135:46;4125:43686;;-1:-1:-1;28949:258:0;;29139:26;29154:11;;;;29139:26;;28519:206;4125:43686;28565:5;;4125:43686;28583:6;28565:14;4125:43686;;28565:14;;;:::i;:::-;4125:43686;28607:8;;28603:112;;28519:206;;;;;28603:112;28665:35;28635:12;;;4125:43686;28635:12;;:::i;28665:35::-;;4125:43686;;28665:9;-1:-1:-1;;;;;4125:43686:0;28665:35;;;;;;;;28603:112;;;;;;28665:35;;;4125:43686;28665:35;4125:43686;28665:35;;;;;;;:::i;:::-;;;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;;;;;;;;:::i;:::-;47477:225;;;;;;;;;;;;4125:43686;;;;20284:7;4125:43686;;;;;;;-1:-1:-1;;;;;4125:43686:0;;20319:24;4125:43686;;;;;;;20380:11;:40;;;;4125:43686;;;;;20455:10;;4125:43686;;20540:17;;;:::i;:::-;20594:21;;;;;:::i;:::-;20656:25;;;;;:::i;:::-;20699:8;;;;;;:19;;;4125:43686;;;;20754:11;;;4125:43686;;;;;;20821:16;20985:70;;;;;;:::i;:::-;21154:20;;;;4125:43686;;21316:54;;;:::i;:::-;5244:2;21373:1;5244:2;;;;;;;21293:81;5244:2;21359:1;5244:2;;;;;;;21388:27;21689:31;21388:27;;;;;;;21606:47;21388:27;;21384:60;;4125:43686;-1:-1:-1;21471:23:0;;;;;;:49;;21606:47;:::i;:::-;21689:31;;;:::i;:::-;21738:6;21734:55;;21471:49;21817:10;;;4125:43686;;21890:17;-1:-1:-1;4125:43686:0;;;;-1:-1:-1;;;21937:56:0;;21960:10;4125:43686;21937:56;;4125:43686;47477:225;4125:43686;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21937:9:0;4125:43686;21937:56;;;;;;;4125:43686;21937:56;;;21471:49;22003:5;;:14;4125:43686;;;22003:14;:::i;:::-;4125:43686;;22056:6;47477:225;;;22056:6;:::i;:::-;4125:43686;;;22073:11;4125:43686;;;;;22073:28;4125:43686;;;22073:28;:::i;:::-;4125:43686;;22111:4;-1:-1:-1;;;;;4125:43686:0;;22111:42;;;;;4125:43686;;-1:-1:-1;;;22111:42:0;;47477:225;4125:43686;22111:42;;4125:43686;;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;;-1:-1:-1;22111:42:0;;;;;;;;;;;;21471:49;4125:43686;;22255:70;4125:43686;;;;;;;;;;;;;22255:70;;22309:15;;22255:70;4125:43686;22255:70;;;:::i;22111:42::-;4125:43686;22111:42;;;;;4125:43686;22111:42;;;:::i;:::-;22255:70;4125:43686;22111:42;;;;;;;;4125:43686;;;;;;;;;21937:56;;;4125:43686;21937:56;4125:43686;21937:56;;;;;;;:::i;:::-;;;4125:43686;;;;;;;;;21734:55;21335:6;5244:2;;;;;21335:6;5244:2;;;21754:35;;;:::i;:::-;21734:55;;;;5244:2;;;;4125:43686;5244:2;;4125:43686;5244:2;;4125:43686;5244:2;21471:49;;;;21606:47;:::i;21384:60::-;5244:2;;21384:60;;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;20699:19;20711:7;;;;20699:19;;4125:43686;;;;;;;;;;;;;;;;;;20380:40;4125:43686;;;;20395:15;:25;20380:40;;;4125:43686;;;;;;;;;47477:225;;4125:43686;47477:225;4125:43686;47477:225;;4125:43686;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;;;;;;;;;;;;:::i;:::-;5244:2;;;4125:43686;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;-1:-1:-1;;;;;4125:43686:0;;:::i;:::-;;;;6195:57;4125:43686;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1057:10;;;4125:43686;;1047:9;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1057:10;1105:41;4125:43686;1057:10;1105:41;;4125:43686;;;1163:4;4125:43686;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;-1:-1:-1;;4125:43686:0;;;;;9834:69;4125:43686;;;;;;9834:69;;:::i;:::-;9961:16;9980:5;4125:43686;9961:16;;:::i;:::-;4125:43686;9961:24;:51;;;;4125:43686;9957:79;;4125:43686;10054:15;;:::i;:::-;4125:43686;10054:20;:48;;;;;4125:43686;;;;;;;;10131:8;4125:43686;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9961:16;4125:43686;;;;;;;;;;;;;;;;;;;;;;;10274:30;4125:43686;;;;;;;;;;;;;;10274:30;4125:43686;;;;;;;;;;;10021:15;;;4125:43686;;;;;10054:48;10078:15;;4125:43686;-1:-1:-1;;;;;10078:15:0;;:::i;:::-;4125:43686;;;;10078:24;;10054:48;;;9961:51;9989:15;9980:5;4125:43686;9989:15;;:::i;:::-;4125:43686;9989:23;9961:51;;4125:43686;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;35784:17;35842:28;35784:17;35765:37;35784:17;;;:::i;35842:28::-;35888:10;;;;:22;;;4125:43686;35888:33;;;4125:43686;;;;35967:40;;;;;:::i;:::-;36078:10;;;;;:::i;:::-;36116:12;;;;:::i;:::-;36155;36337:31;36155:12;36253:48;36211:16;36155:12;;;;:::i;:::-;36211:16;;;:::i;:::-;36253:48;;;;:::i;:::-;36337:31;;;:::i;:::-;36386:6;36382:51;;4125:43686;-1:-1:-1;4125:43686:0;;;;36470:7;4125:43686;;;;;36470:21;;4125:43686;;;36514:13;;;;;;:29;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36382:51;36414:6;5244:2;;36414:6;5244:2;;;48284:217;36414:6;48284:217;;;36414:6;48284:217;;;;;;;;;;;4125:43686;48284:217;;36382:51;;;48284:217;;4125:43686;48284:217;4125:43686;48284:217;;35888:33;35914:7;;;;35888:33;;:22;35902:8;;;;35888:22;;4125:43686;;;;;;;:::i;:::-;;33690:28;33632:17;33613:37;33632:17;;;:::i;33690:28::-;33736:13;;;;:25;;;4125:43686;33736:36;;;4125:43686;;;;33877:71;;;;;:::i;:::-;34024:10;;;;;:::i;:::-;34281:31;34062:13;;;;;:::i;:::-;34102:11;34196:49;34157:16;34102:11;;;;:::i;34157:16::-;34196:49;;;;:::i;:::-;34281:31;;:::i;:::-;34330:6;34326:63;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34326:63;34370:6;5244:2;;;;;;34370:6;5244:2;;;4125:43686;34350:39;;;;:::i;:::-;34326:63;;;;33736:36;33765:7;;;;33736:36;;:25;33753:8;;;;33736:25;;4125:43686;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;4125:43686:0;;30494:4;30474:25;;30494:4;;;30602:10;:27;;:58;;;30470:526;30598:121;;30470:526;774:10;4125:43686;;764:9;4125:43686;;;;;;;;;;;;;764:35;4125:43686;;;764:35;:::i;:::-;4125:43686;;;;;764:9;4125:43686;;;;;;;;;;;;;809:33;4125:43686;;;809:33;:::i;:::-;4125:43686;;;;;774:10;4125:43686;;;;;;;;;;-1:-1:-1;;;;;;;;;;;857:54:0;4125:43686;;;;857:54;4125:43686;30598:121;30968:17;;;4125:43686;30687:17;4125:43686;;30687:17;30602:58;-1:-1:-1;30602:10:0;30655:4;-1:-1:-1;;;;;4125:43686:0;30633:27;;30602:58;;30470:526;30759:4;-1:-1:-1;;;;;4125:43686:0;30739:25;;30470:526;30735:261;30968:17;;;4125:43686;30968:17;4125:43686;;30968:17;4125:43686;;;;;;-1:-1:-1;;4125:43686:0;;;;;;44665:37;44684:17;;;:::i;44665:37::-;44721:12;;;:::i;:::-;4125:43686;;-1:-1:-1;;;44804:18:0;;4125:43686;44804:18;;4125:43686;;;;;;;;44804:18;4125:43686;44804:4;-1:-1:-1;;;;;4125:43686:0;44804:18;;;;;;;4125:43686;44804:18;4125:43686;;;;;;;;44804:18;;;4125:43686;;;;;;;44836:19;44832:143;44836:19;;;-1:-1:-1;;;;;4125:43686:0;;;;;44832:143;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;44832:143;-1:-1:-1;;;;;4125:43686:0;;;;;44832:143;;44804:18;;;;;;4125:43686;44804:18;;;;;4125:43686;44804:18;4125:43686;44804:18;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;44804:18:0;-1:-1:-1;44804:18:0;;;;;;;4125:43686;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1508:25:0;;;:54;;;;4125:43686;;;;;;;;;1508:54;-1:-1:-1;;;1537:25:0;;-1:-1:-1;1508:54:0;;;4125:43686;;;;;;-1:-1:-1;;4125:43686:0;;;;-1:-1:-1;;;;;4125:43686:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;46733:557;;;;;;4125:43686;46733:557;4125:43686;46733:557;;;4125:43686;;46733:557;;-1:-1:-1;;46733:557:0;;;;;;;;;;;;;;;;;;;;4125:43686;46733:557;8231:40;4125:43686;46733:557;;;;;;;;;;;;4125:43686;;8231:40;;;-1:-1:-1;;;4125:43686:0;8231:40;;4125:43686;;;;;;;;;;;;;;;8231:40;;46733:557;;8231:40;;;;;;:::i;4125:43686::-;;;;;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;;;;;;;-1:-1:-1;;4125:43686:0;;;;:::o;:::-;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;:::o;:::-;6002:27;4125:43686;;;;;;6002:27;-1:-1:-1;4125:43686:0;;-1:-1:-1;4125:43686:0;;;-1:-1:-1;4125:43686:0;:::o;:::-;5244:2;;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;5244:2;;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;46733:557;;4125:43686;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;4125:43686:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;4125:43686:0;;;;;-1:-1:-1;4125:43686:0;;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5244:2::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;44057:308::-;4125:43686;;;;44156:7;4125:43686;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;44187:24;44183:38;;4125:43686;;;;;44235:11;44231:25;;44270:16;;4125:43686;44270:21;44266:35;;4125:43686;;;;;;;44057:308;:::o;44318:40::-;44341:17;;;:::i;:::-;44057:308;:::o;44266:35::-;44293:8;;4125:43686;44293:8;:::o;44231:25::-;44248:8;;;4125:43686;44248:8;:::o;4125:43686::-;9961:16;4125:43686;;;;;;;;;:::o;:::-;9989:15;4125:43686;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;46733:557;4125:43686;46733:557;;4125:43686;;:::i;:::-;;;;;;;;:::o;:::-;-1:-1:-1;;4125:43686:0;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;41974:2077::-;;;;42426:10;4125:43686;42457:12;;;;;42453:315;;42792:13;;;;:::i;:::-;42819:9;;;;42815:24;;41974:2077;42861:11;;;;:::i;:::-;42892:16;;;;:::i;:::-;42926;;;;:::i;:::-;42966;;;;:::i;:::-;43005;;;;:::i;:::-;43044;;;;:::i;:::-;43083:13;;;;:::i;:::-;43121;;;;:::i;:::-;43255:9;;4125:43686;43255:9;;;43266:6;;;;;;44023:21;;;;;;;;44024:9;;44023:21;44024:9;;;41974:2077;:::o;44023:21::-;;4125:43686;41974:2077;:::o;43274:3::-;43587:20;43310:9;;;;43299:21;43310:9;;;;:::i;:::-;43299:21;:::i;:::-;4125:43686;;;;;;43340:12;43441:14;43340:12;;;:::i;:::-;4125:43686;;;;;;43385:7;4125:43686;;;43412:15;4125:43686;;;;43412:15;;:::i;:::-;4125:43686;43441:14;:::i;:::-;4125:43686;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43552:21;;;:::i;43587:20::-;4125:43686;;;;;43652:19;4125:43686;;;;;;43652:19;;:::i;:::-;4125:43686;;;;;;;-1:-1:-1;;;;;4125:43686:0;;43704:24;;;;:32;;43274:3;43704:61;;;;;;43274:3;43685:81;;;:::i;:::-;4125:43686;;;;;43781:215;;43274:3;;;;;;;;:::i;:::-;43255:9;;;;;;;43781:215;43822:16;;4125:43686;;;;;;;;;43885:23;;43943:8;;;43942:39;43274:3;43942:39;;4125:43686;43942:39;43926:55;;;;:::i;:::-;4125:43686;43781:215;;;;;43942:39;48284:217;;;;;;;;;;;5207:4;48284:217;;;;5207:4;43274:3;48284:217;;43942:39;;43885:23;;;;;43704:61;4125:43686;;;;43740:15;:25;;-1:-1:-1;43704:61:0;;:32;;;;;;42815:24;42830:9;;;42815:24;;;42453:315;4125:43686;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;42485:272;;;;;;;4125:43686;42485:272;:::o;7432:149::-;4125:43686;;7532:40;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;;7532:40;;;;;;:::i;:::-;4125:43686;7522:51;;7432:149;:::o;8435:1090::-;;;;;;;;-1:-1:-1;;;;;4125:43686:0;8694:15;;8686:23;;4125:43686;;;8764:1;;-1:-1:-1;;;;;4125:43686:0;;;8744:22;;4125:43686;;8808:34;;;;;:::i;:::-;8859:17;;;;:::i;:::-;8764:1;4125:43686;;;8894:7;4125:43686;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;8982:216;;4125:43686;8764:1;4125:43686;;;;8982:216;;8764:1;4125:43686;;8982:216;;;4125:43686;;;;;8982:216;;;4125:43686;;;8982:216;;;4125:43686;8764:1;4125:43686;;8982:216;;;4125:43686;8764:1;4125:43686;;8764:1;4125:43686;8894:7;4125:43686;;;8764:1;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8982:216;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;;-1:-1:-1;;;4125:43686:0;;;;;;-1:-1:-1;;;;;;4125:43686:0;;;;;;;;;;;;;;;9209:10;4125:43686;;;;;;;;;;;;9209:10;4125:43686;;:::i;:::-;;;;;;;;;;46733:557;;;4125:43686;;;;;;;;8764:1;4125:43686;9244:12;4125:43686;;;8764:1;4125:43686;;;;;;;;;;;;;;;:::i;:::-;;;;;;8435:1090;4125:43686;8764:1;4125:43686;;;;;;;;8982:216;4125:43686;;;;;9296:46;4125:43686;8764:1;4125:43686;;;;;;;;46733:557;;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;8764:1;4125:43686;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;9296:46;;;;9357:12;;;;;:27;;;4125:43686;9353:166;;4125:43686;8435:1090;;;;;;;:::o;9353:166::-;9408:27;;;9353:166;4125:43686;;;10460:17;;;:::i;:::-;10514:21;;;;;:::i;:::-;10644:4;10658:7;10644:4;;;10658:7;:::i;:::-;4125:43686;8764:1;4125:43686;10676:11;4125:43686;;;8764:1;4125:43686;10676:29;4125:43686;;;10676:29;:::i;:::-;4125:43686;;10742:6;10644:4;;;10742:6;:::i;:::-;8764:1;4125:43686;10676:11;4125:43686;;;8764:1;4125:43686;10759:27;4125:43686;;;10759:27;:::i;:::-;4125:43686;;;;;10825:16;;;;;10824:58;;;10892:4;-1:-1:-1;;;;;4125:43686:0;;10892:40;;;;;4125:43686;;-1:-1:-1;;;10892:40:0;;10644:4;10892:40;;;4125:43686;;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;;-1:-1:-1;10892:40:0;;;;;;;;;10824:58;10970:7;4125:43686;10970:7;;4125:43686;;10942:40;;;;;4125:43686;;-1:-1:-1;;;10942:40:0;;10644:4;10892:40;10942;;4125:43686;;;;;;;;;;;;;;;;;;;;10942:40;;;;;;;;;;;;;10824:58;-1:-1:-1;4125:43686:0;;;-1:-1:-1;;;11051:68:0;;4125:43686;;10892:40;11051:68;;4125:43686;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;8982:216;4125:43686;;;;;;;;;;;;;;;;;;;;;;;11051:68;;4125:43686;;;;;;;;;;;;;;;;;;;;;;;10644:4;4125:43686;;;;8694:15;4125:43686;;;;11051:68;;;;;;;;8764:1;;;;11051:68;;;10824:58;11134:10;;;11130:211;;10824:58;11354:10;;11350:211;;10824:58;4125:43686;;;;;8982:216;4125:43686;;;11674:38;4125:43686;;;;;;;11608:16;11607:52;;;;;;;;4125:43686;;;;;;;;;;;;;11674:38;9353:166;;;;;;;;11607:52;;;11350:211;4125:43686;11394:67;4125:43686;;;;;;;;;;;;;;;11394:67;;10644:4;;;10892:40;11394:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;11350:211;4125:43686;11674:38;4125:43686;;;;;11505:3;8982:216;4125:43686;;;;;;10644:4;11505:3;:::i;:::-;4125:43686;;;10676:11;4125:43686;;11523:27;4125:43686;;;;;;11523:27;:::i;:::-;4125:43686;;11350:211;;;;;;;;;;;;;11394:67;;;;;;;4125:43686;11394:67;;;;;;4125:43686;11394:67;;;;;;4125:43686;11394:67;;;:::i;:::-;;;4125:43686;;;;;;;;11394:67;;;;;;;4125:43686;11674:38;11394:67;;;;;-1:-1:-1;11394:67:0;;;4125:43686;;;;;;;;;11130:211;4125:43686;;11174:67;4125:43686;;;;;;;;;;;;;;11174:67;;10644:4;;;10892:40;11174:67;;;:::i;:::-;;;;;;;;;;;;;;11130:211;4125:43686;11285:3;4125:43686;;;10644:4;11285:3;:::i;:::-;4125:43686;;;;10676:11;4125:43686;;11303:27;4125:43686;;;;;;11303:27;:::i;:::-;4125:43686;;11130:211;;11174:67;;;4125:43686;11174:67;;4125:43686;11174:67;;;;;;4125:43686;11174:67;;;:::i;:::-;;;4125:43686;;;;;11174:67;;;;;;-1:-1:-1;11174:67:0;;11051:68;;;;;;;8982:216;11051:68;;8982:216;11051:68;;;;;;8982:216;11051:68;;;:::i;:::-;;;4125:43686;;;;;;;;;;;;;;;11051:68;;;;;;;4125:43686;;;;11051:68;;;-1:-1:-1;11051:68:0;;10942:40;;;;;;;;;:::i;:::-;4125:43686;;10942:40;;;;;;4125:43686;;;;10892:40;;;;;8764:1;10892:40;;:::i;:::-;8764:1;10892:40;;;;10824:58;;;;4125:43686;;;;8764:1;4125:43686;;8764:1;4125:43686;9408:27;9424:11;;;;9408:27;;9357;9373:11;;;;9357:27;;4125:43686;;;;;;;;;;46733:557;;;;;;;;4125:43686;;;8764:1;4125:43686;;8764:1;4125:43686;;8764:1;4125:43686;;;;;;;;8982:216;4125:43686;;;9296:46;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4125:43686:0;;;;;;;;;;;46733:557;;4125:43686;;;;;;;;;;;;;;;;-1:-1:-1;4125:43686:0;;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;8764:1;4125:43686;;8764:1;4125:43686;;;;9209:10;4125:43686;;;;;;;;;;;;;;;;;;;;;9209:10;4125:43686;;;;;;;;;;;;;8764:1;4125:43686;;;;-1:-1:-1;4125:43686:0;;-1:-1:-1;4125:43686:0;;;;;;;-1:-1:-1;4125:43686:0;;;;;;;;8764:1;4125:43686;;8764:1;4125:43686;;;;;8764:1;4125:43686;;8764:1;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;;;;;;;:::o;:::-;-1:-1:-1;;;;;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;5244:2;;;4125:43686;;;;;;;;7202:224;;;4125:43686;;7363:54;7202:224;4125:43686;;7363:54;;;;;;;4125:43686;-1:-1:-1;;;4125:43686:0;;;;;;;;;;;;;;;;;;;7363:54;;;;;;;;;;;:::i;38972:2996::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39736:10;4125:43686;39736:17;;39767:12;;;;;;39763:582;;40369:13;;;;;;:::i;:::-;40355:27;;40396:9;;;;;40392:24;;38972:2996;40438:11;;;;;;:::i;:::-;;;40472:16;;;;:::i;:::-;40460:28;;40512:16;;;;:::i;:::-;40498:30;;40551:16;;;;:::i;:::-;40538:29;;40589:16;;;;:::i;:::-;40577:28;;40626:13;;;;:::i;:::-;40615:24;;40659:13;;;;:::i;:::-;40649:23;;40688:16;;;;:::i;:::-;40682:22;;40731:16;;;;:::i;:::-;40714:33;;4125:43686;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;46733:557;;4125:43686;;;;:::i;:::-;;;;;;;;;40757:23;;;;;40799:15;;;;:::i;:::-;40790:24;;40836:13;;;;:::i;:::-;40824:25;;40869:16;;;;:::i;:::-;40859:26;;40904:16;;;;:::i;:::-;40895:25;;40943:16;;;;:::i;:::-;40930:29;;40982:16;;;;:::i;:::-;40969:29;;4125:43686;41057:9;;41068:6;;;;;;;;-1:-1:-1;41941:9:0;;;;;;;;41940:21;;38972:2996;:::o;41940:21::-;4125:43686;38972:2996;:::o;41076:3::-;41100:21;41111:9;;;;;;:::i;41100:21::-;4125:43686;;;;;;;;;;;;41154:7;4125:43686;;;;;;;41179:17;;;;;;:::i;:::-;4125:43686;;;;;41227:11;4125:43686;;;;;;41210:32;;;;;;:::i;:::-;4125:43686;41263:11;;;;:::i;:::-;4125:43686;;;;41227:11;4125:43686;;;;;;41288:33;;;;;;:::i;:::-;4125:43686;41496:16;4125:43686;;;;;;;;;;41335:25;;;;;;:::i;:::-;4125:43686;41374:24;;;;;;:::i;:::-;4125:43686;;;;;;;;;41412:22;;;;;;:::i;:::-;4125:43686;;;;;;;;;41457:5;;;4125:43686;41448:14;;;;;;:::i;:::-;4125:43686;41496:16;4125:43686;41476:36;;;;;;:::i;:::-;4125:43686;;;;;41537:12;4125:43686;;;;;;;:::i;:::-;41526:27;;;;;:::i;:::-;;;;;;;:::i;:::-;;4125:43686;;;41567:19;;;;;;:::i;:::-;4125:43686;41600:25;;;;;;:::i;:::-;4125:43686;;;;;;;;;;-1:-1:-1;;;;;4125:43686:0;41640:273;;41076:3;;;;;;:::i;:::-;;;41057:9;;41640:273;41777:22;;;;41715:18;;41777:22;41715:18;:::i;41777:22::-;41751:48;;;;;;:::i;:::-;4125:43686;41751:48;;;;;;:::i;:::-;4125:43686;41833:9;;;;;;:::i;:::-;4125:43686;41817:25;;;;;;:::i;:::-;4125:43686;41876:22;:10;;;;;;:::i;:::-;4125:43686;41889:9;;;;;;:::i;:::-;4125:43686;41876:22;;:::i;:::-;41860:38;;;;;;:::i;:::-;4125:43686;41640:273;;;4125:43686;;;;;;;;;;;;;40392:24;40407:9;;;;40392:24;;39763:582;4125:43686;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4125:43686:0;;-1:-1:-1;4125:43686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;39795:539;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4125:43686;39795:539;:::o;4125:43686::-;;;;;;;;;;;;7587:371;-1:-1:-1;4125:43686:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;7721:12;;;7720:46;7721:12;;;7720:46;;4125:43686;;;;;;:::i;:::-;;;;7780:171;;4125:43686;7868:4;4125:43686;7780:171;;4125:43686;7868:4;4125:43686;7780:171;;4125:43686;5244:2;4125:43686;7780:171;;4125:43686;7587:371;:::o;7720:46::-;;;7964:175;4125:43686;;8091:5;;;;4125:43686;;;;;;;8098:8;;;4125:43686;;;8118:11;4125:43686;;;;;8108:8;;;4125:43686;;8118:11;;4125:43686;;8098:8;4125:43686;8073:57;8091:5;8073:57;;4125:43686;;;8098:8;4125:43686;;;8108:8;4125:43686;;;8118:11;4125:43686;;;;;;;;8073:57;;;;;;:::i;45365:400::-;;;45560:12;;;:::i;:::-;4125:43686;;-1:-1:-1;;;45549:24:0;;;;;4125:43686;;;;;;;45549:24;4125:43686;45549:4;-1:-1:-1;;;;;4125:43686:0;45549:24;;;;;;;-1:-1:-1;;;45549:24:0;;;45365:400;-1:-1:-1;4125:43686:0;45587:16;;;-1:-1:-1;;;;;4125:43686:0;;;;;45583:176;45365:400::o;45583:176::-;-1:-1:-1;;;;;4125:43686:0;;;;;;45365:400::o;45549:24::-;;;;;;;;4125:43686;45549:24;4125:43686;45549:24;;;;;;;:::i;:::-;;;;;;;;;;;;;45771:394;;;45950:14;;45946:28;;46004:21;;;;:::i;:::-;4125:43686;46028:5;4125:43686;;;;;;46028:5;4125:43686;;;;;;;46066:22;;;:::i;:::-;5244:2;46065:43;4125:43686;;;;;;;;;;;;;;46130:23;;;:::i;:::-;46157:1;5244:2;;;;;;;45771:394;:::o;:::-;;;45950:14;;45946:28;;46004:21;;;;:::i;:::-;4125:43686;46028:5;4125:43686;;;;;;46028:5;4125:43686;;;;;;;46066:22;;;:::i;:::-;5244:2;46028:5;5244:2;;46028:5;5244:2;;;;46130:23;46065:43;;;;:::i;:::-;46130:23;;:::i;45946:28::-;45966:8;;;;4125:43686;45966:8;:::o;12485:896::-;13306:21;12485:896;13306:16;13346:28;12485:896;;13195:36;12665:27;12681:10;;;;:::i;:::-;12665:27;;:::i;:::-;4125:43686;13214:16;13161:11;12952:36;4125:43686;;;12971:16;12915:12;12874:14;12806:40;5244:2;12806:40;;;;:::i;:::-;12874:14;;;:::i;:::-;12915:12;;;:::i;:::-;12971:16;;;:::i;:::-;12952:36;;:::i;:::-;13054:39;13121:13;13054:39;;5244:2;13054:39;;;;:::i;:::-;13121:13;;:::i;:::-;13161:11;;:::i;13195:36::-;4125:43686;12778:1;4125:43686;13306:16;;:::i;:::-;:21;:::i;:::-;13346:28;;:::i;16072:1118::-;;;;4125:43686;;;;;16231:8;4125:43686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16264:34;;4125:43686;16263:59;16259:73;;16384:469;;16072:1118;4125:43686;;;;;;;16863:321;;16072:1118;;;:::o;16863:321::-;16917:10;;;;:::i;:::-;16945:8;;16941:233;;16072:1118;;;:::o;16941:233::-;48284:217;17001:4;48284:217;;;;;;;17001:4;48284:217;;;;;;;;;;;;17052:4;17044:12;;17052:4;;;-1:-1:-1;;5244:2:0;;;;;;;4125:43686;17052:4;17044:46;;;4125:43686;;48284:217;;;;;;;;;;;;;;;17052:4;17108:51;48284:217;;17108:51;;:::i;17044:46::-;17052:4;5244:2;17052:4;5244:2;;;;4125:43686;17052:4;17044:46;;;;16384:469;4125:43686;;;;16443:7;4125:43686;;;;;;;;;;;;;;;;;16491:26;;;;;16490:62;-1:-1:-1;;;;;4125:43686:0;16490:62;4125:43686;;16570:15;:26;;;4125:43686;;;;16616:23;4125:43686;;;16616:23;;:::i;:::-;16566:277;;16384:469;;;;;16566:277;16570:15;;;;;;;;16664:23;16660:183;;16566:277;;;;;;16660:183;16570:15;4125:43686;16774:35;16773:55;16570:15;4125:43686;16725:23;16766:62;16570:15;;;;16725:23;:::i;:::-;4125:43686;;;16774:35;:::i;:::-;4125:43686;;;16773:55;;:::i;:::-;16766:62;;:::i;:::-;16660:183;;;;;;16490:62;4125:43686;;-1:-1:-1;;;;;4125:43686:0;;;;-1:-1:-1;;;;;16490:62:0;;;16259:73;-1:-1:-1;4125:43686:0;;-1:-1:-1;;;;;;;16324:8:0:o;48505:333::-;48587:249;;;;;;;;;;;34370:6;48587:249;;;;34370:6;48587:249;;;;;;;;48505:333;:::o;:::-;21335:6;5244:2;48587:249;;;5244:2;48587:249;;;;;;;;;;;21335:6;48587:249;;;;;;;;48505:333;:::o;:::-;48587:249;;;;;;;;;;;4125:43686;48587:249;;;;4125:43686;48587:249;;;;;;;;48505:333;:::o;46171:406::-;;5244:2;46373:27;4125:43686;;;;;;;;;;;;;;46430:28;;;;:::i;:::-;4125:43686;46385:5;4125:43686;;;;;;46385:5;4125:43686;;;;;;;46547:23;46490:35;;;;:::i;46171:406::-;;;;46385:5;5244:2;;46385:5;5244:2;;;;46430:28;46373:27;;;;:::i;:::-;46430:28;;;:::i;14300:925::-;;14555:10;;;;:::i;:::-;48284:217;14549:4;48284:217;;;;14549:4;48284:217;;;;;;;;;;;4125:43686;;;14698:40;14865:16;14806:13;14766;14698:40;5244:2;14698:40;;;;:::i;:::-;14766:13;;;:::i;:::-;14806;;;:::i;:::-;14865:16;;;:::i;:::-;48284:217;;14549:4;48284:217;;;14549:4;48284:217;;;;;;;;;;;15032:12;14926:39;14993:12;14926:39;;5244:2;14926:39;15088:16;14926:39;;;:::i;:::-;14993:12;;:::i;:::-;15032;;:::i;:::-;15088:16;;;:::i;:::-;48284:217;;14549:4;48284:217;;;14549:4;48284:217;;;;;;;;;;;15209:8;48284:217;15150:21;48284:217;15150:16;48284:217;;;;14669:1;4125:43686;48284:217;;15150:16;:::i;:21::-;48284:217;;;;;;;;;;;;;;;;15209:8;48284:217;;14300:925;:::o;13413:853::-;14232:27;13413:853;;14192:16;:21;13413:853;14130:37;13651:28;13668:10;;;;:::i;13651:28::-;4125:43686;14150:16;14095:12;13911:37;4125:43686;;;13931:16;13873:13;13832;13765:40;5244:2;13765:40;;;;:::i;13873:13::-;13931:16;;;:::i;1575:197::-;-1:-1:-1;;;;;;;;;;;1711:54:0;-1:-1:-1;1575:197:0;;;;4125:43686;;;;;;;;;;1663:9;4125:43686;;;;;;;;;;;;;1663:33;4125:43686;;;1663:33;:::i;1711:54::-;;;;1575:197::o;1778:191::-;;-1:-1:-1;;;;;;;;;;;1910:52:0;-1:-1:-1;1778:191:0;;4125:43686;;;;;;;;;;1864:9;4125:43686;;;;;;;;;;;;;1864:31;4125:43686;;;1864:31;:::i;45101:258::-;4125:43686;-1:-1:-1;4125:43686:0;45183:11;4125:43686;;;-1:-1:-1;4125:43686:0;;45255:4;-1:-1:-1;4125:43686:0;45237:9;4125:43686;;;-1:-1:-1;4125:43686:0;;-1:-1:-1;4125:43686:0;;;;-1:-1:-1;4125:43686:0;;;;;;;;;;45316:4;4125:43686;-1:-1:-1;4125:43686:0;45237:9;4125:43686;;;-1:-1:-1;4125:43686:0;;-1:-1:-1;4125:43686:0;;;;-1:-1:-1;4125:43686:0;;;;45101:258;:::o;15258:808::-;15501:10;;;;:::i;:::-;48284:217;15495:4;48284:217;;;;15495:4;48284:217;;;;;;;;;;;4125:43686;;;15576:40;15744:16;15683:14;15643:12;15576:40;5244:2;15576:40;;;;:::i;15683:14::-;15744:16;;;:::i;:::-;48284:217;;15495:4;48284:217;;;15495:4;48284:217;;;;;;;;;;;15892:13;15789:38;15854:10;15789:38;;5244:2;15789:38;15950:16;15789:38;;;:::i;15892:13::-;15950:16;;;:::i;12306:146::-;48284:217;5207:4;48284:217;;;5207:4;48284:217;;;;;;;;;;;;12306:146;:::o

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.